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