Поиск свободного штрихкода (EAN-13) внутри одного префикса

27.10.16

Разработка - Универсальные функции

Частая ситуация: Крупная компания покупает штрихкод например на 99999 позиций. Пользователь ручками случайно внес штрихкод 99999. Но в выданных пределах еще много пропусков.

В обработке использовался коммент из публикации на инфостарте http://forum.infostart.ru/forum26/topic125338/

Первая функция подготавливает таблицу свободных штрихкодов. (на 77000 позициях работает 2.5-3 секунды). Ее нужно использовать до цикла присваивания штрихкодов.

Вторая выжимает из этой таблицы штрихкоды.

&НаСервере
Функция ПодготовитьТаблицуСвободныхШтрихкодов() Экспорт
 
 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 | ""0"" КАК Цифра,0 КАК Позиция, 1 КАК Вес
 |ПОМЕСТИТЬ СистемаСчисления
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""1"",1,10
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""2"",2,100
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""3"",3,1000
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""4"",4,10000
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""5"",5,100000
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""6"",6,1000000
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""7"",7,10000000
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""8"",8,100000000
 |ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""9"",9,1000000000
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 | ""0"" + ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 8, 5) КАК Номер,
 | ШтрихкодыНоменклатуры.Штрихкод
 |ПОМЕСТИТЬ Дано
 |ИЗ
 | РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
 |ГДЕ
 | ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ПрефиксЕАН
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 | Дано.Штрихкод,
 | СУММА(СтепениДесяти.Вес * Цифры.Позиция) / МИНИМУМ(СтепениДесяти.Вес) КАК номер
 |ПОМЕСТИТЬ ЗанятыеШтрихкоды
 |ИЗ
 | Дано КАК Дано
 |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ СистемаСчисления КАК СтепениДесяти
 |  ПО (ИСТИНА)
 |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ СистемаСчисления КАК Цифры
 |  ПО (ПОДСТРОКА(Дано.Номер, 6 - СтепениДесяти.Позиция, 1) = Цифры.Цифра)
 |
 |СГРУППИРОВАТЬ ПО
 | Дано.Штрихкод
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ РАЗЛИЧНЫЕ
 | 10000 * Таб5.Позиция + 1000 * Таб4.Позиция + 100 * Таб3.Позиция + 10 * Таб2.Позиция + Таб1.Позиция + 1 КАК Число
 |ПОМЕСТИТЬ ВТ_Числа
 |ИЗ
 | СистемаСчисления КАК Таб1,
 | СистемаСчисления КАК Таб2,
 | СистемаСчисления КАК Таб3,
 | СистемаСчисления КАК Таб4,
 | СистемаСчисления КАК Таб5
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 | ВТ_Числа.Число КАК Номер,
 | ЕСТЬNULL(ЗанятыеШтрихкоды.Штрихкод, """") КАК Штрихкод
 |ПОМЕСТИТЬ ИндексШК
 |ИЗ
 | ВТ_Числа КАК ВТ_Числа
 |  ЛЕВОЕ СОЕДИНЕНИЕ ЗанятыеШтрихкоды КАК ЗанятыеШтрихкоды
 |  ПО (ЗанятыеШтрихкоды.Номер = ВТ_Числа.Число)
 |ГДЕ
 | ВТ_Числа.Число < 100000
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ РАЗЛИЧНЫЕ
 | Свободные.Номер
 |ИЗ
 | ИндексШК КАК Свободные
 |ГДЕ
 | Свободные.Штрихкод = """"";
 Запрос.УстановитьПараметр("ПрефиксЕАН","%4590009%");  //Офиальный выданный компании префикс
 ДиапазоныШтучныхШтрихкодов = Запрос.Выполнить().Выгрузить();
 Если ДиапазоныШтучныхШтрихкодов.Количество() = 0 Тогда
  Возврат Неопределено;
 Иначе
  Возврат ДиапазоныШтучныхШтрихкодов;
 КонецЕсли;


КонецФункции

&НаСервере
Функция ЗанятьШтрихкод(Таблица) Экспорт
 Если Таблица.Количество() = 0 Тогда
  Возврат Неопределено;
 КонецЕсли;
 ШК = Таблица[0].Код;
 Таблица.Удалить(0); //штрихкод занят. удаляем из таблицы
 Возврат ШК;
КонецФункции 

" |ВЫБРАТЬ РАЗЛИЧНЫЕ " использована, потому что код расчета числового ряда создает дубли через каждые 10 чисел. Обойти это ошибку не смог. Главное работает. Так же пришлось добавить к текстовому индексу "0". Почему в данном случае глючит, пусть решают авторы кода создания числового ряда в запросе. Я взял их код без изменения.

Основное преимущество данного кода: Нет необходимости создания воспомогательных сущностей(регистры, справочники и т.д.) в конфигурации 1С.

свободные штрих-коды

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4607    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8821    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Отзывы
4. ildarovich 7850 28.10.16 14:39 Сейчас в теме
Вот еще один вариант. Он основан на непосредственном получении следующего кода. Без необходимости перевода в числовой тип.
В штрих-коде ищется последняя серия девяток.
Она заменяется на серию нулей.
Предшествующая цифра заменяется следующей в ряду цифр.
Начало сохраняется.
То есть решается задача инкрементирования числа непосредственно в символьном виде.

ВЫБРАТЬ 0 КАК Х ПОМЕСТИТЬ Р1 ОБЪЕДИНИТЬ ВЫБРАТЬ 1
;
ВЫБРАТЬ А.Х + 2 * Б.Х КАК Х ПОМЕСТИТЬ Р2 ИЗ Р1 КАК А, Р1 КАК Б
;
ВЫБРАТЬ А.Х + 4 * Б.Х КАК Х ПОМЕСТИТЬ Р4 ИЗ Р2 КАК А, Р2 КАК Б
;
ВЫБРАТЬ ВЫРАЗИТЬ(ПОДСТРОКА(ШтрихКод, 1, А.Х - 1) КАК СТРОКА12) 
+ ПОДСТРОКА("123456789", Б.Х + 1, 1) 
+ ПОДСТРОКА("000000000000", А.Х + 1, 12) КАК ШтрихКод
ПОМЕСТИТЬ ДаноПлюс 
ИЗ РегистрСведений_ШтрихкодыНоменклатуры, Р4 КАК А, Р4 КАК Б
ГДЕ ШтрихКод ПОДОБНО ПОДСТРОКА("%999999999999", 1, 13 - А.Х) 
И ШтрихКод НЕ ПОДОБНО ПОДСТРОКА("%999999999999", 1, 14 - А.Х)
И Б.Х < 9 И ПОДСТРОКА(ШтрихКод, А.Х, 1) = ПОДСТРОКА("012345678", Б.Х + 1, 1)
;
ВЫБРАТЬ ШтрихКод
ИЗ ДаноПлюс
ГДЕ ШтрихКод НЕ В 
(ВЫБРАТЬ Дано.ШтрихКод ИЗ РегистрСведений_ШтрихкодыНоменклатуры КАК Дано)
Показать


Из-за глюка движка форума ВЫРАЗИТЬ _ КАК СТРОКА12 пришлось написать без скобок вокруг 12.
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ildarovich 7850 27.10.16 15:40 Сейчас в теме
В публикации Поиск пропусков в нумерации документов запросом для решения сходной задачи используется другой метод. В качестве результата выдается таблица пропусков в формате ОтНомера - ДоНомера. При этом не требуется генерация всех штрих кодов и, поэтому, результат должен получаться существенно быстрее.

Было бы интересно сравнить быстродействие на конкретном примере, поборов эти 2,5-3 секунды.
2. KazanKokos 10 27.10.16 16:16 Сейчас в теме
(1) ildarovich, спасибо за ссылку. я использовал запрос именно оттуда. просто не смог найти потом. 2.7 секунд на базе из 77000 штрихкодов. на клиентсервере с другого компа. точно проверено.
3. ildarovich 7850 27.10.16 20:43 Сейчас в теме
(2) эх, не совсем то имел ввиду.

По ссылке в (1) приведена обработка, которая ОЧЕНЬ БЫСТРО определяет ВСЕ свободные номера (штрих-коды). Именно ВСЕ, потому, что ее формат вывода это диапазоны. То есть она выводит ВСЕ свободные номера От и До, не перебирая каждый номер, пытаясь определить, свободен ли он, на что в вашем варианте уходит масса времени.

Но при ближайшем рассмотрении вашей обработки оказывается, что вам не нужны все свободные штрих-коды, а достаточно одного. Тогда вообще никакой проблемы нет. Вот текст запроса, который предельно быстро покажет первый свободный номер:
ВЫБРАТЬ 0 С,    1 КАК П
ПОМЕСТИТЬ Р16
ОБЪЕДИНИТЬ ВЫБРАТЬ  1, 10
ОБЪЕДИНИТЬ ВЫБРАТЬ  2, 100
ОБЪЕДИНИТЬ ВЫБРАТЬ  3, 1000
ОБЪЕДИНИТЬ ВЫБРАТЬ  4, 10000
ОБЪЕДИНИТЬ ВЫБРАТЬ  5, 100000
ОБЪЕДИНИТЬ ВЫБРАТЬ  6, 1000000
ОБЪЕДИНИТЬ ВЫБРАТЬ  7, 10000000
ОБЪЕДИНИТЬ ВЫБРАТЬ  8, 100000000
ОБЪЕДИНИТЬ ВЫБРАТЬ  9, 1000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 10, 10000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 11, 100000000000
;
ВЫБРАТЬ СУММА(А.П * Б.С) КАК Код 
ПОМЕСТИТЬ Коды
ИЗ РегистрСведений_ШтрихкодыНоменклатуры КАК Дано, Р16 КАК А, Р16 КАК Б
ГДЕ Дано.ШтрихКод ПОДОБНО &ПрефиксЕАН
И Б.С < 10 И ПОДСТРОКА(Дано.ШтрихКод, 12 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)
СГРУППИРОВАТЬ ПО Дано.ШтрихКод;
ВЫБРАТЬ ПЕРВЫЕ 1 Код + 1 КАК СвободныйКод 
ИЗ Коды
ГДЕ Код + 1 НЕ В (ВЫБРАТЬ Код ИЗ Коды)
Показать


За основу взята статья-первоисточник Выразить строку как число и строку как дату в запросе , где, обратите внимание, оставлено только самое нужное для вашего случая.
KazanKokos; swiss-garant; sulfur17; +3 Ответить
4. ildarovich 7850 28.10.16 14:39 Сейчас в теме
Вот еще один вариант. Он основан на непосредственном получении следующего кода. Без необходимости перевода в числовой тип.
В штрих-коде ищется последняя серия девяток.
Она заменяется на серию нулей.
Предшествующая цифра заменяется следующей в ряду цифр.
Начало сохраняется.
То есть решается задача инкрементирования числа непосредственно в символьном виде.

ВЫБРАТЬ 0 КАК Х ПОМЕСТИТЬ Р1 ОБЪЕДИНИТЬ ВЫБРАТЬ 1
;
ВЫБРАТЬ А.Х + 2 * Б.Х КАК Х ПОМЕСТИТЬ Р2 ИЗ Р1 КАК А, Р1 КАК Б
;
ВЫБРАТЬ А.Х + 4 * Б.Х КАК Х ПОМЕСТИТЬ Р4 ИЗ Р2 КАК А, Р2 КАК Б
;
ВЫБРАТЬ ВЫРАЗИТЬ(ПОДСТРОКА(ШтрихКод, 1, А.Х - 1) КАК СТРОКА12) 
+ ПОДСТРОКА("123456789", Б.Х + 1, 1) 
+ ПОДСТРОКА("000000000000", А.Х + 1, 12) КАК ШтрихКод
ПОМЕСТИТЬ ДаноПлюс 
ИЗ РегистрСведений_ШтрихкодыНоменклатуры, Р4 КАК А, Р4 КАК Б
ГДЕ ШтрихКод ПОДОБНО ПОДСТРОКА("%999999999999", 1, 13 - А.Х) 
И ШтрихКод НЕ ПОДОБНО ПОДСТРОКА("%999999999999", 1, 14 - А.Х)
И Б.Х < 9 И ПОДСТРОКА(ШтрихКод, А.Х, 1) = ПОДСТРОКА("012345678", Б.Х + 1, 1)
;
ВЫБРАТЬ ШтрихКод
ИЗ ДаноПлюс
ГДЕ ШтрихКод НЕ В 
(ВЫБРАТЬ Дано.ШтрихКод ИЗ РегистрСведений_ШтрихкодыНоменклатуры КАК Дано)
Показать


Из-за глюка движка форума ВЫРАЗИТЬ _ КАК СТРОКА12 пришлось написать без скобок вокруг 12.
Оставьте свое сообщение