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