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

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

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

Ограничение платформы: почему не работает прямое указание метода общего модуля

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


НоваяКоманда = ЭтаФорма.Команды.Добавить("МояКоманда");
НоваяКоманда.Действие = "МойОбщийМодульКлиент.МояЭкспортнаяПроцедура";
НоваяКоманда.Заголовок = "Выполнить действие";

При таком подходе при нажатии на кнопку ничего не происходит, либо возникает ошибка выполнения. Выясним причину такого поведения.

Согласно синтакс-помощнику платформы 1С:Предприятие, свойство команды Действие принимает исключительно строку с именем экспортной или неэкспортной клиентской процедуры с директивой &НаКлиенте, расположенной строго в модуле самой формы. Платформа не поддерживает конструкции вида ИмяОбщегоМодуля.ИмяПроцедуры в свойстве Действие команды управляемой формы.

Таким образом, для вызова логики общего модуля в контексте формы обязательно требуется клиентский обработчик-посредник в модуле этой формы:


&НаКлиенте
Процедура МояКоманда(Команда)
    МойОбщийМодульКлиент.МояЭкспортнаяПроцедура(ЭтотОбъект);
КонецПроцедуры

Если напрямую вносить изменения в типовую форму нежелательно, рассмотрим типовые и бесконфликтные способы решения задачи.

Способ 1. Использование расширения конфигурации

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

Разберем по шагам, как это реализовать:

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

При таком подходе типовая конфигурация остается полностью на поддержке, а изменения изолированы внутри расширения.

Способ 2. Ввод на основании через внешнюю обработку БСП («Создание связанных объектов»)

Если задача заключается в том, чтобы ввести документ «Б» на основании документа «А», и оба документа типовые, нет необходимости модифицировать форму вообще. Библиотека стандартных подсистем (БСП) предоставляет готовый механизм «Создание связанных объектов» через справочник ДополнительныеОтчетыИОбработки.

Рассмотрим пример создания внешней обработки для ввода на основании:

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

После регистрации кнопка создания нового документа автоматически появится в стандартном подменю «Создать на основании» как в форме самого документа, так и в его динамическом списке, без единого изменения конфигурации.

Способ 3. Подсистема «Подключаемые команды» БСП

В современных типовых конфигурациях (на базе БСП версии 3.0 и выше) в большинстве форм документов уже встроен универсальный обработчик Подключаемый_ВыполнитьКоманду. Для интеграции собственной команды в командную панель достаточно зарегистрировать команду через общий модуль ПодключаемыеКомандыПереопределяемый или добавить переопределение в расширении.

Механизм подсистемы БСП самостоятельно сформирует интерфейсный элемент на форме и при нажатии перенаправит вызов в указанный общий модуль, избавляя разработчика от необходимости вручную прописывать клиентские обработчики в модуле формы.

← На главную