Поиск свободного кода для создания штрих-кода, одним запросом по оригинальной методике, с возможностью выбора границ для разграничения кодов ( например для распределенных баз или подразделений.
Принцип поиска состоит в создании таблицы свободных кодов и ее клона сдвинутого на 1.
Принцип поиска состоит в создании таблицы свободных кодов и ее клона сдвинутого на 1.
Принцип поиска состоит в создании таблицы свободных кодов и ее клона сдвинутого на 1.
Таблицы можно ограничить параметрами для разграничения свободных кодов разных подразделений или узлов распределенных баз.
После объединения этих таблиц получаем минимальный свободный код рассчитанный от заданной границы.
| таблица | таблица | |||
| основная | клон | |||
| Граница 1 | 0 | |||
| 1 | = | 1 | ||
| 2 | = | 2 | ||
| 3 | = | 3 | ||
| 8 | <> | 4 | Свободный код | |
| 9 | = | 9 | ||
| 13 | <> | 10 | Свободный код | |
| 14 | ||||
| Граница 2 | 10000 | |||
| 10001 | = | 10001 | ||
| 10002 | = | 10002 | ||
| 10003 | = | 10003 | ||
| 10004 | = | 10004 | ||
| 10997 | <> | 10005 | Свободный код | |
| 10998 | = | 10998 | ||
| 10999 | = | 10999 | ||
| 20001 | <> | 11000 | Свободный код | |
| 20002 | ||||
////////////////////////////////////////////////////////////////////////
// Функции для конфигурации УНФ
Функция ПолучитьДляШтучногоТовараПоследнийКодЧислом(ПрефиксШтучного = "20", ПрефиксПодразделения = "00",МинимальныйКодЧислом = 0) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| 0 КАК ПолеЧисло,
| ""0"" КАК ПолеСтрока
|ПОМЕСТИТЬ ЗначенияЦифр
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 1,
| ""1""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 2,
| ""2""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 3,
| ""3""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 4,
| ""4""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 5,
| ""5""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 6,
| ""6""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 7,
| ""7""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 8,
| ""8""
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 9,
| ""9""
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 5, 1) КАК Поле7о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 6, 1) КАК Поле6о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 7, 1) КАК Поле5о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 8, 1) КАК Поле4о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 9, 1) КАК Поле3о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 10, 1) КАК Поле2о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 11, 1) КАК Поле1о,
| ПОДСТРОКА(ШтрихкодыНоменклатуры.Штрихкод, 12, 1) КАК Поле0о
|ПОМЕСТИТЬ Разряды
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ФорматШтрихкода
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗначенияЦифр0.ПолеЧисло + ЗначенияЦифр1.ПолеЧисло * 10 + ЗначенияЦифр2.ПолеЧисло * 100 + ЗначенияЦифр3.ПолеЧисло * 1000 + ЗначенияЦифр4.ПолеЧисло * 10000 + ЗначенияЦифр5.ПолеЧисло * 100000 + ЗначенияЦифр6.ПолеЧисло * 1000000 + ЗначенияЦифр7.ПолеЧисло * 10000000 КАК ЧисловоеЗначение
|ПОМЕСТИТЬ Занятые
|ИЗ
| Разряды КАК Разряды
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр0
| ПО Разряды.Поле0о = ЗначенияЦифр0.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр1
| ПО Разряды.Поле1о = ЗначенияЦифр1.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр2
| ПО Разряды.Поле2о = ЗначенияЦифр2.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр3
| ПО Разряды.Поле3о = ЗначенияЦифр3.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр4
| ПО Разряды.Поле4о = ЗначенияЦифр4.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр5
| ПО Разряды.Поле5о = ЗначенияЦифр5.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр6
| ПО Разряды.Поле6о = ЗначенияЦифр6.ПолеСтрока
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияЦифр КАК ЗначенияЦифр7
| ПО Разряды.Поле7о = ЗначенияЦифр7.ПолеСтрока
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &МиНЧисло
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Занятые.ЧисловоеЗначение КАК ЧисловоеЗначение
|ПОМЕСТИТЬ ФЗанятые
|ИЗ
| Занятые КАК Занятые
|
|СГРУППИРОВАТЬ ПО
| Занятые.ЧисловоеЗначение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ФЗанятые.ЧисловоеЗначение + 1 КАК ЧисловоеЗначение
|ПОМЕСТИТЬ Плюс1
|ИЗ
| ФЗанятые КАК ФЗанятые
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| Плюс1.ЧисловоеЗначение КАК ЧисловоеЗначение
|ИЗ
| Плюс1 КАК Плюс1
| ЛЕВОЕ СОЕДИНЕНИЕ ФЗанятые КАК ФЗанятые
| ПО Плюс1.ЧисловоеЗначение = ФЗанятые.ЧисловоеЗначение
|ГДЕ
| ФЗанятые.ЧисловоеЗначение ЕСТЬ NULL
| И Плюс1.ЧисловоеЗначение > &МиНЧисло
|
|УПОРЯДОЧИТЬ ПО
| ЧисловоеЗначение";
Запрос.УстановитьПараметр("ФорматШтрихкода", ПрефиксШтучного + ПрефиксПодразделения + "_________"); // РегистрыСведений.ШтрихкодыНоменклатуры.ФорматВесовогоШтрихкода(ПрефиксВесовогоТовара));
Запрос.УстановитьПараметр("МиНЧисло",МинимальныйКодЧислом );
КодЧислом = Запрос.Выполнить().Выгрузить()[0].ЧисловоеЗначение -1;
Возврат КодЧислом;
КонецФункции
Тестировалась на УНФ 1.6.13.58.
В файле примеры для 1с Розница и 1с УНФ подходит для любого релиза.






Что явилось причиной отказа от штатного формирования штрихкодов?
(1)Штатное формирование ищет наибольший код, и если у вас после кода 10, случайно попадает код 90000 , штатная выдаст 90001, а эта функция выдаст 11.
Если у Вас два компьютера в распределенной базе, штатно они будут присваивать одинаковые коды, разным товарам. На одной из распределенных баз, этой функции можно передать нижний предел например: 100000 и она выдаст 100001. на другой базе без предела выдаст 11.
С Уважением, Алексей.
(2) для РИБа же есть префиксы штрихкодов на узлах
(3)Да есть, но есть еще и производство, в котором уже масса товара получила свои штрих коды по стандартной технологии и на предыдущих релизах. И там они уже имеют вид:
20 99867 43434К,
Ваши предложения, в студию.
С Уважением, Алексей.