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