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

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

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

Постановка задачи и анализ ситуации

Представим ситуацию: в системе имеется около 20 (или более) различных видов документов, часть из которых является нетиповыми. Нам необходимо сделать так, чтобы при создании нового документа система автоматически определяла подразделение текущего пользователя и подставляла соответствующий префикс в номер документа. Например, для подразделения "Продажи" номер должен выглядеть как ПРК000001, а для подразделения "Доставка" — ПРД000001.

Проанализируем основные сложности:

Решение 1: Использование префиксов в событии установки нового номера

Самый простой и правильный с точки зрения платформы способ — это использование стандартного параметра Префикс в обработчике ПриУстановкеНовогоНомера. Рассмотрим, как это можно реализовать программно.

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


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

Важный нюанс: Платформа 1С автоматически ищет максимальный номер в базе данных, основываясь на переданном префиксе. Если вы установили Префикс = "ПРК", система найдет последний номер, начинающийся на "ПРК", и прибавит к нему единицу. Это избавляет нас от необходимости писать сложные запросы ВЫБРАТЬ МАКСИМУМ(Номер).

Решение 2: Динамическая работа с метаданными

Если нам нужно проанализировать существующие документы или программно изменить их номера, мы можем воспользоваться коллекцией Метаданные. Это позволяет не перечислять все виды документов вручную.

Рассмотрим, как можно перебрать все документы в системе и найти те, у которых есть реквизит Подразделение, чтобы сформировать по ним запрос:


Для каждого МетаДокумент Из Метаданные.Документы Цикл
    // Проверяем наличие нужного реквизита
    Если МетаДокумент.Реквизиты.Найти("Подразделение") <> Неопределено Тогда
        ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Документ." + МетаДокумент.Имя + " ГДЕ Подразделение = &Подразделение";
        // Далее выполняем запрос и обрабатываем ссылки
    КонецЕсли;
КонецЦикла;

Проанализируем этот подход: он удобен для разовых обработок данных, но не подходит для оперативной работы, так как перебор метаданных — операция ресурсоемкая.

Решение 3: Подписка на событие (Рекомендуемое решение)

Чтобы не изменять каждый документ (особенно если их 20 или 200), мы создадим одну Подписку на событие. Это наиболее профессиональный подход в разработке на 1С.

Пошаговый алгоритм реализации:

  1. Создадим в конфигураторе новый объект Подписка на событие.
  2. В поле Источник выберем ДокументОбъект (или отметим галочками только те документы, для которых нужна нумерация).
  3. В поле Событие выберем ПриУстановкеНовогоНомера.
  4. Создадим общий модуль (например, СервисНумерации) и пропишем там процедуру-обработчик.

Рассмотрим пример реализации в общем модуле:


Процедура ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
    
    // Если подразделение в документе заполнено, используем его код
    Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Подразделение", Источник) Тогда
        Если ЗначениеЗаполнено(Источник.Подразделение) Тогда
            КодПодразделения = СокрЛП(Источник.Подразделение.Код);
            // Формируем комбинированный префикс
            Префикс = КодПодразделения + "-"; 
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Преимущества этого метода:

Особенности работы в распределенных базах (РИБ)

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

[ПрефиксИБ][ПрефиксПодразделения][ПорядковыйНомер]

Например: ЦБ (Центральная база) + ПРК (Продажи) + 00001 = ЦБПРК00001.

Типичные ошибки при ручной установке номера

Часто программисты пытаются сами вычислить последний номер через запрос МАКСИМУМ(Номер). Разберем, почему это плохо:

Правильный путь: Использовать встроенный механизм 1С. Когда вы передаете строку в параметр Префикс, платформа сама выполняет оптимизированный запрос к индексам таблиц на уровне SQL, что работает значительно быстрее и безопаснее.

Если же номера в базе уже "испорчены" (например, после ручного ввода номеров без префиксов), стоит воспользоваться методом ОбновитьНумерациюОбъектов(). Этот метод сбрасывает кэш нумератора и заставляет систему пересчитать актуальные индексы номеров в базе данных.

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

← На главную