Добавляем подменю со статусами в командную панель
Теги: 1С,Управляемое приложение,УТ11,УФ

# Код реализации

```1c
#Область  ОбработчикиСобытий

 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ДобавитьЭлементыНаФорму();
КонецПроцедуры

#КонецОбласти

#Область  ВспомогательныеПроцедурыИФункции

&НаСервере
Процедура ДобавитьЭлементыНаФорму()

	// 1.0. Добавляем на форму группу с видом Подменю: "__ГруппаСтатус";
	Если Элементы.Найти("__ГруппаСтатус") = Неопределено Тогда
		НоваяГруппа = Элементы.Добавить("__ГруппаСтатус", Тип("ГруппаФормы"), ЭтотОбъект.КоманднаяПанель);
		НоваяГруппа.Заголовок = "Установить статус";
		НоваяГруппа.Вид = ВидГруппыФормы.Подменю;

		НоваяГруппа.ЦветРамки = WebЦвета.Черный;
		НоваяГруппа.ЦветФона = Новый Цвет(81, 103, 188);
		НоваяГруппа.ЦветТекстаЗаголовка = WebЦвета.Белый;

		НоваяГруппа.ШрифтЗаголовка = Новый Шрифт(, , Истина, , , , );
	КонецЕсли;

	//Элементы.Переместить(Элементы.__ГруппаСтатус, ЭтотОбъект.КоманднаяПанель, ЭтотОбъект.КоманднаяПанель.ПодчиненныеЭлементы.ФормаОбновить);
	// 1.1. Добавляем реквизит формы "__АдресВоВременномХранилище" (соответствие ИмяКоманды --- СсылкаНаЭлементСправочникаСтатусыКлиентов);
	//Для хранения адреса во временном хранилище, где хранится соответствие "ИмяКоманды, СсылкаНаЭлементСправочникаСтатусыКлиентов"
	Если Элементы.Найти("__АдресВременногоХранилища") = Неопределено Тогда
		ТипСтрока = Новый ОписаниеТипов("Строка");
		РеквизитТекст = Новый РеквизитФормы("__АдресВременногоХранилища", ТипСтрока);
		ДобавляемыеРеквизиты = Новый Массив;
		ДобавляемыеРеквизиты.Добавить(РеквизитТекст);
		ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	КонецЕсли;

	//1.2. Получаем статусы заказов поставщиков;
	// Справочник ---	СтатусыКлиентов;
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	СтатусыКлиентов.Ссылка КАК Ссылка,
		|	СтатусыКлиентов.Наименование КАК Наименование
		|ИЗ
		|	Справочник.СтатусыКлиентов КАК СтатусыКлиентов";

	РезультатЗапроса = Запрос.Выполнить();

	Выборка = РезультатЗапроса.Выбрать();

	СоответствиеИменКомандСсылок = Новый Соответствие;

	Пока Выборка.Следующий() Цикл

		НаименованиеСтатусаБезПробелов = СокрЛП(СтрЗаменить(Выборка.Наименование, " ", ""));

		//1.3. Создаем команду;
		Если Команды.Найти("__УстановитьСтатус" + НаименованиеСтатусаБезПробелов) = Неопределено Тогда
			НоваяКоманда = Команды.Добавить("__УстановитьСтатус" + НаименованиеСтатусаБезПробелов);
			НоваяКоманда.Действие = "ИзменитьСтатус";
		КонецЕсли;

		//1.4. Создаем элемент формы;
		Если Элементы.Найти("__ИзменитьСтатус" + НаименованиеСтатусаБезПробелов) = Неопределено Тогда
			НоваяКнопка = Элементы.Добавить("__ИзменитьСтатус" + НаименованиеСтатусаБезПробелов, Тип("КнопкаФормы"), Элементы.__ГруппаСтатус);
			НоваяКнопка.ИмяКоманды = "__УстановитьСтатус" + НаименованиеСтатусаБезПробелов;
			НоваяКнопка.Заголовок = Выборка.Наименование;
		КонецЕсли;

		СоответствиеИменКомандСсылок.Вставить("__УстановитьСтатус" + НаименованиеСтатусаБезПробелов, Выборка.Ссылка);

	КонецЦикла;

	//1.5.  Сохраняем во временное хранилище СоответствиеИменКомандСсылок;
	НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор();
	АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(СоответствиеИменКомандСсылок, НовыйУникальныйИдентификатор);
	//1.6. Записываем адрес во временном хранилище в реквизит формы;
	ЭтотОбъект.__АдресВременногоХранилища = АдресВоВременномХранилище;

КонецПроцедуры // ДобавитьЭлементыНаФорму()

&НаКлиенте
Процедура ИзменитьСтатус(Команда)

	ВыбранныеКлиенты = Элементы.Список.ВыделенныеСтроки;
	Если ВыбранныеКлиенты <> Неопределено Тогда
		//1.7. Получаем из временного хранилища СоответствиеИменКомандСсылок;
		СоответствиеИменКомандСсылок = ПолучитьИзВременногоХранилища(ЭтотОбъект.__АдресВременногоХранилища);
		//1.8. Получаем выбранный статус;
		ВыбранныйСтатус = СоответствиеИменКомандСсылок.Получить(Команда.Имя);
		ИзменитьСтатусНаСервере(ВыбранныйСтатус, ВыбранныеКлиенты);
	КонецЕсли;
	//1.9. Оповещаем списки об изменении;
	ОповеститьОбИзменении(Тип("СправочникСсылка.СтатусыКлиентов"));

КонецПроцедуры

&НаСервере
Процедура ИзменитьСтатусНаСервере(ВыбранныйСтатус, ВыбранныеКлиентыМассив)

	Для каждого ТекущийКлиент Из ВыбранныеКлиентыМассив Цикл
		Если ТекущийКлиент.СтатусКлиента = ВыбранныйСтатус Тогда
			Продолжить;
		КонецЕсли;

		ОбъектКлиент = ТекущийКлиент.ПолучитьОбъект();
		ОбъектКлиент.СтатусКлиента = ВыбранныйСтатус;
		ОбъектКлиент.Записать();

	КонецЦикла;

КонецПроцедуры

#КонецОбласти
```

# Примечания

- Хорошо бы скрин ))