Как найти и заполнить первое свободное значение в последовательности кодов 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации документооборота часто возникает задача присвоения уникальных кодов в рамках заданного числового диапазона. Если пользователи имеют возможность вручную корректировать нумерацию, в последовательности неизбежно образуются «дыры» — незаполненные значения. Рассмотрим, как программно найти первый пропуск и заполнить его новым значением.

Решение 1: Алгоритмический подход через обход выборки

Если объем данных невелик, мы можем воспользоваться последовательным перебором значений. Суть метода заключается в сравнении текущего ожидаемого кода с реальными данными, полученными из базы. Давайте разберем этот процесс по шагам:

  1. Получаем данные из информационной базы с помощью Запрос.
  2. Упорядочиваем выборку по полю Код.
  3. В цикле сравниваем текущий счетчик с кодом из выборки.
  4. Если значения не совпадают, значит, мы нашли «дыру» — текущий счетчик и есть первый свободный код.

Посмотрим на пример реализации этой логики:


Функция НайтиПервыйСвободныйКод()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Код ИЗ Справочник.Документы УПОРЯДОЧИТЬ ПО Код";
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Счетчик = 500; // Начало нашего диапазона
    
    Пока Выборка.Следующий() Цикл
        Если Счетчик = Выборка.Код Тогда
            Счетчик = Счетчик + 1;
            Продолжить;
        Иначе
            Возврат Счетчик;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Счетчик;
КонецФункции

Решение 2: Оптимизированный запрос к базе данных

Для больших объемов данных выполнение цикла на стороне клиента 1С неэффективно. Гораздо быстрее и правильнее переложить эту задачу на СУБД с помощью Запрос. Мы можем сравнить таблицу саму с собой, чтобы найти разрывы в нумерации.

Разберем логику: мы соединяем таблицу кодов саму с собой по условию Таб.Код + 1 = Таб2.Код. Те записи, для которых не нашлось пары в Таб2 (где Таб2.Код ЕСТЬ NULL), и являются точками, после которых произошел пропуск.


ВЫБРАТЬ
    Таб.Код + 1 КАК ПропущенныйКод
ИЗ
    ТаблицаКодов КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ
    ТаблицаКодов КАК Таб2
ПО
    Таб.Код + 1 = Таб2.Код
ГДЕ
    Таб2.Код ЕСТЬ NULL
УПОРЯДОЧИТЬ ПО
    Таб.Код

Этот метод позволяет получить первый свободный номер максимально быстро, не загружая в память приложения лишние данные.

Важные рекомендации при реализации

При внедрении любого из этих способов мы должны учитывать следующие архитектурные аспекты:

Используя приведенные методы, вы сможете корректно управлять нумерацией даже в условиях хаотичного ручного ввода, обеспечивая целостность и логичность ваших последовательностей документов.

← На главную