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