Как исправить ошибки при формировании внешней печатной формы УПД в 1С?

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

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

Анализ исходного кода и типичных ошибок

Посмотрим на исходный вариант экспортной процедуры Печать в модуле объекта внешней печатной формы:


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

В этом компактном коде допущено сразу несколько критических ошибок разного характера: синтаксических, логических и архитектурных. Разберем каждую из них подробнее.

  1. Лишняя запятая в вызове метода (синтаксическая ошибка).
    В строке вызова функции формирования табличного документа указана запятая без следующего параметра: СформироватьПечатнуюФормуУПД(..., ПараметрыПечати, ). На этапе синтаксического контроля конфигуратор выдаст ошибку либо платформа выбросит исключение при попытке выполнения серверного вызова.
  2. Игнорирование возвращаемого значения функции НужноПечататьМакет.
    Метод УправлениеПечатью.НужноПечататьМакет является функцией, возвращающей значение типа Булево. В исходном примере функция вызвана как процедура отдельной строкой. В результате формирование табличного документа выполняется всегда, даже если пользователь в диалоге печати снял флажок с макета УПД, либо алгоритм приводит к непредсказуемым ошибкам в подсистеме БСП.
  3. Несовпадение количества параметров процедуры Печать с версией БСП.
    Количество формальных параметров экспортной процедуры Печать строго регламентировано версией БСП, внедренной в конфигурацию. Если платформа вызывает процедуру с 4 параметрами, а в модуле объявлено 5, возникает ошибка: «Несоответствие количества фактических параметров».
  4. Контекст вызова функции формирования печатной формы.
    Функция СформироватьПечатнуюФормуУПД не является встроенной функцией платформы и редко присутствует в глобальном контексте. В типовых конфигурациях («1С:Управление торговлей», «1С:Комплексная автоматизация», «1С:ERP») она расположена в менеджере соответствующей обработки печати или менеджере документа.
  5. Передача неверного типа в параметры отправки.
    Процедура ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки ожидает в качестве второго аргумента исходный МассивОбъектов со ссылками на документы, а не вспомогательную структуру соответствия типов (СтруктураТипов).

Шаг 1. Согласование сигнатуры процедуры Печать

Выясним причину ошибки параметров. В Библиотеке стандартных подсистем применяются два стандарта объявления процедуры Печать в модуле объекта ВПФ:

  1. БСП до версии 2.4: используется сигнатура из 4 параметров:
    
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    Если в вашей конфигурации используется эта редакция, то структуру ПараметрыПечати необходимо инициализировать вручную внутри метода: ПараметрыПечати = Новый Структура;
  2. БСП версии 2.4 и новее: используется сигнатура из 5 параметров:
    
    Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    В этом случае ПараметрыПечати приходят из вызывающего контекста формы печати документов.

Чтобы определить, какой вариант требуется в вашей конфигурации, достаточно открыть модуль менеджера любого типового документа (например, Документ.РеализацияТоваровУслуг) и посмотреть на список параметров экспортной процедуры Печать.

Шаг 2. Корректное использование методов подсистемы печати

Разберем, как правильно организовать проверку необходимости формирования печатной формы. Вызов метода НужноПечататьМакет обязательно должен обрамляться условным оператором:


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

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

Шаг 3. Обращение к типовым алгоритмам и различия конфигураций

При адаптации кода между «1С:Бухгалтерия предприятия» и «1С:Управление торговлей» важно помнить о различиях в модульной архитектуре:

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

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


ТабличныйДокумент = Обработки.ПечатьОбщихФорм.СформироватьПечатнуюФормуУПД(
    СтруктураТипов, 
    ОбъектыПечати, 
    ПараметрыПечати
);

Итоговый исправленный вариант процедуры Печать

Объединим все исправления в рабочий код для «1С:Управление торговлей» с поддержкой пятипараметрической сигнатуры БСП:


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

    СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);

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

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

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

Рекомендации по отладке и регистрации ВПФ

  1. Безопасный режим: При регистрации внешней обработки в справочнике дополнительных отчетов и обработок обратите внимание на свойство БезопасныйРежим. Если типовые процедуры формирования УПД используют привилегированный режим для считывания закрытых реквизитов счетов-фактур, в функции СведенияОВнешнейОбработке необходимо указать ПараметрыРегистрации.БезопасныйРежим = Ложь;.
  2. Проверка связанных документов: При печати УПД со статусом 1 типовой механизм выполняет поиск проведенного счета-фактуры к документу реализации. Если счет-фактура не создан или не проведен, функция может вернуть пустой макет либо вызвать ошибку проверки статуса. Убедитесь, что в тестовой базе оформлены все цепочки документов.
← На главную