Как разработать и отладить внешнюю печатную форму УПД в 1С:Бухгалтерия предприятия 3.0

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

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

Архитектурные особенности печати УПД

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

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

Разбор структуры процедуры Печать для ВПФ

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


Процедура Печать(Объекты, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт 

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

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

        // Логика для документов со статусом 2 (первичные документы)
        ТекстЗапросаУПД = "";
        Для каждого Объект Из МассивОбъектов Цикл
            Если ТипЗнч(Объект) <> Тип("ДокументСсылка.СчетФактураВыданный") Тогда
                // Получаем текст запроса из метаданных конкретного документа
                ТекстЗапросаУПД = Документы[Объект.Метаданные.Имя].ТекстЗапросаПечатьУниверсальныхПередаточныхДокументов;
                Прервать;
            КонецЕсли;
        КонецЦикла;

        Если НЕ ПустаяСтрока(ТекстЗапросаУПД) Тогда
            УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
                КоллекцияПечатныхФорм, 
                "УПД", 
                "УПД", 
                ПечатьУниверсальныхПередаточныхДокументов(
                    МассивОбъектов, 
                    ОбъектыПечати, 
                    ТекстЗапросаУПД, 
                    Истина
                ), 
                , 
                "ПФ_MXL_УниверсальныйПередаточныйДокумент"
            );
        КонецЕсли;
        
    КонецЕсли;

    // Заполняем дополнительные параметры печати (логотипы, подписи и т.д.)
    ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);

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

Важный момент: Функция ПечатьУниверсальныхПередаточныхДокументов должна быть определена внутри вашей внешней обработки. Вы можете скопировать её из модуля менеджера обработки ПечатьУПД, внеся необходимые правки в макет.

Эффективная методика отладки ВПФ

Проанализируем ситуацию: когда мы регистрируем ВПФ в справочнике "Дополнительные отчеты и обработки", отлаживать её становится крайне сложно, так как код выполняется во временном сеансе на сервере. Чтобы не "гадать на кофейной гуще", используем проверенный способ отладки через вспомогательную форму.

Разберем по шагам, как это сделать:

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

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

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

&НаКлиенте
Процедура ВыполнитьПечать(Команда)
    ПечатьНаСервере();
КонецПроцедуры

Благодаря этому методу, мы можем запустить ВПФ просто как обычный файл (через "Файл - Открыть") в режиме 1С:Предприятие. После нажатия на кнопку в форме сработает точка останова, и вы сможете построчно проверить, как заполняются данные и где возникает ошибка В обработчике печати не был сформирован табличный документ.

Распространенные ошибки и способы их решения

Проанализируем типичные причины, по которым ВПФ УПД может не работать:

1. Несовпадение идентификаторов.
В функции СведенияОВнешнейОбработке вы указываете идентификатор команды (например, УПД_Внешняя). В процедуре Печать, при проверке НужноПечататьМакет и в ВывестиТабличныйДокументВКоллекцию, вы обязаны использовать именно этот идентификатор. Если в коде написано УПД, а в сведениях УПД_Внешняя, система проигнорирует формирование документа.

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

3. Проблемы с именами областей макета.
Если вы изменили макет УПД во внешней обработке, убедитесь, что все имена областей (Header, Строка, Подвал и т.д.) остались прежними. Типовой код заполнения жестко завязан на эти имена. Если вы переименуете область, метод ЗаполнитьПараметры() просто ничего не найдет.

4. Фоновая печать.
В современных версиях БП 3.0 печать может выполняться в фоне. При отладке обязательно проверьте настройки пользователя и временно отключите опцию "Печать в фоновом режиме", иначе точка останова на сервере может не "пойматься" отладчиком в некоторых конфигурациях среды.

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

← На главную