При оформлении ценников и этикеток в розничной торговле нередко возникает необходимость модифицировать стандартный штрихкод. Например, добавить к нему определенный буквенный префикс (например, букву "V" для формата Code39), чтобы визуально или технически выделить определенную группу товаров. В типовом решении «1С:Розница» генерация штрихкодов происходит динамически с использованием Схемы компоновки данных (СКД).
В этой статье мы подробно разберем, как решить эту задачу несколькими способами: через доработку запроса СКД, с помощью механизма вычисляемых полей (что гораздо безопаснее для последующих обновлений системы), а также рассмотрим важные технические нюансы работы со сканерами штрихкодов и форматом Code39.
Казалось бы, самая очевидная идея — просто прибавить символ к полю штрихкода в запросе. Например, написать конструкцию вида: "V" + Штрихкоды.Штрихкод. Однако при попытке выполнить такой запрос платформа выдаст ошибку совместимости типов СУБД.
Это связано со строгими правилами работы SQL-серверов. База данных не может напрямую объединить строковый литерал (фиксированный символ "V") и поле таблицы, которое имеет неограниченную длину или длину, неопределенную на этапе компиляции запроса. Для успешного сложения строк на уровне СУБД оба операнда должны быть приведены к типу «Строка фиксированной длины».
Давайте разберем по шагам, как решить эту проблему непосредственно в запросе и альтернативными методами.
Если мы решим пойти путем изменения исходного запроса в схеме компоновки данных, нам потребуется использовать стандартную функцию языка запросов 1С — ПОДСТРОКА. Эта функция принудительно ограничивает длину выбираемой строки, переводя ее в нужный формат для базы данных.
Рассмотрим структуру типового запроса, который отвечает за получение штрихкодов номенклатуры в «1С:Розница»:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Штрихкоды.Владелец КАК Номенклатура,
Штрихкоды.Характеристика КАК Характеристика,
Штрихкоды.Упаковка КАК Упаковка,
МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
ПОМЕСТИТЬ ШтрихкодыНоменклатуры
ИЗ
РегистрСведений.Штрихкоды КАК Штрихкоды
ГДЕ
(Штрихкоды.Владелец, Штрихкоды.Характеристика, Штрихкоды.Упаковка) В
(ВЫБРАТЬ
ИсходныеДанныеИзмененные.Номенклатура,
ИсходныеДанныеИзмененные.Характеристика,
ИсходныеДанныеИзмененные.Упаковка
ИЗ
ИсходныеДанныеИзмененные)
{ГДЕ
Штрихкоды.Владелец.* КАК Номенклатура,
Штрихкоды.Характеристика.*,
Штрихкоды.Упаковка.*}
СГРУППИРОВАТЬ ПО
Штрихкоды.Владелец,
Штрихкоды.Характеристика,
Штрихкоды.Упаковка
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Характеристика,
Упаковка
;
Чтобы добавить букву "V" в начало штрихкода, нам нужно изменить строчку выбора поля штрихкода в секции МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод.
Для обхода ограничения СУБД мы применим функцию ПОДСТРОКА как к нашему префиксу, так и к самому штрихкоду из базы данных. Измененная строка запроса будет выглядеть следующим образом:
МАКСИМУМ(ПОДСТРОКА("V", 1, 1) + ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 20)) КАК Штрихкод
В этой конструкции:
ПОДСТРОКА("V", 1, 1) — берет первый символ от строки "V", фиксируя длину литерала.ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 20) — ограничивает длину штрихкода из базы данных первыми 20 символами (этого более чем достаточно для большинства стандартов штрихкодирования, включая EAN-13 и Code39).+ производит корректное математическое сложение (конкатенацию) двух строковых полей фиксированной длины на уровне СУБД.Прямое редактирование текста типового запроса имеет существенный недостаток: при обновлении конфигурации «1С:Розница» эти изменения могут быть затерты или привести к конфликтам при сравнении и объединении объектов. Более гибким, красивым и «правильным» с точки зрения методологии разработки в 1С является использование механизма Вычисляемых полей в Системе компоновки данных.
Вычисления в этой вкладке выполняются непосредственно платформой «1С:Предприятие 8» на стороне клиента или сервера приложений, а не базой данных (СУБД). Это позволяет использовать простую конкатенацию строк без вызова сложных функций ограничения длины.
Разберем процесс настройки по шагам:
ШтрихкодСБуквой."V" + [Штрихкод], где [Штрихкод] — исходное поле из вашего запроса.Штрихкод с префиксом V.Штрихкод на ваше новое вычисляемое поле ШтрихкодСБуквой.Такой подход полностью исключает необходимость редактирования SQL-запроса и сохраняет структуру метаданных в чистоте.
Поскольку в обсуждении упоминался штрихкод формата Code39, крайне важно учитывать специфику этого стандарта штрихкодирования:
Code39 обязательно должен содержать стартовый и стоповый символы — «звездочки» (*) в начале и в конце кодируемой последовательности (например, строка для сканера должна выглядеть как *V1234567*)."V1234567"."*" + "V" + [Штрихкод] + "*".Добавление префикса "V" непосредственно в графическое изображение штрихкода на ценнике влечет за собой важные организационные последствия для работы кассовой зоны:
Проблема поиска товара в базе данных: при считывании измененного штрихкода сканером на кассе, устройство передаст в систему строку, начинающуюся с символа "V" (например, "V123456"). Если в регистре сведений Штрихкоды этот товар зарегистрирован по старому коду (без буквы, просто "123456"), программа выдаст ошибку «Товар не найден».
Решить эту проблему можно двумя путями:
"V" на уровне хранения данных.Code39. Также можно доработать модуль конфигурации, отвечающий за поиск номенклатуры при сканировании, чтобы при неудачном поиске система пробовала отсечь первую букву и выполнить поиск повторно.Проанализировав все варианты, мы рекомендуем использовать метод Вычисляемых полей СКД как наиболее стабильный и поддерживаемый инструмент для кастомизации макетов этикеток в семействе программ «1С:Предприятие 8».