Как найти последний сгенерированный штрихкод EAN-13 в заданном интервале в 1С

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

При работе с распределенной информационной базой (РИБ) в розничных сетях часто возникает необходимость генерировать штрихкоды EAN-13 локально на каждом узле или магазине (например, для дисконтных карт или внутренних товаров). Чтобы избежать пересечения и дублирования кодов при последующем обмене данными между узлами, каждому магазину выделяют отдельный числовой диапазон (например, от 00002000 до 00012000).

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

Способ 1. Получение последнего штрихкода через запрос с фильтрацией диапазона

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

  1. Подготовка границ диапазона: Приводим начальное и конечное значение интервала к строке заданной длины (например, 8 символов), дополняя недостающие знаки нулями слева.
  2. Выборка подстроки: Извлекаем с помощью функции ПОДСТРОКА нужную позицию числовой части штрихкода из регистра сведений во временную таблицу.
  3. Фильтрация и сортировка: Накладываем условия на соответствие маске EAN-13 и нахождению кода внутри диапазона (операторами > и <). Выбираем запись с сортировкой по убыванию и ограничением ПЕРВЫЕ 1.

Разберем пример реализации данного подхода на языке запросов 1С:


// Подготовка границ диапазона с заполнением лидирующими нулями
ДлинаКода = 8;
СтрНачало = СтрЗаменить(Строка(Диапазон.Начало), " ", "");
СтрКонец  = СтрЗаменить(Строка(Диапазон.Конец), " ", "");

ДиапазонНачало    = ДополнитьСимволами(СтрНачало, ДлинаКода, "0", "Слева");
ДиапазонОкончание = ДополнитьСимволами(СтрКонец, ДлинаКода, "0", "Слева");

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ПОДСТРОКА(ЯШтрихкодыДокументов.Штрихкод, 5, 8) КАК Код,
|	ЯШтрихкодыДокументов.Штрихкод КАК Штрихкод
|ПОМЕСТИТЬ ВТ_Штрихкоды
|ИЗ
|	РегистрСведений.ЯШтрихкодыДокументов КАК ЯШтрихкодыДокументов
|ГДЕ
|	ЯШтрихкодыДокументов.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)
|	И ЯШтрихкодыДокументов.Штрихкод ПОДОБНО ""2007_________""
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
|	ВТ_Штрихкоды.Код КАК Код,
|	ВТ_Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
|	ВТ_Штрихкоды КАК ВТ_Штрихкоды
|ГДЕ
|	ВТ_Штрихкоды.Код > &ДиапазонНачало
|	И ВТ_Штрихкоды.Код < &ДиапазонОкончание
|УПОРЯДОЧИТЬ ПО
|	ВТ_Штрихкоды.Код УБЫВ";

Запрос.УстановитьПараметр("ДиапазонНачало", ДиапазонНачало);
Запрос.УстановитьПараметр("ДиапазонОкончание", ДиапазонОкончание);

Результат = Запрос.Выполнить();

Если запрос возвращает результат, то новый штрихкод формируется путем увеличения найденного кода на единицу. Если результат пуст, генерация начинается с минимальной границы (ДиапазонНачало).

Способ 2. Альтернативный подход с отдельными префиксами магазинов

Вместо выделения непересекающихся числовых диапазонов можно использовать префиксы магазинов или узлов РИБ. Структура штрихкода EAN-13 в таком случае состоит из 12 информационных цифр и 13-й контрольной цифры:

  1. Общий внутренний префикс (4 символа): Например, 2007.
  2. Префикс магазина/узла (2-3 символа): Например, 01 для Магазина №1, 02 для Магазина №2.
  3. Порядковый номер (5-6 символов): Автоматически увеличивающийся счетчик от 00001 до 99999.
  4. Контрольный символ (1 символ): Рассчитывается автоматически по алгоритму Modulo 10.

При таком подходе поиск последнего кода упрощается, так как достаточно выполнить поиск с условием ПОДОБНО "200701%" без сложной фильтрации по интервалам.

Важные технические особенности и рекомендации

Проанализируем важные нюансы, которые необходимо учитывать при работе со штрихкодами формата EAN-13:

  1. Производительность запросов: Использование функций ПОДСТРОКА и оператора ПОДОБНО в секции ГДЕ делает невозможным использование индексов СУБД по полю «Штрихкод». По мере роста регистра выборка будет требовать полного сканирования таблицы (Full Table Scan).
  2. Параллельная работа и транзакции: Поиск последней записи запросом непосредственного перед записью нового элемента в многопользовательской среде создает риски «гонки условий» (Race Condition). Для предотвращения генерации одинаковых кодов несколькими пользователями операцию определения и записи необходимо выполнять внутри транзакции с установкой управляемой блокировки через объект БлокировкаДанных.
  3. Расчет контрольного символа EAN-13: Диапазон и порядковые номера должны задаваться только для первых 12 цифр. 13-й символ является контрольной суммой и меняется нелинейно. Для его расчета рекомендуется использовать штатные функции Библиотеки Стандартных Подсистем (БСП).
  4. Использование регистра счетчиков: Для высоконагруженных систем оптимальным решением является использование специального регистра сведений «Счетчики штрихкодов». В нем хранятся текущие числовые значения счетчиков для каждого магазина, что исключает сканирование всего регистра штрихкодов.
← На главную