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