Для того, что бы разобраться в коде типовых конфигураций, я, последнее время, стал часто использовать ментальные карты. Мне это помогает, надеюсь и Вам будет полезно) В качестве софта для построения ментальной карты, применяю достаточно распространённый xMind (www.xmind.net). Недавно наткнулся в сети на вот такой плагин к xMind - www.codeanalyzer.ru, который и подтолкнул к написанию этой статьи.
Итак, сначала сформулируем задачу. Использовать будем типовую конфигурацию последнего, на день написания статьи, релиза 2.0.45.6. Откроем демонстрационную конфигурацию под бухгалтером. Откроем форму документа "Реализация товаров и услуг". Нам необходимо разобраться, как формируется меню "Печать", какие процедуры отвечают за непосредственную печать, как запоминается печатная форма по умолчанию и какие требования предъявляются к внешней печатной форме.
Если мы запустим конфигуратор и откроем форму документа "РеализацияТоваровУслуг", то не увидим в нижней командной панели меню "Печать". Стало быть, оно формируется динамически, скорее всего, при открытии формы. Посмотрим на список процедур формы документа.
Посмотрим, что вызывается из ПередОткрытием().
Посмотрим на вызовы УстановитьКнопкиПечати(...)
Изучив текст УстановитьКнопкиПечати(), можно выявить еще три процедуры формы, использующиеся как обработчики действий.
Теперь объединим всё используемое в одно дерево:
Добавим процедуры, вызываемые из процедур-обработчиков действий:
Таким образом, что мы имеем? Перед открытием, после записи и при установке печати по умолчанию вызывается УстановитьКнопкиПечати(), которая вызывает ПолучитьДеревоМакетовПечати() и получает из неё что-то, что затем передает в УстановитьПодменюПечати(), УстановитьПечатьПоУмолчанию() и СформироватьПодменю(). Последние три процедуры отвечают за формирование меню на форме документа. Для кнопки печати по умолчанию используется действие на основании процедуры формы документа ОсновныеДействияФормыПечатьПоУмолчанию(). Посмотрим на ПолучитьДеревоМакетовПечати().
Видим, что её вызов происходит из практически всех документов конфигурации при вызове УстановитьКнопкиПечати(). А делает она следующее:
ИнициализироватьДеревоДополнительныхКнопок() возвращает дерево значений, с колонками как на рисунке.
Далее начинается заполнение этого дерева. Сначала формами, переданными с помощью параметра-структуры, возвращаемого функцией модуля документа ПолучитьСтруктуруПечатныхФорм() (это ДобавитьВДеревоМакетовВстроенныеФормы(...)), затем внешними (с помощью ДобавитьВДеревоМакетовДополнительныеФормы(...)). Причём, в качестве действия для встроенных и внешних форм устанавливается действие из параметра, созданное на основании процедуры формы ОсновныеДействияФормыПечать(), а для установки печати по умолчанию - действие из параметра ДействиеУстановитьПечатьПоУмолчанию(). Далее происходит отметка строки печати по умолчанию и добавление в конец меню разделителся с кнопкой "По умолчанию...". Анализ текста ДобавитьВДеревоМакетовДополнительныеФормы() говорит о том, что внешние печатные формы регистрируются в табличной части справочника ВнешниеОбработки - Принадлежность.
Вернёмся к формированию списка меню процедурой СформироватьПодменю(...). Среди прочего видно, что при создании кнопки ей назначается действие из соответствующей колонки дерева значений списка печатных форм.
Теперь посмотрим на вызов печатной формы из ПечатьПоДополнительнойКнопке(). В конце процедуры видим, что ответ на вопрос "внешняя ли это печатная форма?" дается через проверку заполненности колонки "Расшифровка". И если внешняя, то вызываем НапечататьВнешнююФорму(), если же форма встроенная, то вызывается процедура модуля объекта "Печать()".
Посмотрим на НапечататьВнешнююФорму(...). Ответим на вопрос: какие поля содержит структура "Расшифровка"? Исходя из нашей схемы заполнение этой структуры должно происходить в вызове ДобавитьВДеревоМакетовДополнительныеФормы(...) (из ПолучитьДеревоМакетовПечати(...)). Действительно, в коде этой процедуры видим:
СтруктураРасшифровки = Новый Структура("СсылкаНаВнешнююОбработку, НомерСтроки, ДополнительныеПараметрыОбработки", ВыборкаСсылок.Ссылка, Выборка.НомерСтроки, Выборка.ДополнительныеПараметрыОбработки.Получить());
А в НапечататьВнешнююФорму() по номеру строки получаются двоичные данные внешней обработки, далее они записываются во временный файл и выполняется вызов метода обработки "Печать()".
Теперь обратим внимание на процедуру модуля документа "Печать()". Она по переданному имени макета вызывает процедуру, формирующую табличный документ, например "ПечатьДокумента()".
Таким образом, общая схема объектов может выглядеть вот так:
Из неё видно, что чтобы добавить новую встроенную печатную форму в документ, нужно:
- В модуль документа добавить процедуру, возвращающую табличный документ;
- В процедуру модуля документа ПолучитьСтруктуруПечатныхФорм() добавить элемент структуры-результата. Ключом быдет идентификатор печатной формы, значеним - представление в списке печатных форм.
- В процедуру Печать() добавить условие, обрабатывающее идентификтор новой печатной формы.
Чтобы добавить внешнюю печатную форму, необходимо:
- Зарегистрировать внешнюю обработку в справочнике "ВнешниеОбработки", указав в табличной части "Принадлежность" объекты, к которым она будет относиться;
- Обеспечить наличие в добавляемой внешней обработке метода модуля обработки "Печать()".