При работе с распределенной информационной базой (РИБ) в розничных сетях часто возникает необходимость генерировать штрихкоды EAN-13 локально на каждом узле или магазине (например, для дисконтных карт или внутренних товаров). Чтобы избежать пересечения и дублирования кодов при последующем обмене данными между узлами, каждому магазину выделяют отдельный числовой диапазон (например, от 00002000 до 00012000).
Рассмотрим, как с помощью запроса 1С найти последний сгенерированный штрихкод в заданном диапазоне, а также разберем архитектурные особенности и ограничения данного подхода.
Для корректного лексикографического сравнения строк в запросе необходимо, чтобы числовая часть кода была привела к фиксированной длине и дополнена лидирующими нулями. Рассмотрим пошаговый алгоритм решения этой задачи:
ПОДСТРОКА нужную позицию числовой части штрихкода из регистра сведений во временную таблицу.> и <). Выбираем запись с сортировкой по убыванию и ограничением ПЕРВЫЕ 1.Разберем пример реализации данного подхода на языке запросов 1С:
// Подготовка границ диапазона с заполнением лидирующими нулями
ДлинаКода = 8;
СтрНачало = СтрЗаменить(Строка(Диапазон.Начало), " ", "");
СтрКонец = СтрЗаменить(Строка(Диапазон.Конец), " ", "");
ДиапазонНачало = ДополнитьСимволами(СтрНачало, ДлинаКода, "0", "Слева");
ДиапазонОкончание = ДополнитьСимволами(СтрКонец, ДлинаКода, "0", "Слева");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПОДСТРОКА(ЯШтрихкодыДокументов.Штрихкод, 5, 8) КАК Код,
| ЯШтрихкодыДокументов.Штрихкод КАК Штрихкод
|ПОМЕСТИТЬ ВТ_Штрихкоды
|ИЗ
| РегистрСведений.ЯШтрихкодыДокументов КАК ЯШтрихкодыДокументов
|ГДЕ
| ЯШтрихкодыДокументов.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)
| И ЯШтрихкодыДокументов.Штрихкод ПОДОБНО ""2007_________""
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ВТ_Штрихкоды.Код КАК Код,
| ВТ_Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| ВТ_Штрихкоды КАК ВТ_Штрихкоды
|ГДЕ
| ВТ_Штрихкоды.Код > &ДиапазонНачало
| И ВТ_Штрихкоды.Код < &ДиапазонОкончание
|УПОРЯДОЧИТЬ ПО
| ВТ_Штрихкоды.Код УБЫВ";
Запрос.УстановитьПараметр("ДиапазонНачало", ДиапазонНачало);
Запрос.УстановитьПараметр("ДиапазонОкончание", ДиапазонОкончание);
Результат = Запрос.Выполнить();
Если запрос возвращает результат, то новый штрихкод формируется путем увеличения найденного кода на единицу. Если результат пуст, генерация начинается с минимальной границы (ДиапазонНачало).
Вместо выделения непересекающихся числовых диапазонов можно использовать префиксы магазинов или узлов РИБ. Структура штрихкода EAN-13 в таком случае состоит из 12 информационных цифр и 13-й контрольной цифры:
2007.01 для Магазина №1, 02 для Магазина №2.00001 до 99999.При таком подходе поиск последнего кода упрощается, так как достаточно выполнить поиск с условием ПОДОБНО "200701%" без сложной фильтрации по интервалам.
Проанализируем важные нюансы, которые необходимо учитывать при работе со штрихкодами формата EAN-13:
ПОДСТРОКА и оператора ПОДОБНО в секции ГДЕ делает невозможным использование индексов СУБД по полю «Штрихкод». По мере роста регистра выборка будет требовать полного сканирования таблицы (Full Table Scan).БлокировкаДанных.