Как подключить внешнюю печатную форму к документу, если на его форме нет кнопки Печать в 1С:ЗУП 3.0?

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

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

Разберем по шагам, почему возникает эта проблема, как устроена подсистема печати БСП изнутри и какими способами можно реализовать вывод печатной формы без снятия конфигурации с типовой поддержки.

Архитектурные причины отсутствия кнопки печати

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

  1. Регистрация метаданных в подсистеме: документ должен быть включен в состав определяемого типа ОбъектСДополнительнымиКомандами (или ВладелецДополнительныхОбработок в зависимости от версии БСП).
  2. Наличие обработчика в модуле менеджера: в модуле менеджера документа обязательно должна присутствовать экспортная процедура ДобавитьКомандыПечати(КомандыПечати), даже если список команд пуст.
  3. Интеграция подсистемы печати в форму: на управляемой форме документа разработчиками конфигурации должна быть размещена группа командной панели (например, ПодменюПечать), а в коде модуля формы — вызов методов инициализации подключаемых команд (УправлениеПечатью.ПриСозданииНаСервере или ПодключаемыеКоманды.ПриСозданииНаСервере) и соответствующий обработчик нажатия.
  4. Регистрация в переопределяемом модуле: в общем модуле УправлениеПечатьюПереопределяемый в процедуре ПриОпределенииОбъектовСКомандамиПечати документ должен быть добавлен в перечень объектов печати.

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

Рассмотрим типовой шаблон функции регистрации внешней печатной формы, который обычно используется разработчиками:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.НачислениеЗарплаты");
    
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Реестр выдачи расчетных листков");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Печатная форма для документа Начисление зарплаты");
    
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Реестр выдачи расчетных листков";
    НоваяКоманда.Идентификатор = "РеестрВыдачиРЛ";
    НоваяКоманда.Использование = "ВызовСерверногоМетода";
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    ПараметрыРегистрации.Вставить("Команды", Команды);
    
    Возврат ПараметрыРегистрации;
КонецФункции

Проанализируем возможные варианты решения задачи, если стандартная регистрация не дает результата.

Решение 1. Внедрение подсистемы печати через расширение конфигурации

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

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

После применения расширения и обновления метаданных БСП документ станет доступен в справочнике дополнительных обработок, а кнопка Печать появится в командной панели формы документа.

Решение 2. Разработка внешней обработки с видом «ЗаполнениеОбъекта»

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

Посмотрим на пример функции СведенияОВнешнейОбработке для такого случая:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.НачислениеЗарплаты");
    
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Сформировать реестр выдачи РЛ");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Сформировать реестр выдачи РЛ";
    НоваяКоманда.Идентификатор = "ПечатьРеестра";
    НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    
    ПараметрыРегистрации.Вставить("Команды", Команды);
    Возврат ПараметрыРегистрации;
КонецФункции

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


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    Если ИдентификаторКоманды = "ПечатьРеестра" Тогда
        ТабДокумент = СформироватьПечатнуюФормуНаСервере(ОбъектыНазначения);
        ТабДокумент.Показать("Реестр выдачи расчетных листков");
    КонецЕсли;
КонецПроцедуры

Решение 3. Использование печати из формы списка документов

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

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


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.ДанныеДляРасчетаЗарплаты");
    
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Бригадный наряд");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Бригадный наряд";
    НоваяКоманда.Идентификатор = "КомандаПечатиНаряд";
    НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

Решение 4. Перенос печатной формы на связанный документ

Если специфика бизнес-процесса позволяет, логичным решением является перенос печатной формы на финальный документ цепочки. Например, реестры выдачи расчетных листков или выплаты заработной платы часто целесообразнее привязывать к документам Ведомость в банк, Ведомость в кассу или Ведомость на счета, где подсистема печати БСП внедрена разработчиками типовой конфигурации в полном объеме.

← На главную