Разработка внешней печатной формы (ВПФ) для Универсального передаточного документа (УПД) в конфигурации 1С:Бухгалтерия предприятия 3.0 часто вызывает затруднения даже у опытных разработчиков. Это связано с тем, что механизм печати УПД реализован не в модулях менеджеров конкретных документов (как, например, в случае с накладной ТОРГ-12), а вынесен в специализированную обработку Обработка.ПечатьУПД. Рассмотрим подробно, как преодолеть эти трудности, правильно написать код и эффективно провести отладку.
Для начала проанализируем, почему стандартный подход к созданию ВПФ здесь может не сработать. В БП 3.0 УПД является универсальным объектом, который может быть напечатан из множества документов: Реализация товаров и услуг, Оказание услуг, Передача ОС и других. Чтобы не дублировать сложный код формирования во всех этих объектах, разработчики фирмы "1С" вынесли логику в отдельную обработку. Выясним основные моменты:
ПечатьУПД. Именно там располагается функция ПечатьУниверсальныхПередаточныхДокументов.Рассмотрим правильный вариант реализации экспортной процедуры Печать в модуле объекта вашей внешней обработки. Главная задача — правильно заполнить коллекцию печатных форм и вызвать типовые методы формирования данных. Посмотрим на пример кода, который учитывает специфику БСП (Библиотеки стандартных подсистем):
Процедура Печать(Объекты, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Получаем настройки печати УПД через типовой вызов сервера
МассивОбъектов = УчетНДСВызовСервера.ПолучитьНастройкиПечатиУниверсальныхПередаточныхДокументов(Объекты).УниверсальныеПередаточныеДокументы;
ЕстьСчетаФактуры = Ложь;
Для каждого Объект Из МассивОбъектов Цикл
Если ТипЗнч(Объект) = Тип("ДокументСсылка.СчетФактураВыданный") Тогда
ЕстьСчетаФактуры = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Проверяем необходимость формирования макета "УПД"
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "УПД") Тогда
// Логика для документов со статусом 1 (на основании счетов-фактур)
Если ЕстьСчетаФактуры Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"УПД",
"Универсальный передаточный документ (внешний)",
ПечатьУниверсальныхПередаточныхДокументов(
МассивОбъектов,
ОбъектыПечати,
Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(Истина, Истина)
),
,
"ПФ_MXL_УниверсальныйПередаточныйДокумент"
);
КонецЕсли;
// Логика для документов со статусом 2 (первичные документы)
ТекстЗапросаУПД = "";
Для каждого Объект Из МассивОбъектов Цикл
Если ТипЗнч(Объект) <> Тип("ДокументСсылка.СчетФактураВыданный") Тогда
// Получаем текст запроса из метаданных конкретного документа
ТекстЗапросаУПД = Документы[Объект.Метаданные.Имя].ТекстЗапросаПечатьУниверсальныхПередаточныхДокументов;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ПустаяСтрока(ТекстЗапросаУПД) Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"УПД",
"УПД",
ПечатьУниверсальныхПередаточныхДокументов(
МассивОбъектов,
ОбъектыПечати,
ТекстЗапросаУПД,
Истина
),
,
"ПФ_MXL_УниверсальныйПередаточныйДокумент"
);
КонецЕсли;
КонецЕсли;
// Заполняем дополнительные параметры печати (логотипы, подписи и т.д.)
ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
Важный момент: Функция ПечатьУниверсальныхПередаточныхДокументов должна быть определена внутри вашей внешней обработки. Вы можете скопировать её из модуля менеджера обработки ПечатьУПД, внеся необходимые правки в макет.
Проанализируем ситуацию: когда мы регистрируем ВПФ в справочнике "Дополнительные отчеты и обработки", отлаживать её становится крайне сложно, так как код выполняется во временном сеансе на сервере. Чтобы не "гадать на кофейной гуще", используем проверенный способ отладки через вспомогательную форму.
Разберем по шагам, как это сделать:
СсылкаНаОбъект с типом документа (например, ДокументСсылка.РеализацияТоваровУслуг).Печать.
&НаСервере
Процедура ПечатьНаСервере()
// Подготавливаем коллекцию печатных форм (идентификатор должен совпадать с регистрационным)
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("УПД");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Инициализируем обязательные параметры БСП для вывода
ПараметрыВывода.Вставить("ДоступнаПечатьПоКомплектно", Ложь);
ПараметрыВывода.Вставить("ПараметрыОтправки", Новый Структура("Получатель, Текст, Тема"));
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
// Преобразуем реквизит формы в объект обработки для вызова экспортной процедуры
ОбъектСервера = РеквизитФормыВЗначение("Объект");
// Теперь здесь можно ставить точку останова!
ОбъектСервера.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Для визуализации результата можно вывести первый табдок из коллекции
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
КоллекцияПечатныхФорм[0].ТабличныйДокумент.Показать("Тест УПД");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПечать(Команда)
ПечатьНаСервере();
КонецПроцедуры
Благодаря этому методу, мы можем запустить ВПФ просто как обычный файл (через "Файл - Открыть") в режиме 1С:Предприятие. После нажатия на кнопку в форме сработает точка останова, и вы сможете построчно проверить, как заполняются данные и где возникает ошибка В обработчике печати не был сформирован табличный документ.
Проанализируем типичные причины, по которым ВПФ УПД может не работать:
1. Несовпадение идентификаторов.
В функции СведенияОВнешнейОбработке вы указываете идентификатор команды (например, УПД_Внешняя). В процедуре Печать, при проверке НужноПечататьМакет и в ВывестиТабличныйДокументВКоллекцию, вы обязаны использовать именно этот идентификатор. Если в коде написано УПД, а в сведениях УПД_Внешняя, система проигнорирует формирование документа.
2. Пустой результат функции формирования.
Часто функция ПечатьУниверсальныхПередаточныхДокументов возвращает Неопределено или пустой табличный документ, если запрос не нашел данных. Проверьте, что в МассивОбъектов передаются верные ссылки и что для них в базе существуют записи (например, если это Статус 1, то должен быть проведенный Счет-фактура).
3. Проблемы с именами областей макета.
Если вы изменили макет УПД во внешней обработке, убедитесь, что все имена областей (Header, Строка, Подвал и т.д.) остались прежними. Типовой код заполнения жестко завязан на эти имена. Если вы переименуете область, метод ЗаполнитьПараметры() просто ничего не найдет.
4. Фоновая печать.
В современных версиях БП 3.0 печать может выполняться в фоне. При отладке обязательно проверьте настройки пользователя и временно отключите опцию "Печать в фоновом режиме", иначе точка останова на сервере может не "пойматься" отладчиком в некоторых конфигурациях среды.
Следуя этой инструкции, мы сможем создать надежную и легко обслуживаемую внешнюю печатную форму УПД, сохранив при этом все преимущества типового функционала 1С:Бухгалтерии 3.0.