gifts2017

Процедура получения свободных кодов

Опубликовал Олег Кузнецов (hydro2588_2015) в раздел Программирование - Практика программирования

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

Старался написать как можно более универсально. При желании Справочники.Номенклатура и Справочник.Номенклатура заменить на любой другой тип, можно даже на номер документа, но тогда не забудьте изменить "Код" на "Номер". Собственно код процедуры привожу ниже.

P.S. Файл с обработкой также прикладываю, но качать особого смысла нет, т.к. процедура будет полезна только в контексте какой-либо более глобальной задачи, например интеграции справочников и т.п.

ДлинаКода = Метаданные.Справочники.Номенклатура.ДлинаКода;
Префикс = "";
ДлПрефикса = СтрДлина(Префикс);
ДлЧЧ = ДлинаКода-СтрДлина(Префикс);

//получим последний элемент
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| МАКСИМУМ(Номенклатура.Код) КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

//если используется префикс БД тогда добавим отбор 
Если ДлПрефикса > 0 Тогда
Запрос.Текст = Запрос.Текст + Символы.ПС + 
"ГДЕ
| ПОДСТРОКА(Номенклатура.Код, 1, " + ДлПрефикса + ") = &Префикс";
Запрос.УстановитьПараметр("Префикс", Префикс);
КонецЕсли;

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();
ПоследнийЭлемент = Число(Прав(Выборка.Код,ДлЧЧ));
//формируем все возможные комбинации
врТЗНумерация = Новый ТаблицаЗначений;
врТЗНумерация.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(ДлинаКода)));

Для Счетчик = 1 По ПоследнийЭлемент Цикл
стрТЗ = врТЗНумерация.Добавить(); 
стрТЗ.Код = Префикс + Формат(Счетчик, "ЧЦ=" + ДлЧЧ + "; ЧВН=; ЧГ=0");
КонецЦикла;

//сравним какие комбинации заняты
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ врТЗ ИЗ &врТЗ КАК врТЗ;" + Символы.ПС + 
"ВЫБРАТЬ
| врТЗ.Код КАК Код
|ИЗ
| врТЗ КАК врТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО Номенклатура.Код = врТЗ.Код //условия для префикса 
|ГДЕ
| Номенклатура.Ссылка ЕСТЬ NULL 
|
|УПОРЯДОЧИТЬ ПО
| врТЗ.Код";
//условия для перфикса
//если используется префикс БД тогда добавим отбор 
Если ДлПрефикса > 0 Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "//условия для префикса", "И ПОДСТРОКА(Номенклатура.Код, 1, " + ДлПрефикса + ") = &Префикс");
Запрос.УстановитьПараметр("Префикс", Префикс);
КонецЕсли;

Запрос.УстановитьПараметр("врТЗ", врТЗНумерация);
Результат = Запрос.Выполнить();
врТЗСвободные = Результат.Выгрузить();
#Если Клиент Тогда
Сообщить("Найдено " + врТЗСвободные.Количество() + " свободных кодов из " + врТЗНумерация.Количество());
#КонецЕсли;

Скачать файлы

Наименование Файл Версия Размер
Обработка получения свободных кодов 3
.epf 8,91Kb
14.03.16
3
.epf 1.0 8,91Kb Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. Сергей (ildarovich) 10.03.16 09:32
Тем, кого интересует данная тема, возможно будет также интересен чисто запросный метод решения этой задачи. Он описан в публикации: Поиск пропусков в нумерации документов запросом. Метод нетрудно применить и к кодам справочников и к артикулам. Вместо перечня свободных кодов там выдается диапазон пропущенных номеров.
2. Олег Кузнецов (hydro2588_2015) 10.03.16 16:51
(1) ildarovich, Да. Хороший способ. Единственное мне он показался немного трудным, поэтому и написал эту штуку. По скорости не сравнивал, запрос скорее всего быстрее будет работать.
3. Андрей Зырянов (AndreykO) 11.03.16 06:47
Спасибо. Очень помогло. Всё работает.
4. Валерий Березуцких (spec8s) 14.03.16 00:32
Неплохо было бы заменить строку
СтрДлина(Справочники.Номенклатура.СоздатьЭлемент().Код)

на
Метаданные.Справочники.Номенклатура.ДлинаКода;
5. Олег Кузнецов (hydro2588_2015) 14.03.16 06:09
(4) spec8s, согласен, спасибо за уточнение
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа