Как добавить штрихкод товара в печатную форму накладной в 1С?

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

При разработке внешних печатных форм часто возникает необходимость дополнить стандартный макет (например, форму З-2 или обычную накладную) данными, которых нет в табличной части документа. Одной из самых востребованных задач является вывод штрихкода товара. Рассмотрим подробнее, как правильно изменить запрос, обработать данные и избежать типичных ошибок, таких как «Ошибка преобразования к числу».

Шаг 1. Модификация запроса для получения штрихкода

Для того чтобы вывести штрихкод, нам необходимо соединить таблицу товаров документа с регистром сведений ШтрихкодыНоменклатуры (или Штрихкоды в более старых версиях). Разберем ситуацию на примере документа РеализацияТоваровУслуг. Нам важно учитывать, что у одного товара может быть несколько штрихкодов, поэтому прямое левое соединение без группировки может привести к дублированию строк в накладной.

Проанализируем пример корректного запроса, где мы используем вложенный запрос для получения одного уникального штрихкода на каждую позицию:


ВЫБРАТЬ
    РеализацияТовары.Номенклатура КАК Номенклатура,
    РеализацияТовары.НомерСтроки КАК НомерСтроки,
    РеализацияТовары.Количество КАК Количество,
    РеализацияТовары.Цена КАК Цена,
    РеализацияТовары.Сумма КАК Сумма,
    ЕСТЬNULL(ВложенныйШтрихкоды.Штрихкод, "") КАК Штрихкод
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
    ЛЕВОЕ СОЕДИНЕНИЕ (
        ВЫБРАТЬ
            Штрихкоды.Номенклатура КАК Номенклатура,
            МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
        ИЗ
            РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
        ГРУППИРОВАТЬ ПО
            Штрихкоды.Номенклатура
    ) КАК ВложенныйШтрихкоды
    ПО РеализацияТовары.Номенклатура = ВложенныйШтрихкоды.Номенклатура
ГДЕ
    РеализацияТовары.Ссылка В(&МассивОбъектов)
УПОРЯДОЧИТЬ ПО
    НомерСтроки

Важный момент: использование функции МАКСИМУМ во вложенном запросе гарантирует, что если для товара задано несколько кодов, в печатную форму попадет только один из них, и строки документа не «размножатся».

Шаг 2. Обработка пустых значений (NULL)

Выясним причину, по которой штрихкод может не выводиться или вызывать ошибки в коде. Так как мы используем ЛЕВОЕ СОЕДИНЕНИЕ, для товаров, у которых штрихкод не задан в базе, запрос вернет значение NULL. Если в модуле печати вы попытаетесь применить к этому значению строковые функции, например СокрЛП(), программа может выдать ошибку.

Для решения этой проблемы в тексте запроса всегда используйте конструкцию ЕСТЬNULL(ИмяПоля, ""). Это преобразует пустое значение в пустую строку прямо на уровне базы данных, что сделает дальнейшую работу с выборкой безопасной.

Шаг 3. Устранение ошибки «Преобразование к числу»

Часто программисты сталкиваются с тем, что запрос отрабатывает верно, но при выводе области в ТабличныйДокумент возникает ошибка преобразования типа. Проанализируем основные причины этого поведения:

  1. Свойство «Формат» в макете: Это самая частая причина. Если вы скопировали ячейку для штрихкода из колонки «Количество» или «Сумма», в свойствах ячейки макета (MXL) могло сохраниться числовое форматирование. 1С видит длинную последовательность цифр штрихкода и пытается применить к ней правила отображения чисел (например, группировку разрядов). Если штрихкод содержит буквы или слишком длинен, возникает сбой. Решение: откройте свойства ячейки в макете и полностью очистите поле «Формат».
  2. Тип значения в макете: Убедитесь, что для ячейки установлено значение «Параметр», а не «Текст» или «Шаблон», если вы заполняете её напрямую из кода.
  3. Итоги в подвале: Проверьте, не попадает ли имя параметра штрихкода в область итогов, где срабатывает агрегатная функция (например, сумма по колонке). Программа может пытаться просуммировать штрихкоды как числа.

Шаг 4. Учет единиц измерения

В конфигурациях вроде «Бухгалтерия для Казахстана» штрихкоды часто привязаны не только к номенклатуре, но и к конкретной единице измерения. Рассмотрим ситуацию: товар может продаваться в «штуках» и «коробках», и у каждой упаковки свой штрихкод.

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


// Фрагмент связи в запросе
ПО РеализацияТовары.Номенклатура = ВложенныйШтрихкоды.Номенклатура
И РеализацияТовары.ЕдиницаИзмерения = ВложенныйШтрихкоды.ЕдиницаИзмерения

Это позволит выводить именно тот штрихкод, который соответствует выбранной в документе упаковке.

Шаг 5. Вывод данных в макет

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


Пока ВыборкаСтрокТовары.Следующий() Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрокТовары);
    
    // Если нужно дополнительно обработать штрихкод
    Если ЗначениеЗаполнено(ВыборкаСтрокТовары.Штрихкод) Тогда
        ОбластьСтрока.Параметры.Штрихкод = ВыборкаСтрокТовары.Штрихкод;
    Иначе
        ОбластьСтрока.Параметры.Штрихкод = "---";
    КонецЕсли;
    
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Использование метода Параметры.Заполнить() позволяет автоматически подставить значение штрихкода в ячейку макета, если имя параметра в макете совпадает с именем поля в запросе.

Дополнительные рекомендации

Если ваша задача — вывести штрихкод не просто цифрами, а в виде графического кода для сканирования, вам потребуется использование внешней компоненты «1С:Печать штрихкодов». В этом случае в макет вставляется объект «Рисунок» (тип «Картинка»), а в коде вызывается функция генерации изображения на основе строкового значения штрихкода. Однако для большинства стандартных накладных (например, форма З-2) достаточно текстового представления в отдельной колонке, что мы и разобрали выше.

Соблюдение этих правил — использование ЕСТЬNULL, группировка во вложенных запросах и проверка формата ячеек макета — позволит вам создать надежную и отказоустойчивую печатную форму.

← На главную