Печать ценников и этикеток — одна из самых востребованных задач в торговых и производственных конфигурациях. При работе в 1С:Управлении производственным предприятием (УПП) 1.3 на обычных формах часто возникает необходимость добавить в стандартный ценник визуальную информацию: основное изображение товара и его штрихкод. Рассмотрим подробнее, как реализовать этот функционал, разберем типичные ошибки новичков и оптимизируем код для стабильной работы.
Часто при написании кода самоучки допускают критическую ошибку — создание вложенных циклов там, где они не требуются. Проанализируем ситуацию: если у нас есть массив товаров, и мы обходим его циклом Для Каждого, то внутри этого цикла не должен находиться еще один такой же обход той же самой таблицы. Это приводит к геометрической прогрессии количества распечатанных этикеток. Выясним причину дублирования на примере: если во внутреннем цикле мы используем переменную СтрокаТаблицы.Количество, это должно служить только для повторения печати одной и той же этикетки нужное число раз, а не для повторного перебора всей таблицы товаров.
Рассмотрим правильную структуру основного цикла печати:
Для Каждого СтрокаТаблицы Из Товары Цикл
Если НЕ СтрокаТаблицы.Печать Тогда
Продолжить;
КонецЕсли;
// Получаем изображение и данные здесь
// ...
Для Тмп = 1 По СтрокаТаблицы.Количество Цикл
// Выводим область макета в табличный документ
КонецЦикла;
КонецЦикла;
Одной из главных проблем при печати ценников с картинками является отсутствие изображения у некоторых позиций номенклатуры. Если код не содержит проверки на Неопределено, программа выдаст ошибку при попытке обращения к свойствам хранилища. Разберем по шагам, как корректно получить картинку и вывести ее в макет.
В УПП 1.3 изображения хранятся в справочнике ХранилищеДополнительнойИнформации. Чтобы получить саму картинку, нам нужно обратиться к реквизиту ОсновноеИзображение, затем к Хранилище и выполнить метод Получить(). Посмотрим на пример кода с проверкой:
Изображение = СтрокаТаблицы.Номенклатура.ОсновноеИзображение.Хранилище.Получить();
Если Изображение = Неопределено Тогда
// Если картинки нет, выбираем область макета без картинки
ОбластьЦенника = Макет.ПолучитьОбласть("СтрокаБезКартинки|Столбец");
Иначе
// Если картинка есть, работаем с областью, где предусмотрен объект "Рисунок"
ОбластьЦенника = Макет.ПолучитьОбласть("СтрокаСКартинкой|Столбец");
ОбластьЦенника.Рисунки.Изображение.Картинка = Изображение;
КонецЕсли;
Важный момент: Чтобы избежать "разъезжания" макета, убедитесь, что в свойствах рисунка в самом макете 1С установлено значение "Автомасштаб". Это позволит картинкам разного разрешения корректно вписываться в отведенную рамку этикетки.
При печати на обычном листе А4 важно экономно использовать пространство, располагая несколько ценников в ряд. Для этого мы будем использовать методы табличного документа Вывести() и Присоединить(). Метод Вывести() всегда начинает новую строку, а Присоединить() добавляет область справа от предыдущей.
Проанализируем алгоритм вывода, например, по 3 ценника в ряд:
ТекущаяКолонка.Вывести().Присоединить().Пример реализации этой логики:
ТекущаяКолонка = 0;
МаксКолонок = 3; // Количество этикеток в ряд
Для Каждого СтрокаТаблицы Из Товары Цикл
// ... подготовка области ОбластьЦенника ...
Если ТекущаяКолонка = 0 Тогда
ТабДокумент.Вывести(ОбластьЦенника);
Иначе
ТабДокумент.Присоединить(ОбластьЦенника);
КонецЕсли;
ТекущаяКолонка = ТекущаяКолонка + 1;
Если ТекущаяКолонка >= МаксКолонок Тогда
ТекущаяКолонка = 0;
КонецЕсли;
КонецЦикла;
Для вывода штрихкода в 1С обычно используется внешняя компонента 1С:Печать штрихкодов. Посмотрим на типичную ошибку: обращение к штрихкоду как к обычному параметру. На самом деле штрихкод в макете — это объект типа "Рисунок", и управлять им нужно через свойство Объект. Рассмотрим, как программно передать значение штрихкода в макет:
Попытка
// Работаем с рисунком "Штрихкод" в области макета
РисунокШК = ОбластьЦенника.Рисунки.Штрихкод;
РисунокШК.Объект.Сообщение = СтрокаТаблицы.Штрихкод;
РисунокШК.Объект.ТипКода = 1; // Например, EAN13
Исключение
Сообщить("Ошибка при формировании штрихкода для: " + СтрокаТаблицы.Номенклатура);
КонецПопытки;
Совет по оптимизации: Не выполняйте запрос к регистру сведений Штрихкоды внутри цикла. Это значительно замедляет печать, если в списке сотни товаров. Правильнее будет одним запросом получить все штрихкоды для списка товаров еще до начала цикла и поместить их в Соответствие или временную таблицу.
Чтобы результат выглядел профессионально и корректно отправлялся на принтер, необходимо задать параметры страницы табличного документа. Выясним, какие настройки критичны для этикеток:
ТабДокумент.АвтоМасштаб = Истина; — поможет вписать ценники в ширину листа.ОриентацияСтраницы.Портрет.ТабДокумент.ТолькоПросмотр = Истина; — чтобы пользователь не мог случайно изменить данные перед печатью.Используя предложенные подходы, мы получим гибкий инструмент для формирования ценников. Помните, что разделение макета на разные области (с картинкой и без) — это более надежный путь, чем попытка программно удалять объекты из одной универсальной области, так как это сохраняет структуру и размеры ячеек неизменными.