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