Откуда берется печатная форма УКДСтатус1_2023Кв4 и как ее использовать во внешней обработке?

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

При разработке или доработке печатных форм для документов "Корректировка реализации" в конфигурациях 1С (Бухгалтерия, ERP, КА) программисты часто сталкиваются с ситуацией, когда стандартная логика печати кажется запутанной. В частности, возникает вопрос: откуда система берет макет с именем УКДСтатус1_2023Кв4, если в явном виде в модуле менеджера документа он может не фигурировать?

В этой статье мы подробно разберем механизм выбора печатных форм универсальных корректировочных документов (УКД), выясним, почему появляются суффиксы вроде "2023Кв4", и научимся правильно создавать внешние печатные формы, которые автоматически подстраиваются под изменения законодательства.

Законодательный контекст: почему "2023Кв4"?

Прежде чем углубляться в код, давайте поймем природу названия макета. Суффикс 2023Кв4 указывает на четвертый квартал 2023 года. Это связано с изменениями в законодательстве РФ (Федеральный закон № 389-ФЗ), вступившими в силу с 1 октября 2023 года.

Основные изменения коснулись графы 14 табличной части ("Стоимость товара, подлежащего прослеживаемости"). Даже если ваша организация не ведет учет прослеживаемых товаров, использование старого бланка для документов, выписанных после 01.10.2023, является нарушением формата. Именно поэтому разработчики 1С внедрили механизм, который "жестко" переключает макеты в зависимости от даты документа.

Где искать логику выбора макета в коде?

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

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

Давайте разберем, как работает этот механизм маршрутизации:

  1. Система анализирует дату документа.
  2. Если дата меньше 01.07.2017 — выбирается архивный макет.
  3. Если дата в интервале до 01.10.2023 — используется промежуточный макет (часто с суффиксом _534 или _981).
  4. Если дата >= 01.10.2023 — система принудительно подставляет имя макета УКДСтатус1_2023Кв4 (для статуса 1) или соответствующий для статуса 2.

Сам макет (MXL) физически чаще всего находится в обработке ПечатьУКД или в составе Общих макетов конфигурации, а не в самом документе. Это сделано для унификации, так как УКД может печататься из разных документов-оснований (например, из возврата товаров).

Что такое КоллекцияПечатныхФорм и откуда она берется?

В вопросе также упоминалась переменная КоллекцияПечатныхФорм внутри процедуры печати. Важно понимать, что это часть механизма Библиотеки Стандартных Подсистем (БСП).

Она не "берется из ниоткуда". Процесс выглядит так:

  1. Пользователь нажимает кнопку "Печать".
  2. Вызывается общая команда подсистемы печати.
  3. Подсистема создает пустую таблицу значений через функцию УправлениеПечатью.СоздатьКоллекциюПечатныхФорм.
  4. Эта пустая (или частично заполненная) коллекция передается в экспортную процедуру Печать менеджера вашего документа.
  5. Внутри процедуры Печать код конфигурации добавляет в эту коллекцию строки: имя макета, синоним, табличный документ или двоичные данные.

Как правильно создать Внешнюю Печатную Форму (ВПФ)?

Самая распространенная ошибка при создании ВПФ для таких сложных документов, как УКД или УПД — это попытка скопировать макет к себе в обработку и жестко прописать его имя.

Например, если вы напишете код так:


// Плохой пример: жесткая привязка
ИмяМакета = "УКДСтатус1_2023Кв4";
Макет = ПолучитьМакет(ИмяМакета); 
// ...заполнение областей...

Почему это плохо? Как только выйдет новое постановление правительства (например, "2024Кв1"), типовая конфигурация обновится и начнет использовать новый макет. Ваша внешняя печатная форма продолжит печатать старый бланк 2023Кв4, что может привести к претензиям со стороны налоговой инспекции у пользователей.

Правильный подход: использование стандартных механизмов

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

Разберем алгоритм действий для модуля внешней обработки:

1. Регистрация команды

В функции СведенияОВнешнейОбработке мы регистрируем команду. Обратите внимание, что идентификатор команды не обязан совпадать с именем макета.


Функция СведенияОВнешнейОбработке() Экспорт
    // ... инициализация параметров регистрации ...
    
    // Добавляем команду
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "УКД (Внешняя)";
    НоваяКоманда.Идентификатор = "УКД_Внешняя"; // Произвольный ID
    НоваяКоманда.Использование = "ВызовСерверногоМетода";
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;
КонецФункции

2. Реализация печати с вызовом типового механизма

В процедуре Печать мы не формируем макет с нуля. Мы обращаемся к менеджеру печати (обычно это обработка ПечатьУКД или модуль менеджера документа).


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

    // 1. Создаем структуру для хранения коллекции, которую заполнит типовой механизм
    ТиповаяКоллекция = УправлениеПечатью.СоздатьКоллекциюПечатныхФорм();
    
    // 2. Вызываем типовой метод формирования УКД.
    // Важно: здесь система САМА определит, какой макет нужен (2023Кв4 или другой)
    // в зависимости от даты документа в МассивОбъектов.
    // Путь к процедуре может отличаться в разных конфигурациях, проверьте модуль менеджера
    // документа КорректировкаРеализации, процедуру Печать.
    
    // Пример для БП 3.0 (часто печать идет через общую обработку):
    ОбработкаПечатьУКД = Обработки.ПечатьУКД.Создать();
    // Часто параметры передаются иначе, нужно смотреть типовой код вызова печати УКД
    // Но суть одна - вызвать типовую процедуру.
    
    // Если печать реализована в менеджере документа:
    Документы.КорректировкаРеализации.Печать(МассивОбъектов, ПараметрыПечати, ТиповаяКоллекция, ОбъектыПечати, ПараметрыВывода);
    
    // 3. Переносим результат в нашу коллекцию
    Для Каждого СтрокаТиповой Из ТиповаяКоллекция Цикл
        // Ищем нужную форму. Обычно типовой механизм возвращает несколько форм.
        // Нам нужна именно УКД (УниверсальныйКорректировочныйДокумент).
        
        Если Найти(СтрокаТиповой.ИмяВРЕГ, "УНИВЕРСАЛЬНЫЙКОРРЕКТИРОВОЧНЫЙДОКУМЕНТ") > 0 Тогда
             
             НоваяСтрока = КоллекцияПечатныхФорм.Добавить();
             НоваяСтрока.ИмяВРЕГ = "УКД_ВНЕШНЯЯ"; // Наш ID команды
             НоваяСтрока.ИмяМакета = "УКД_Внешняя"; 
             НоваяСтрока.СинонимМакета = "УКД (Внешняя)";
             НоваяСтрока.ТабличныйДокумент = СтрокаТиповой.ТабличныйДокумент;
             
             // Если нужно доработать макет - делаем это здесь с ТабличнымДокументом
             // Например: НоваяСтрока.ТабличныйДокумент.Области.Заголовок.Текст = "Копия";
        КонецЕсли;
    КонецЦикла;

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

Нюанс со статусами (Статус 1 и Статус 2)

В теме также упоминался "Статус 1". В 1С существуют разные макеты для разных статусов:

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

Резюме

  1. Макет УКДСтатус1_2023Кв4 выбирается динамически на основе даты документа (>= 01.10.2023).
  2. Логика выбора находится в функции получения настроек печати (например, ПолучитьНастройкиПечатиУниверсальныхКорректировочныхДокументов).
  3. При создании внешней печатной формы не рекомендуется копировать макеты.
  4. Лучшее решение — вызывать в своей обработке типовую процедуру печати, получать готовый табличный документ из типовой коллекции и при необходимости модифицировать его программно.
← На главную