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