Как реализовать префиксацию кодов элементов справочника в зависимости от группы в 1С?

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

При проектировании архитектуры справочников часто возникает задача присвоения уникальных префиксов кодам элементов в зависимости от того, в какой группе (папке) они находятся. Например, если элемент расположен в определенной категории, его код должен начинаться с заданного текстового или цифрового префикса (например, "У-", "RU" или "00"), а для элементов вне этой категории код должен формироваться стандартным образом с нулей.

Рассмотрим, как правильно реализовать подобную логику в платформе 1С:Предприятие, какие нюансы нужно учесть при работе в многопользовательском режиме и почему следует избегать ручных запросов на поиск максимального кода.

Способ 1. Использование штатного события «ПриУстановкеНовогоКода» (Рекомендуемый)

Самым надежным и правильным решением является использование встроенных механизмов автонумерации платформы 1С. Для этого применяется обработчик события ПриУстановкеНовогоКода в модуле объекта справочника или соответствующая подписка на событие.

Платформа автоматически вызывает данное событие перед присвоением нового кода. Нам достаточно проанализировать реквизит Родитель и передать платформа параметр Префикс. Дальнейший поиск максимального номера и формирование строкового кода с нужной длиной платформа берет на себя.

Рассмотрим пример кода в модуле объекта справочника:


Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
    
    // Проверяем родительскую группу элемента
    Если ЗначениеЗаполнено(Родитель) И Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Услуги") Тогда
        Префикс = "У-";
    ИначеЕсли ЗначениеЗаполнено(Родитель) И Родитель.ПринадлежитКГруппе(Справочники.Номенклатура.Импорт) Тогда
        Префикс = "RU";
    Иначе
        // Если префикс не задан, код будет формироваться с нулей
        Префикс = "";
    КонецЕсли;
    
КонецПроцедуры

Преимущества данного подхода:

  1. Корректная работа в многопользовательском режиме: встроенный менеджер автонумерации 1С самостоятельно блокирует нужные транзакции и предотвращает дублирование кодов при одновременной записи нескольких элементов разными пользователями.
  2. Поддержка распределенных информационных баз (РИБ): платформа корректно комбинирует ваш префикс с префиксом узла РИБ или организации.

Способ 2. Назначение кода в событии «ПередЗаписью» и смена группы

Иногда при создании нового элемента через форму реквизит Родитель может быть еще не заполнен пользователем на момент вызова автонумерации. Кроме того, пользователь может перенести существующий элемент из одной группы в другую. При смене группы стандартный механизм автонумерации повторно не срабатывает.

Если бизнес-логика требует принудительного изменения кода при смене группы, проанализируем ситуацию в событии ПередЗаписью модуля объекта с использованием метода УстановитьНовыйКод().


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем, является ли элемент новым или изменился ли родитель
    ЭтоНовыйОбъект = ЭтоНовый();
    РодительИзменился = НЕ ЭтоНовыйОбъект И (Родитель <> Ссылка.Родитель);
    
    Если ЭтоНовыйОбъект Или РодительИзменился Тогда
        
        НужныйПрефикс = "";
        Если ЗначениеЗаполнено(Родитель) И Родитель.Код = "00001" Тогда
            НужныйПрефикс = "00";
        КонецЕсли;
        
        // Принудительно генерируем новый код с учетом префикса
        УстановитьНовыйКод(НужныйПрефикс);
        
    КонецЕсли;
    
КонецПроцедуры

Почему ручные запросы на поиск МАКСИМУМ(Код) опасны?

В некоторых решениях можно встретить программный поиск максимального кода через запрос к базе данных с вырезкой подстроки методом ПОДСТРОКА() и последующим вручную добавлением единицы.

Разберем, почему от такого подхода следует отказаться:

  1. Блокировки и коллизии: Если два пользователя одновременно создают элементы в одной папке, запрос выдаст им одинаковый максимальный код. В результате один из пользователей получит ошибку уникальности при записи.
  2. Проблемы производительности: Преобразование строк в числа внутри запросов и на стороне 1С при высокой интенсивности записи создает избыточную нагрузку на СУБД.
  3. Нарушение работы РИБ: При ручном формировании кодов теряется штатный контроль уникальности в распределенных базах.

Важные настройки метаданных

Чтобы префиксация работала корректно, убедитесь в соблюдении следующих условий конфигурации:

  1. Тип кода справочника должен быть установлен в значение Строка. На числовые коды префиксы не накладываются.
  2. Длина поля Код должна быть достаточной, чтобы вместить и текстовый префикс, и числовую часть с ведущими нулями. Например, при длине кода 9 символов и префиксе из 2 символов под числовой номер остается 7 цифр.
  3. Свойство справочника Серии кодов определяет область проверки уникальности (Весь справочник или В пределах подчинения/группы). Если уникальность проверяется во всем справочнике, использование уникальных префиксов гарантирует отсутствие конфликтов между папками.
← На главную