При автоматизации документооборота часто возникает задача присвоения уникальных кодов в рамках заданного числового диапазона. Если пользователи имеют возможность вручную корректировать нумерацию, в последовательности неизбежно образуются «дыры» — незаполненные значения. Рассмотрим, как программно найти первый пропуск и заполнить его новым значением.
Если объем данных невелик, мы можем воспользоваться последовательным перебором значений. Суть метода заключается в сравнении текущего ожидаемого кода с реальными данными, полученными из базы. Давайте разберем этот процесс по шагам:
Запрос.Код.Посмотрим на пример реализации этой логики:
Функция НайтиПервыйСвободныйКод()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Код ИЗ Справочник.Документы УПОРЯДОЧИТЬ ПО Код";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Счетчик = 500; // Начало нашего диапазона
Пока Выборка.Следующий() Цикл
Если Счетчик = Выборка.Код Тогда
Счетчик = Счетчик + 1;
Продолжить;
Иначе
Возврат Счетчик;
КонецЕсли;
КонецЦикла;
Возврат Счетчик;
КонецФункции
Для больших объемов данных выполнение цикла на стороне клиента 1С неэффективно. Гораздо быстрее и правильнее переложить эту задачу на СУБД с помощью Запрос. Мы можем сравнить таблицу саму с собой, чтобы найти разрывы в нумерации.
Разберем логику: мы соединяем таблицу кодов саму с собой по условию Таб.Код + 1 = Таб2.Код. Те записи, для которых не нашлось пары в Таб2 (где Таб2.Код ЕСТЬ NULL), и являются точками, после которых произошел пропуск.
ВЫБРАТЬ
Таб.Код + 1 КАК ПропущенныйКод
ИЗ
ТаблицаКодов КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ
ТаблицаКодов КАК Таб2
ПО
Таб.Код + 1 = Таб2.Код
ГДЕ
Таб2.Код ЕСТЬ NULL
УПОРЯДОЧИТЬ ПО
Таб.Код
Этот метод позволяет получить первый свободный номер максимально быстро, не загружая в память приложения лишние данные.
При внедрении любого из этих способов мы должны учитывать следующие архитектурные аспекты:
БлокировкаДанных или выполняйте запись в рамках одной транзакции.Запрос условием ГДЕ Код МЕЖДУ 500 И 599.Используя приведенные методы, вы сможете корректно управлять нумерацией даже в условиях хаотичного ручного ввода, обеспечивая целостность и логичность ваших последовательностей документов.