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

09.03.16

Разработка - Запросы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка получения свободных кодов
.epf 8,91Kb ver:1.0
5
5 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

Свободные коды свободные номера

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169274    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11394    sergey279    18    

65

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

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9068    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10219    implecs_team    6    

48

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

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

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

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