Перейти к содержимому

❓ 1.1 Серии кодов справочника — как работает нумерация


Нумерация (ручная и автоматическая) используется в:

  • Справочниках — код
  • Документах — номер
  • ПВХ — код
  • Бизнес-процессах — номер
  • Задачах — номер
  • Планах обмена — код

Тип кода

  • Число
  • Строка

Строковый код даёт больше возможностей:

  • любые символы
  • префиксы
  • настройка длины

Длина кода

  • Фиксированная → всегда одна длина
  • Переменная → длина ≤ заданной

⚠️ Важный момент:

Длина кода задаётся свойством объекта конфигурации.

Она определяет максимально возможное значение кода.

При достижении максимального значения в рамках заданной длины:

  • дальнейшая автонумерация невозможна
  • требуется изменение длины кода в конфигурации

Серии кодов

Серии кодов определяют границы, в которых выполняется контроль уникальности кодов элементов справочника.

Проверка уникальности выполняется только при включенном свойстве Контроль уникальности.

В этих же границах выполняется автонумерация кода.


Платформа позволяет задавать разные границы:

  • Во всём справочнике
  • В пределах подчинения (иерархии)
  • В пределах владельца

Допустим, есть справочник Номенклатура.

Если серии кодов:

  • Во всем справочнике
    → код 001 может существовать только один

  • В пределах подчинения
    → в группе Обувь и в группе Одежда может быть по элементу с кодом 001

  • В пределах владельца
    → у разных владельцев может быть одинаковый код 001


Автоматическая нумерация позволяет создавать новые объекты с заведомо уникальными номерами.

👉 В общем случае номер/код:

  • определяется как max + 1
  • ищется в пределах пространства номеров
  • для справочников пространство номеров определяется с учетом серий кодов
  • в пределах пространства номеров номер выдается в разрезе префиксов

Причём номер будет одинаково выдан:

  • и при интерактивном создании
  • и при программной записи

Механизм автонумерации выдает номера в разрезе пространств номеров и префиксов.

Пространство номеров в зависимости от типа объекта может содержать:

  • владельца
  • период
  • серии кодов
  • и др.

В пределах пространства номеров номер выдается в разрезе префиксов.

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

👉 Префикс определяется автоматически:

  • система приводит строковый номер к числу
  • цифры анализируются справа налево
  • как только встречается символ, который нельзя распознать как число, левая часть считается префиксом

Пример номера:

ABC000123
  • число → 123
  • префикс → ABC

Режим автонумерации

Поведение автонумерации задаётся свойством:

  • РежимАвтонумерацииОбъектов

Есть два режима:

  • НеОсвобождатьАвтоматически (по умолчанию)
  • ОсвобождатьАвтоматически

👉 Они определяют, будет ли повторно использоваться номер, если он был выдан, но объект не записан в базу.


За выдачу номеров отвечает сервис автонумерации.

👉 Благодаря этому:

  • не требуется блокировка таблиц
  • повышается параллельность работы

Работа автонумерации зависит от пространства номеров и префикса.

👉 При первом получении номера:

  • выполняется неблокирующее чтение максимального номера из базы
  • определяется текущее значение max
  • дальше номер выдается как max + 1

👉 Это обращение к базе происходит только один раз для каждой комбинации:

  • пространства номеров
  • префикса

После этого:

  • сервис хранит текущее значение у себя
  • и выдает следующие номера без повторных чтений из БД

👉 За счет этого:

  • уменьшается нагрузка на базу
  • нет блокировок
  • повышается параллельность работы

👉 Важно:

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


Если номер строковый, используются лидирующие нули:

00031

👉 Это необходимо для:

  • корректной сортировки
  • правильного поиска

Если пользователь вручную вводит:

4

вместо:

000000004

👉 система фиксирует более короткое значение как новое максимальное

➡️ автонумерация начинает работать в сокращённом диапазоне
и возвращает номера в некорректном формате


  • не давать пользователям вводить код вручную
  • либо использовать единый формат с лидирующими нулями

В клиент-серверном варианте сервис нумерации:

  • хранит последний выданный номер
  • отвечает за уникальность

⚠️ Возможная проблема:

при копировании базы через СУБД возникает рассинхрон между:

  • таблицами БД
  • сервисом нумерации

➡️ ошибка: «Номер не уникален»

Решение:

ОбновитьНумерациюОбъектов()