Принцип поиска состоит в создании таблицы свободных кодов и ее клона сдвинутого на 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с УНФ подходит для любого релиза.
Вступайте в нашу телеграмм-группу Инфостарт