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