Как исправить ошибку формирования табличного документа и настроить заполнение полей Грузоотправитель и Грузополучатель во внешней печатной форме УПД

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При разработке внешних печатных форм (ВПФ) для конфигурации 1С:Бухгалтерия предприятия 3.0 программисты часто сталкиваются с ситуацией, когда стандартный механизм печати выдает ошибку: «В обработчике печати не был сформирован табличный документ». Особенно это актуально для Универсального передаточного документа (УПД), где логика формирования зависит от наличия связанных документов и корректности заполнения реквизитов доставки. Рассмотрим подробно, как правильно структурировать код ВПФ и обеспечить вывод данных о грузоотправителе и грузополучателе.

Разбор причины ошибки «Табличный документ не сформирован»

Проанализируем ситуацию: механизм Библиотеки стандартных подсистем (БСП) вызывает процедуру Печать во внешнем модуле. Если после выполнения этой процедуры коллекция печатных форм остается пустой, система выдает исключение. Выясним основные причины, почему это происходит в случае с УПД:

  1. Несоответствие идентификаторов: В функции СведенияОВнешнейОбработке вы регистрируете команду с одним идентификатором (например, "1" или "УПД"), а в процедуре Печать проверяете наличие макета по другому имени.
  2. Отсутствие условий для формирования: УПД в 1С может иметь статус 1 (счет-фактура + первичка) или статус 2 (только первичка). Если в коде стоит проверка только на наличие счета-фактуры, а пользователь печатает документ без него, блок формирования документа будет пропущен.
  3. Ошибки в МассивеОбъектов: Если в процедуру передан пустой массив ссылок или объекты, не соответствующие типу, определенному в условиях.

Рассмотрим правильную структуру функции регистрации команды:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    
    ПараметрыРегистрации.Вставить("Наименование", "УПД (внешняя форма)");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Версия", "1.0");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    // Важно: Идентификатор команды должен совпадать с именем макета в коллекции
    ДобавитьКоманду(ТаблицаКоманд, "УПД (статус 1)", "УПДСтатус1", "ВызовСерверногоМетода", Ложь, "ПечатьMXL");
    
    ПараметрыРегистрации.Вставить("Комынды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

Проблема заполнения грузоотправителя и грузополучателя

Довольно часто в печатной форме УПД строки грузоотправителя и грузополучателя остаются пустыми или содержат прочерки. Разберем ситуацию с точки зрения методологии учета и кода 1С. Согласно постановлению №1137, если в документе оказываются только услуги, данные о грузоотправителе и грузополучателе не заполняются. Однако, если задача стоит вывести их принудительно или в документе есть товары, необходимо проверить следующее:

  1. Вкладка «Доставка»: В документе «Реализация товаров и услуг» проверьте заполнение реквизитов на вкладке доставки. Если там не указан адрес или контрагент, стандартные функции 1С вернут пустое значение.
  2. Тип контрагента: Если грузоотправителем выступает сама организация, в коде должна корректно отрабатывать функция БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице.

Вместо того чтобы копировать сотни строк типового кода, проанализируем более эффективный подход. Мы можем вызвать стандартную функцию формирования УПД из общего модуля, а затем программно модифицировать полученный табличный документ.

Оптимальная реализация процедуры Печать

Посмотрим на пример кода, который вызывает типовые механизмы и гарантирует, что табличный документ будет добавлен в коллекцию, даже если внешняя форма сложная:


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

КонецПроцедуры

Как принудительно заполнить данные в макете

Если стандартный запрос не подтягивает данные (например, из-за специфических доработок конфигурации), проанализируем способ "пост-обработки". После получения ТабличныйДокумент, мы можем перебрать его области и заменить параметры.

Рассмотрим пример функции, которая ищет область грузоотправителя и вставляет туда данные напрямую из реквизитов документа:


Процедура ИсправитьГрузоотправителя(ТабДокумент, МассивОбъектов)
    // В УПД области имеют свои имена. Нам нужно найти область, где выводится шапка.
    // Это трудоемкий путь, поэтому лучше вмешаться в структуру ДанныеШапки.
    
    Для Каждого СсылкаИзМассива Из МассивОбъектов Цикл
        // Получаем нужные данные запросом
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   Реализация.Грузоотправитель КАК Отправитель,
            |   Реализация.Грузополучатель КАК Получатель
            |ИЗ
            |   Документ.РеализацияТоваровУслуг КАК Реализация
            |ГДЕ
            |   Реализация.Ссылка = &Ссылка";
        Запрос.УстановитьПараметр("Ссылка", СсылкаИзМассива);
        // ... выполнение запроса и поиск ячеек в ТабДокумент через НайтиТекст
    КонецЦикла;
КонецПроцедуры

Важные рекомендации по работе с кодом УПД

Во-первых, никогда не копируйте функции целиком из типовых модулей в ВПФ. В обновлении 1С состав параметров функций ПечатьУниверсальныхПередаточныхДокументов или ПодготовитьДанныеШапкиСчетаФактуры1137 может измениться, и ваша внешняя форма перестанет работать.

Во-вторых, используйте привилегированный режим. Чтение данных для печати (особенно адресов и ИНН) часто требует прав, которых нет у обычного пользователя. Установка УстановитьПривилегированныйРежим(Истина) внутри функций получения данных решит многие проблемы с пустыми полями.

В-третьих, обратите внимание на параметр ТолькоПередаточныйДокумент. Если он установлен в Истина, 1С будет формировать УПД со статусом 2. Это важно для правильного выбора текста запроса.

Подводя итог, скажем: чтобы внешняя печатная форма УПД работала корректно, необходимо обеспечить строгое соответствие идентификаторов команд в модуле и использовать типовые экспортные методы общих модулей УчетНДС и УправлениеПечатью. Для кастомизации данных грузоотправителя лучше всего использовать подмену данных в структуре ДанныеШапки непосредственно перед выводом макета в табличный документ.

← На главную