Как реализовать печать ценников и этикеток с изображением и штрихкодом в 1С:УПП 1.3

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

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

Анализ структуры алгоритма и исправление логических ошибок

Часто при написании кода самоучки допускают критическую ошибку — создание вложенных циклов там, где они не требуются. Проанализируем ситуацию: если у нас есть массив товаров, и мы обходим его циклом Для Каждого, то внутри этого цикла не должен находиться еще один такой же обход той же самой таблицы. Это приводит к геометрической прогрессии количества распечатанных этикеток. Выясним причину дублирования на примере: если во внутреннем цикле мы используем переменную СтрокаТаблицы.Количество, это должно служить только для повторения печати одной и той же этикетки нужное число раз, а не для повторного перебора всей таблицы товаров.

Рассмотрим правильную структуру основного цикла печати:


Для Каждого СтрокаТаблицы Из Товары Цикл
    Если НЕ СтрокаТаблицы.Печать Тогда
        Продолжить;
    КонецЕсли;

    // Получаем изображение и данные здесь
    // ...
    
    Для Тмп = 1 По СтрокаТаблицы.Количество Цикл
        // Выводим область макета в табличный документ
    КонецЦикла;
КонецЦикла;

Работа с изображениями номенклатуры и обработка исключений

Одной из главных проблем при печати ценников с картинками является отсутствие изображения у некоторых позиций номенклатуры. Если код не содержит проверки на Неопределено, программа выдаст ошибку при попытке обращения к свойствам хранилища. Разберем по шагам, как корректно получить картинку и вывести ее в макет.

В УПП 1.3 изображения хранятся в справочнике ХранилищеДополнительнойИнформации. Чтобы получить саму картинку, нам нужно обратиться к реквизиту ОсновноеИзображение, затем к Хранилище и выполнить метод Получить(). Посмотрим на пример кода с проверкой:


Изображение = СтрокаТаблицы.Номенклатура.ОсновноеИзображение.Хранилище.Получить();

Если Изображение = Неопределено Тогда
    // Если картинки нет, выбираем область макета без картинки
    ОбластьЦенника = Макет.ПолучитьОбласть("СтрокаБезКартинки|Столбец");
Иначе
    // Если картинка есть, работаем с областью, где предусмотрен объект "Рисунок"
    ОбластьЦенника = Макет.ПолучитьОбласть("СтрокаСКартинкой|Столбец");
    ОбластьЦенника.Рисунки.Изображение.Картинка = Изображение;
КонецЕсли;

Важный момент: Чтобы избежать "разъезжания" макета, убедитесь, что в свойствах рисунка в самом макете 1С установлено значение "Автомасштаб". Это позволит картинкам разного разрешения корректно вписываться в отведенную рамку этикетки.

Вывод этикеток в несколько колонок (логика "плитки")

При печати на обычном листе А4 важно экономно использовать пространство, располагая несколько ценников в ряд. Для этого мы будем использовать методы табличного документа Вывести() и Присоединить(). Метод Вывести() всегда начинает новую строку, а Присоединить() добавляет область справа от предыдущей.

Проанализируем алгоритм вывода, например, по 3 ценника в ряд:

  1. Создаем переменную-счетчик ТекущаяКолонка.
  2. Для первой этикетки в ряду (когда счетчик равен 0) используем метод Вывести().
  3. Для последующих (когда счетчик > 0 и < 3) используем метод Присоединить().
  4. Как только счетчик достигает 3, обнуляем его, чтобы следующая этикетка снова начала новую строку.

Пример реализации этой логики:


ТекущаяКолонка = 0;
МаксКолонок = 3; // Количество этикеток в ряд

Для Каждого СтрокаТаблицы Из Товары Цикл
    // ... подготовка области ОбластьЦенника ...
    
    Если ТекущаяКолонка = 0 Тогда
        ТабДокумент.Вывести(ОбластьЦенника);
    Иначе
        ТабДокумент.Присоединить(ОбластьЦенника);
    КонецЕсли;

    ТекущаяКолонка = ТекущаяКолонка + 1;
    
    Если ТекущаяКолонка >= МаксКолонок Тогда
        ТекущаяКолонка = 0;
    КонецЕсли;
КонецЦикла;

Программное формирование штрихкода

Для вывода штрихкода в 1С обычно используется внешняя компонента 1С:Печать штрихкодов. Посмотрим на типичную ошибку: обращение к штрихкоду как к обычному параметру. На самом деле штрихкод в макете — это объект типа "Рисунок", и управлять им нужно через свойство Объект. Рассмотрим, как программно передать значение штрихкода в макет:


Попытка
    // Работаем с рисунком "Штрихкод" в области макета
    РисунокШК = ОбластьЦенника.Рисунки.Штрихкод;
    РисунокШК.Объект.Сообщение = СтрокаТаблицы.Штрихкод;
    РисунокШК.Объект.ТипКода = 1; // Например, EAN13
Исключение
    Сообщить("Ошибка при формировании штрихкода для: " + СтрокаТаблицы.Номенклатура);
КонецПопытки;

Совет по оптимизации: Не выполняйте запрос к регистру сведений Штрихкоды внутри цикла. Это значительно замедляет печать, если в списке сотни товаров. Правильнее будет одним запросом получить все штрихкоды для списка товаров еще до начала цикла и поместить их в Соответствие или временную таблицу.

Окончательная настройка печатной формы

Чтобы результат выглядел профессионально и корректно отправлялся на принтер, необходимо задать параметры страницы табличного документа. Выясним, какие настройки критичны для этикеток:

Используя предложенные подходы, мы получим гибкий инструмент для формирования ценников. Помните, что разделение макета на разные области (с картинкой и без) — это более надежный путь, чем попытка программно удалять объекты из одной универсальной области, так как это сохраняет структуру и размеры ячеек неизменными.

← На главную