Почему не работает программно добавленная команда на кнопке в управляемой форме 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При динамической доработке управляемых форм разработчики нередко сталкиваются с ситуацией: команда и кнопка создаются программным кодом без ошибок, кнопка успешно отображается в интерфейсе, однако при нажатии на нее ничего не происходит. Разберем по шагам, почему возникает такое поведение, какие требования предъявляет платформа 1С:Предприятие 8.3 к обработчикам команд и как решить задачу без снятия конфигурации с поддержки.

Анализ проблемы: почему кнопка не реагирует на нажатие

Рассмотрим типовой пример программного создания команды и кнопки на управляемой форме:


НоваяКоманда = ЭтаФорма.Команды.Добавить("ПечатьОтгрузочныхДокументов");
НоваяКоманда.Действие = "ПечатьОтгрузочныхДокументов";

НовыйЭлемент = ЭтаФорма.Элементы.Добавить("КнопкаПечатьОтгрузочныхДокументов", Тип("КнопкаФормы"), ЭтаФорма.Элементы.КоманднаяПанельФормы);
НовыйЭлемент.ИмяКоманды = "ПечатьОтгрузочныхДокументов";

Выясним причину, по которой действие может игнорироваться платформой. Ключевая особенность заключается в строгом механизме привязки свойства Действие:

  1. Местоположение процедуры: Процедура, указанная в свойстве Действие, обязательно должна находиться непосредственно в модуле этой же управляемой формы. Указать имя метода общего модуля, функции объекта или внешнего модуля напрямую через строковое имя нельзя.
  2. Контекст выполнения (директива компиляции): Обработчик команды формы всегда вызывается на клиенте. Процедура в модуле формы должна быть объявлена с директивой &НаКлиенте (или без директивы в контексте тонкого клиента). Если процедура объявлена как &НаСервере или &НаСервереБезКонтекста, платформа не сможет вызвать ее в качестве прямого действия команды.
  3. Ограничения генерации кода «на лету»: Платформа 1С не позволяет динамически внедрять исполняемый код метода в модуль формы во время работы пользовательского сеанса. Процедура-обработчик должна существовать в скомпилированном модуле формы заранее.

Таким образом, для работоспособности кода в модуле формы обязательно должна присутствовать клиентская процедура с соответствующим именем:


&НаКлиенте
Процедура ПечатьОтгрузочныхДокументов(Команда)
    // Алгоритм обработки нажатия кнопки
    ПоказатьОповещениеПользователя("Команда выполнена успешно!");
КонецПроцедуры

Как реализовать задачу без изменения типовой конфигурации

Если конфигурация находится на поддержке, прямое добавление процедур в модуль типовой формы нежелательно, так как это усложняет последующие обновления. Рассмотрим альтернативные способы реализации требуемого функционала.

Способ 1. Использование механизма расширений конфигурации (рекомендуемый)

Механизм расширений позволяет дорабатывать формы и модули без снятия основной конфигурации с замка. Разберем по шагам, как добавить команду и кнопку с помощью расширения:

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

Преимущество расширения заключается в том, что при обновлении типовой конфигурации платформа автоматически сохраняет заимствованную форму и привязку добавленных элементов.

Способ 2. Подключаемые команды и внешние печатные формы (БСП)

Если конфигурация создана на базе Библиотеки стандартных подсистем (БСП), внедрение произвольных команд печати или обработки данных часто вообще не требует изменения формы документа:

  1. Регистрация команд в модуле менеджера: Для объектов конфигурации команды печати описываются в процедуре ДобавитьКомандыПечати модуля менеджера. БСП автоматически выводит кнопки в стандартное подменю «Печать».
  2. Внешние печатные формы: Если функционал подключается как дополнительная обработка через справочник ДополнительныеОтчетыИОбработки, платформа и БСП берут на себя отображение кнопки без модификации метаданных конфигурации.
  3. Управление видимостью: Механизм подключаемых команд БСП поддерживает структуру УсловияВидимости, позволяя гибко управлять отображением кнопки в зависимости от значений реквизитов (например, проводить проверку статуса документа или признака проведения) без написания ручного кода скрытия элементов на форме.

Управление динамической видимостью кнопки

Если кнопка создана программно и требуется управлять ее отображением в зависимости от состояния документа, используйте свойство Видимость элемента формы:


&НаКлиенте
Процедура ОбновитьВидимостьКнопок()
    // Проверяем состояние реквизитов объекта на клиенте
    Элементы.КнопкаПечатьОтгрузочныхДокументов.Видимость = Объект.Проведен И Не Объект.ПометкаУдаления;
КонецПроцедуры

Вызов такой процедуры целесообразно размещать в обработчиках ПослеЗаписи, ПриЧтенииНаСервере или в событиях изменения ключевых реквизитов формы, избегая лишних серверных вызовов при простом переключении видимости.

← На главную