Как формируются подключаемые команды печати на форме документа в 1С?

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

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


&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

При этом в свойстве Команда.Имя содержится значение вроде ПодменюПечатьОбычное__ТоварныйЧек. Если мы откроем форму документа в конфигураторе и посмотрим в раздел команд формы, то мы эту команду там не найдем. Разберем по шагам, как и откуда формируется эта кнопка.

Механизм подключаемых команд БСП

Механизм формирования подобных кнопок базируется на подсистеме «Подключаемые команды» из БСП. В современных типовых конфигурациях команды печати не добавляются вручную на каждую форму. Вместо этого они создаются программно в зависимости от настроек программы и метаданных.

Проанализируем, откуда система берет данные для создания этих кнопок:

  1. Модуль менеджера документа: Состав встроенных команд печати физически прописывается в модуле менеджера объекта. Там располагается процедура ДобавитьКомандыПечати(КомандыПечати). В ней разработчик задает идентификатор формы (например, ТоварныйЧек), ее представление для пользователя, обработчик, функциональные опции и режим открытия.
  2. Внешние источники: Команда может подключаться динамически из справочника «Дополнительные отчеты и обработки», если для данного вида документа была загружена и активирована внешняя печатная форма.

Как команды создаются в форме

Выясним, в какой момент команда появляется в интерфейсе. Все динамические изменения элементов происходят при открытии формы.

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

  1. С помощью метода Команды.Добавить(...) программно создается новая команда формы с составным именем вида <ИмяПодменю>__<ИдентификаторКоманды>.
  2. Действием для созданной команды программно назначается универсальная процедура формы Подключаемый_ВыполнитьКоманду.
  3. С помощью метода Элементы.Добавить(...) создается визуальная кнопка типа КнопкаФормы, которая помещается в соответствующую группу командной панели (например, в группу ПодменюПечать или ПодменюПечатьОбычное).

Важное ограничение: Программно добавлять элементы и команды платформенно разрешено только на сервере. На клиенте коллекция команд формы доступна только для чтения.

Условия отображения команд

Посмотрим на условия, при которых команда может не появиться на форме:

Где искать логику печати и как ее дорабатывать

Мы выяснили, как кнопка появляется на форме, но где находится код самого табличного документа? Основной код формирования макета располагается не в модуле формы, а в модуле менеджера объекта, в процедуре:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)

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

← На главную