Как добавить букву или префикс перед штрихкодом при печати ценников в 1С:Розница

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

При оформлении ценников и этикеток в розничной торговле нередко возникает необходимость модифицировать стандартный штрихкод. Например, добавить к нему определенный буквенный префикс (например, букву "V" для формата Code39), чтобы визуально или технически выделить определенную группу товаров. В типовом решении «1С:Розница» генерация штрихкодов происходит динамически с использованием Схемы компоновки данных (СКД).

В этой статье мы подробно разберем, как решить эту задачу несколькими способами: через доработку запроса СКД, с помощью механизма вычисляемых полей (что гораздо безопаснее для последующих обновлений системы), а также рассмотрим важные технические нюансы работы со сканерами штрихкодов и форматом Code39.

Выясняем причину: почему простая конкатенация строк не работает в запросах 1С

Казалось бы, самая очевидная идея — просто прибавить символ к полю штрихкода в запросе. Например, написать конструкцию вида: "V" + Штрихкоды.Штрихкод. Однако при попытке выполнить такой запрос платформа выдаст ошибку совместимости типов СУБД.

Это связано со строгими правилами работы SQL-серверов. База данных не может напрямую объединить строковый литерал (фиксированный символ "V") и поле таблицы, которое имеет неограниченную длину или длину, неопределенную на этапе компиляции запроса. Для успешного сложения строк на уровне СУБД оба операнда должны быть приведены к типу «Строка фиксированной длины».

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

Способ 1. Модификация типового запроса СКД с помощью функции ПОДСТРОКА

Если мы решим пойти путем изменения исходного запроса в схеме компоновки данных, нам потребуется использовать стандартную функцию языка запросов 1С — ПОДСТРОКА. Эта функция принудительно ограничивает длину выбираемой строки, переводя ее в нужный формат для базы данных.

Рассмотрим структуру типового запроса, который отвечает за получение штрихкодов номенклатуры в «1С:Розница»:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Штрихкоды.Владелец КАК Номенклатура,
    Штрихкоды.Характеристика КАК Характеристика,
    Штрихкоды.Упаковка КАК Упаковка,
    МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
ПОМЕСТИТЬ ШтрихкодыНоменклатуры
ИЗ
    РегистрСведений.Штрихкоды КАК Штрихкоды
ГДЕ
    (Штрихкоды.Владелец, Штрихкоды.Характеристика, Штрихкоды.Упаковка) В
            (ВЫБРАТЬ
                ИсходныеДанныеИзмененные.Номенклатура,
                ИсходныеДанныеИзмененные.Характеристика,
                ИсходныеДанныеИзмененные.Упаковка
            ИЗ
                ИсходныеДанныеИзмененные)
{ГДЕ
    Штрихкоды.Владелец.* КАК Номенклатура,
    Штрихкоды.Характеристика.*,
    Штрихкоды.Упаковка.*}
СГРУППИРОВАТЬ ПО
    Штрихкоды.Владелец,
    Штрихкоды.Характеристика,
    Штрихкоды.Упаковка
ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Характеристика,
    Упаковка
;

Чтобы добавить букву "V" в начало штрихкода, нам нужно изменить строчку выбора поля штрихкода в секции МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод.

Для обхода ограничения СУБД мы применим функцию ПОДСТРОКА как к нашему префиксу, так и к самому штрихкоду из базы данных. Измененная строка запроса будет выглядеть следующим образом:


МАКСИМУМ(ПОДСТРОКА("V", 1, 1) + ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 20)) КАК Штрихкод

В этой конструкции:

  1. ПОДСТРОКА("V", 1, 1) — берет первый символ от строки "V", фиксируя длину литерала.
  2. ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 20) — ограничивает длину штрихкода из базы данных первыми 20 символами (этого более чем достаточно для большинства стандартов штрихкодирования, включая EAN-13 и Code39).
  3. Знак + производит корректное математическое сложение (конкатенацию) двух строковых полей фиксированной длины на уровне СУБД.

Способ 2. Использование Вычисляемых полей СКД (рекомендуемый метод)

Прямое редактирование текста типового запроса имеет существенный недостаток: при обновлении конфигурации «1С:Розница» эти изменения могут быть затерты или привести к конфликтам при сравнении и объединении объектов. Более гибким, красивым и «правильным» с точки зрения методологии разработки в 1С является использование механизма Вычисляемых полей в Системе компоновки данных.

Вычисления в этой вкладке выполняются непосредственно платформой «1С:Предприятие 8» на стороне клиента или сервера приложений, а не базой данных (СУБД). Это позволяет использовать простую конкатенацию строк без вызова сложных функций ограничения длины.

Разберем процесс настройки по шагам:

  1. Откройте схему компоновки данных (СКД) макета ценника или этикетки в режиме конфигуратора.
  2. Перейдите на вкладку «Вычисляемые поля».
  3. Добавьте новую строку в таблицу.
  4. Задайте следующие параметры для нового поля:
    • Путь к данным: укажите уникальное имя, например, ШтрихкодСБуквой.
    • Выражение: напишите формулу "V" + [Штрихкод], где [Штрихкод] — исходное поле из вашего запроса.
    • Заголовок: введите понятное название, например, Штрихкод с префиксом V.
  5. Перейдите на вкладку «Настройки» и в структуре выводимых полей (или в свойствах шаблона этикетки) замените стандартное поле Штрихкод на ваше новое вычисляемое поле ШтрихкодСБуквой.

Такой подход полностью исключает необходимость редактирования SQL-запроса и сохраняет структуру метаданных в чистоте.

Особенности формата Code39 и использование символов Start/Stop

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

Возможные проблемы со сканированием и обратная совместимость

Добавление префикса "V" непосредственно в графическое изображение штрихкода на ценнике влечет за собой важные организационные последствия для работы кассовой зоны:

Проблема поиска товара в базе данных: при считывании измененного штрихкода сканером на кассе, устройство передаст в систему строку, начинающуюся с символа "V" (например, "V123456"). Если в регистре сведений Штрихкоды этот товар зарегистрирован по старому коду (без буквы, просто "123456"), программа выдаст ошибку «Товар не найден».

Решить эту проблему можно двумя путями:

  1. Перерегистрация штрихкодов в базе: перезаписать все штрихкоды в карточках номенклатуры, добавив к ним префикс "V" на уровне хранения данных.
  2. Программная обработка префиксов (Префиксация): настроить сканеры штрихкодов или саму обработку драйвера торгового оборудования в «1С» на автоматическое отсечение первого символа при чтении кодов типа Code39. Также можно доработать модуль конфигурации, отвечающий за поиск номенклатуры при сканировании, чтобы при неудачном поиске система пробовала отсечь первую букву и выполнить поиск повторно.

Проанализировав все варианты, мы рекомендуем использовать метод Вычисляемых полей СКД как наиболее стабильный и поддерживаемый инструмент для кастомизации макетов этикеток в семействе программ «1С:Предприятие 8».

← На главную