Механизм печати этикеток и ценников в современных редакциях 1С (ERP 2.5, КА 2.5, УТ 11.5) является достаточно сложным и многоуровневым — для вывода дополнительных реквизитов (серий, упаковок, количеств) на одном бланке есть расширение печати этикеток для 1С:УТ, КА и ERP. Он построен на использовании схем компоновки данных (СКД), динамическом формировании структур и кешировании параметров в хранилищах значений. Часто программисты сталкиваются с ситуацией, когда поле добавлено в запрос и макет, но при печати оно остается пустым. Разберем по шагам, как правильно внедрить свое поле в этот механизм, чтобы данные корректно выводились на печать.
Прежде чем приступать к написанию кода, проанализируем, как система понимает, какие поля доступны для печати. Основным «поставщиком» описания доступных полей является обработка ПечатьЭтикетокИЦенников. В ней содержатся макеты СКД, которые система разбирает для построения списка доступных параметров в пользовательском конструкторе шаблонов.
Для решения нашей задачи нам потребуется внести изменения в три основных блока:
Первым делом откроем обработку ПечатьЭтикетокИЦенников. Нас интересуют макеты с именами ПоляШаблонаТовары и ПоляШаблонаБДТовары. Именно эти схемы компоновки данных отвечают за то, какие поля увидит пользователь, когда нажмет кнопку «Редактировать макет» в справочнике шаблонов.
Рассмотрим подробнее действия в СКД:
После того как мы описали поле в макете, нам нужно подготовить место для хранения этого значения в интерфейсе обработки. На форме обработки ПечатьЭтикетокИЦенников найдем табличную часть Товары.
Добавим в эту табличную часть новую колонку с тем же именем, которое мы использовали в запросе СКД. Это критически важно: имя колонки в ТЧ должно строго совпадать с именем поля в схеме компоновки данных.
Теперь выясним причину, по которой данные могут не попадать в нашу новую колонку. Нам нужно найти процедуру, отвечающую за заполнение таблицы товаров. В модуле формы это обычно ЗаполнитьТаблицуТоваровНаСервере.
Проанализируем ситуацию: если мы хотим, чтобы поле заполнялось автоматически при подборе товара, нам нужно модифицировать логику запроса, который собирает данные о товарах. Если данные должны подтягиваться из базы при нажатии кнопки «Заполнить», добавим соответствующий код в процедуру заполнения.
Пример модификации может выглядеть так:
// В процедуре ЗаполнитьТаблицуТоваровНаСервере
Для Каждого СтрокаТовар Из Объект.Товары Цикл
// Ваша логика получения значения
СтрокаТовар.МоеНовоеПоле = ПолучитьДополнительноеЗначение(СтрокаТовар.Номенклатура);
КонецЦикла;
Многие разработчики забывают о том, что справочник ШаблоныЭтикетокИЦенников сам «разбирает» макет и кэширует список параметров — для задач расширения состава реквизитов есть обработка вывода штрихкода GTIN на этикетки в ERP, КА, УТ. За это отвечает процедура ПодготовитьСтруктуруМакетаШаблона в модуле менеджера справочника.
Разберем по шагам, что там происходит:
[МоеНовоеПоле]).Если вы используете расширение, убедитесь, что вы переопределили или дополнили логику в этом модуле, если система не видит ваш параметр автоматически. Однако, как правило, если поле корректно добавлено в СКД обработки ПечатьЭтикетокИЦенников, процедура подготовки структуры должна подхватить его без дополнительных правок.
Даже если в таблице на форме данные есть, при нажатии кнопки «Печать» формируется отдельная структура данных. Здесь в игру вступает процедура УстановитьОбязательныеПоляДанных в модуле формы обработки.
Система оптимизирует запросы и по умолчанию выбирает из ТЧ только те поля, которые визуально присутствуют в выбранном шаблоне. Нам нужно гарантировать, что наше поле попадет в выборку. Проанализируем код:
&НаСервере
Процедура УстановитьОбязательныеПоляДанных(СхемаКомпоновки)
// Здесь система добавляет поля, которые ВСЕГДА должны быть в результате запроса
// Добавим наше поле в список обязательных, если это необходимо
НовоеПоле = СхемаКомпоновки.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НовоеПоле.Поле = "МоеНовоеПоле";
НовоеПоле.ПутьКДанным = "МоеНовоеПоле";
КонецПроцедуры
Также стоит обратить внимание на модуль ПечатьЭтикетокИЦенниковЛогика (или аналогичный серверный модуль). В нем происходит финальная «склейка» данных товаров, цен и штрихкодов. Убедитесь, что ваше поле не теряется в процессе объединения таблиц значений (метод ПолучитьДанныеДляПечати).
Создание нового шаблона: После внесения изменений в код и макеты СКД, старые шаблоны этикеток, созданные пользователями, могут «не знать» о существовании нового поля. Рекомендуется создать новый шаблон с нуля, чтобы система заново проинициализировала структуру параметров из обновленных макетов.
Кеширование: В 1С:ERP активно используется кеширование метаданных. При разработке через расширение иногда требуется перезапуск сеанса или даже очистка серверного кеша, чтобы изменения в СКД макетах обработки вступили в силу для конструктора шаблонов.
Тип заполнения в макете: В самом редакторе шаблона (в справочнике) убедитесь, что для ячейки с вашим полем в свойствах установлено «Заполнение: Параметр». Если там стоит «Текст», то 1С просто напечатает имя вашего поля как обычное слово.
Подводя итог: добавление своего поля — это цепочка действий от макета СКД в обработке до колонок в табличной части формы и контроля обязательных полей при печати. Если на каком-то этапе цепочка прервется (например, имя поля в ТЧ не совпадет с именем в СКД), данные на печать не выведутся.