Как программно привязать кнопку управляемой формы к общей команде в 1С?

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

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

Разберем типичный пример проблемного кода:


КнопкаФормы = Тип("КнопкаФормы");
Кнопка = Форма.Элементы.Добавить("Кнопка", КнопкаФормы);
Кнопка.ИмяКоманды = "ОбщаяКоманда.Кнопка";

При выполнении данной инструкции на сервере платформа генерирует исключение: «Ошибка при установке значения атрибута контекста (ИмяКоманды) по причине: Недопустимое значение». Выясним причину такого поведения платформы и рассмотрим рабочие способы решения задачи.

Почему возникает ошибка: ограничения платформы

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

  1. Ограничение свойства КнопкаФормы.ИмяКоманды: данное свойство принимает исключительно строку с именем команды из коллекции ЭтаФорма.Команды текущей формы либо предопределенное имя стандартной команды формы. Прямое указание полного имени метаданного вида "ОбщаяКоманда.ИмяКоманды" платформой не поддерживается.
  2. Ограничение свойства КомандаФормы.Действие: обработчик команды формы должен быть объявлен строго в модуле самой управляемой формы (на клиенте). Указать в качестве действия метод общего модуля напрямую нельзя.

Способ 1. Программное создание команды формы и кнопки через расширение

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

Разберем пошаговый алгоритм реализации:

  1. Заимствуем форму в расширение.
  2. В серверном обработчике (например, ПриСозданииНаСервере) создаем команду формы и связываем с ней новую кнопку:

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

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

Способ 2. Использование командного интерфейса формы

Если логика общей команды параметризована (в свойствах общей команды в типе параметра указан тип текущего объекта, например ДокументСсылка.РеализацияТоваровУслуг), платформенный механизм может отобразить команду автоматически.

Рассмотрим порядок настройки:

  1. Проверяем тип параметра в свойствах объекта ОбщаяКоманда.
  2. В редакторе формы переходим на закладку «Командный интерфейс».
  3. В нужной группе команд (например, Панель навигации или Командная панель) устанавливаем флаг видимости напротив нашей общей команды либо перетаскиваем её в состав элементов.
  4. Если в командной панели формы отключено свойство Автозаполнение, платформа не выводит глобальные команды автоматически — в этом случае потребуется включить автозаполнение или явно разместить команду в структуре элементов.

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

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

Посмотрим на преимущества этого подхода:

  1. Команда регистрируется централизованно через модуль ПодключаемыеКомандыПереопределяемый.
  2. БСП автоматически создает элементы интерфейса при открытии типовых форм документов и справочников.
  3. Не требуется вносить изменения в сами формы или заимствовать их в расширение, если форма уже поддерживает подключение команд БСП.
← На главную