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