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