Как через расширение добавить кнопку во все документы конфигурации 1С

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

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

Вариант 1. Использование параметрической общей команды в расширении

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

Разберем процесс настройки по шагам:

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

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


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

Выясним особенности и ограничения данного метода:

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

Вариант 2. Внедрение через подсистему «Подключаемые команды» (БСП)

Если конфигурация разработана на базе Библиотеки стандартных подсистем, правильнее использовать штатный механизм подключения команд. В формах документов БСП вызывает серверный метод ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект), который динамически формирует кнопки по зарегистрированным правилам.

Рассмотрим, как подключить собственную команду централизованно без прямого заимствования форм документов:

  1. Заимствуем в расширение общий модуль ПодключаемыеКомандыПереопределяемый.
  2. Перехватываем процедуру ПриОпределенииКомандПодключенныхКОбъекту(НастройкиКоманд) с помощью директивы &После.
  3. Программно регистрируем команду, определяя ее состав, представление, обработчик и привязку к видам документов.

Разберем пример реализации регистрации команды в расширении:


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

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

Вариант 3. Программное внедрение элементов через перехват общего модуля

Если кнопку требуется жестко спозиционировать именно в командной панели конкретной таблицы документа (например, Элементы.ТоварыКоманднаяПанель), не заимствуя десятки отдельных форм, проанализируем подход с динамическим добавлением элементов формы.

Разберем механизм реализации:

  1. Находим в конфигурации общий модуль, чьи процедуры гарантированно вызываются в событии ПриСозданииНаСервере у всех документов (например, процедуры подсистем версионирования, оценки производительности или контроля дат запрета).
  2. Заимствуем этот общий модуль и перехватываем процедуру через директиву &После. В параметрах таких процедур обычно передается контекст открываемой формы (параметр Форма).
  3. Проверяем метаданные открываемого объекта: есть ли у текущего документа табличная часть с именем «Товары» (Форма.Метаданные().ТабличныеЧасти.Найти("Товары") <> Неопределено).
  4. Программно создаем команду формы методом Форма.Команды.Добавить(...) и соответствующий элемент интерфейса через Форма.Элементы.Добавить(...) с типом КнопкаФормы, указав в качестве родителя требуемую командную панель.

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

Резюме

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

← На главную