Как добавить внешнюю печатную форму в документ, если в нем нет подменю "Печать"?

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

Стандартная ситуация для разработчика 1С: необходимо добавить внешнюю печатную форму (ВПФ) к типовому документу, например, в конфигурации "1С:Зарплата и Управление Персоналом". После подключения ВПФ через стандартный механизм вы открываете документ и не находите ее. Вместо привычного подменю "Печать" на форме присутствует лишь одна кнопка для вывода на печать конкретной, встроенной печатной формы. При этом снимать конфигурацию с поддержки категорически не хочется.

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

Выясняем причину: почему подменю "Печать" не появляется автоматически?

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

Рассмотрим ключевые компоненты, которые должны быть настроены для корректной работы механизма печати:

  1. Модуль менеджера объекта. Это сердце механизма печати для конкретного документа или справочника. В нем должна присутствовать экспортная процедура ДобавитьКомандыПечати(КомандыПечати). Именно ее наличие служит сигналом для БСП, что данный объект в принципе может иметь команды печати. Подсистема вызывает эту процедуру, чтобы собрать все печатные формы, включая внешние.
  2. Модуль формы объекта. В коде формы, обычно в обработчике события ПриСозданииНаСервере, должен быть вызов процедуры УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма). Этот вызов инициализирует создание и отображение подменю "Печать" на форме.

Если в типовом документе разработчики по какой-то причине (например, из-за унаследованной логики) не реализовали эти два пункта, то стандартный механизм подключения ВПФ не сработает. Внешним формам просто некуда будет добавиться.

Решение: подключаем документ к подсистеме печати через расширение

Чтобы решить проблему, не снимая конфигурацию с поддержки, мы создадим расширение и в нем выполним все необходимые доработки. Проанализируем этот процесс по шагам.

  1. Создаем расширение и заимствуем объекты

    Первым делом создайте новое расширение в конфигураторе. Добавьте в него с заимствованием тот документ, для которого нужно реализовать печать. Также заимствуйте его основную форму, в которую мы будем добавлять кнопку.

  2. Дорабатываем модуль менеджера

    Это самый важный шаг. Нам нужно "сообщить" подсистеме печати, что наш документ теперь поддерживает стандартный механизм. Для этого добавим в расширение модуль менеджера для нашего заимствованного документа (если его не было) или расширим существующий.

    В этом модуле необходимо создать экспортную процедуру ДобавитьКомандыПечати. Важный момент: даже если эта процедура будет пустой, ее простое наличие в модуле менеджера уже активирует для объекта механизм поиска и подключения внешних печатных форм.

    
    // Модуль менеджера документа в расширении
    
    Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
        // Тело процедуры может быть пустым.
        // Ее наличие является достаточным условием для того,
        // чтобы БСП начала искать для этого объекта ВПФ.
        // Сюда же можно добавлять команды для встроенных печатных форм,
        // если они будут реализовываться в расширении.
    КонецПроцедуры
    
  3. Дорабатываем форму документа

    Теперь, когда система знает, что у документа могут быть печатные формы, нам нужно отобразить их на форме. Для этого в заимствованной форме документа выполним несколько действий:

    • Создадим подменю: На вкладке "Элементы" добавьте новую группу с видом "Подменю". Назовем ее, например, ПодменюПечать и зададим ей заголовок "Печать". Разместите ее на командной панели формы в удобном месте.
    • Инициализируем команды печати: Перейдем в модуль заимствованной формы. Нам нужен обработчик события ПриСозданииНаСервере. Если его нет, создайте его. Внутри этого обработчика нужно добавить одну строку кода, которая свяжет наше новое подменю с подсистемой печати.

      
      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
          // Здесь может быть существующий код из типовой конфигурации.
      
          // Добавляем вызов для инициализации команд печати в нашем подменю.
          УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюПечать);
      КонецПроцедуры
      
    • Добавим обработчик выполнения команды: Наконец, чтобы команды из подменю выполнялись, в модуль формы нужно добавить стандартную процедуру-обработчик. Она будет перехватывать клик по пункту меню и передавать управление общему модулю для выполнения печати.

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

После выполнения этих шагов сохраните расширение и обновите конфигурацию базы данных. Теперь, когда вы откроете форму документа, на ней появится подменю "Печать". И самое главное — в этом подменю будут автоматически отображаться все внешние печатные формы, зарегистрированные для данного типа документа в системе.

Таким образом, мы, не меняя ни строчки в основной конфигурации, "достроили" недостающую функциональность и полностью интегрировали документ в стандартный механизм печати БСП.

← На главную