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