В процессе разработки на управляемых формах часто возникает задача создания динамического интерфейса. Одной из частых проблем является необходимость формирования набора кнопок (например, вариантов отчетов или печатных форм), состав которых определяется в процессе работы программы. Давайте разберем, как реализовать такую логику корректно, избегая ошибок позиционирования и проблем с контекстом исполнения.
Если вам нужно создать несколько кнопок, которые выполняют однотипную логику, но требуют идентификации того, какая именно кнопка была нажата, создание кнопок «вручную» через конструктор не подойдет. Наиболее надежным подходом является программная генерация команд.
Разберем это по шагам:
Команда, ссылающуюся на этот единый обработчик.Команда, который вызвал действие. Через свойства Имя или Заголовок вы легко определите, какая именно кнопка была нажата.Пример программного добавления команды на форму:
Команда = ЭтаФорма.Команды.Добавить("КнопкаВарианта1");
Команда.Действие = "ОбработкаНажатияКнопки";
Кнопка = Элементы.Добавить("КнопкаВарианта1", Тип("КнопкаФормы"), Элементы.ГруппаКнопок);
Кнопка.Команда = "КнопкаВарианта1";
В процедуре-обработчике ОбработкаНажатияКнопки(Команда) вы сможете проанализировать Команда.Имя и выполнить соответствующий алгоритм.
Часто возникает желание использовать ПоказатьВыборИзМеню для создания выпадающих списков. Основная сложность здесь заключается в привязке меню к элементу управления. Если привязка происходит к элементу внутри командной панели, платформа может выдать ошибку или отобразить меню некорректно (сместить его к левому краю).
Если вам требуется организовать выбор варианта действия, воспользуйтесь следующим подходом:
Используйте метод ПоказатьВыборИзМеню, передавая в него описание оповещения и список значений. Для корректного позиционирования меню лучше всего привязываться не к кнопкам панели, а к отдельному элементу управления (например, декорации или кнопке, вынесенной за пределы стандартной командной панели).
СписокДляВыбора = Новый СписокЗначений;
СписокДляВыбора.Добавить(0, "Вариант 1");
СписокДляВыбора.Добавить(1, "Вариант 2");
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеВыбора", ЭтотОбъект);
ПоказатьВыборИзМеню(ОписаниеОповещения, СписокДляВыбора, Элементы.МояКнопкаВыбора);
В современных версиях платформы 1С для управления сложными группами действий лучше всего подходит Группа команд с видом «Подменю». Это избавляет от необходимости бороться с позиционированием меню.
Преимущества данного подхода:
ПриСозданииНаСервере или при обновлении состава вариантов).Рекомендуем при формировании списков вариантов СКД или печатных форм создавать отдельную подгруппу внутри командной панели и динамически наполнять её командами. Это позволяет гибко управлять настройками, вытаскивая их из ХранилищаВариантовОтчетов, и не перегружать интерфейс лишними элементами, пока пользователь не нажмет на соответствующее подменю.
Важное замечание: всегда учитывайте, что динамическое пересоздание элементов формы требует корректной очистки старых элементов перед добавлением новых, чтобы избежать дублирования команд при повторном открытии или обновлении формы.