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