При разработке внешних печатных форм (ВПФ) для конфигураций на базе управляемых форм и Библиотеки стандартных подсистем (БСП), таких как «Альфа-Авто», разработчики часто сталкиваются с ситуацией: обработка успешно регистрируется в базе, команда появляется в подменю «Печать», но при её нажатии ничего не происходит — форма не открывается, а система не выдает явных сообщений об ошибках.
Разберем детально причины такого поведения платформы, проанализируем типичные ошибки в коде модуля внешней обработки и рассмотрим правильный порядок реализации механизма печати.
Когда при выборе внешней команды печатная форма не формируется без видимых ошибок («тихий сбой»), причина чаще всего кроется в несоответствии стандартам подсистемы печати БСП:
ВызовСерверногоМетода и варианте ПечатьMXL подсистема БСП не ожидает возврата объекта ТабличныйДокумент через оператор Возврат. Результат формирования должен помещаться в переданную коллекцию печатных форм. Если коллекция остается пустой, окно предварительного просмотра не открывается.Посмотрим на типовой пример регистрации обработки в функции СведенияОВнешнейОбработке в модуле объекта:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ЗаказНаряд");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Сопроводительный лист к заказ-наряду");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Версия", "1.0");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Сопроводительный лист к заказ-наряду",
"СопроводительныйЛистКЗаказНаряду",
"ВызовСерверногоМетода",
Истина,
"ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Обратим внимание на второй параметр вызова ДобавитьКоманду — это идентификатор "СопроводительныйЛистКЗаказНаряду". Именно по нему подсистема печати определяет, какой макет требуется сформировать.
Выясним, как должна выглядеть процедура формирования печатной формы в модуле объекта. Вместо попыток получить текущую ссылку из неопределенных переменных, используем входной параметр МассивОбъектов, передаваемый платформой.
Создадим правильную экспортную процедуру Печать и вспомогательную функцию для генерации табличного документа:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
// Проверяем необходимость формирования конкретного макета по его идентификатору
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СопроводительныйЛистКЗаказНаряду") Тогда
// Формируем табличный документ и помещаем его в общую коллекцию
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СопроводительныйЛистКЗаказНаряду",
"Сопроводительный лист к заказ-наряду",
СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
);
КонецЕсли;
КонецПроцедуры
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.АвтоМасштаб = Истина;
// Макет получаем из текущей внешней обработки
Макет = ПолучитьМакет("СопроводительныйЛист1");
НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
// Обходим массив переданных ссылок на документы
Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
Если НомерСтрокиНачало <> 1 Тогда
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
// Получаем и заполняем шапку
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Номер = СсылкаНаДокумент.Номер;
ОбластьШапка.Параметры.Дата = Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
ТабДокумент.Вывести(ОбластьШапка);
// Выводим табличную часть работ
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаРабот");
Для Каждого Стр Из СсылкаНаДокумент.Работы Цикл
ОбластьСтрока.Параметры.Заполнить(Стр);
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
// Регистрируем область печати для текущего объекта
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(
ТабДокумент,
НомерСтрокиНачало,
ОбъектыПечати,
СсылкаНаДокумент);
КонецЦикла;
Возврат ТабДокумент;
КонецФункции
Если внешняя форма всё равно не выводится на экран, выполним следующие диагностические действия:
-debug или протокол HTTP). Установим точку останова в процедуре Печать модуля внешней обработки, чтобы убедиться, что управление передается внутрь.ДокументСсылка.ЗаказНаряд и кнопкой вызова функции СформироватьПечатнуюФорму. Это позволит запускать обработку через меню Файл — Открыть и выполнять отладку без переподключения обработки в справочнике дополнительных отчетов.