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

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

При работе в 1С часто возникает необходимость присвоить отдельным документам специфические номера (например, с буквенными суффиксами или произвольной структурой), не нарушая при этом последовательность стандартной автонумерации остальных документов того же вида. Проанализируем, почему возникает эта проблема и какие решения существуют в платформе 1С.

Выясним причину сбоя стандартного нумератора

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

Если пользователь вручную вводит номер с буквенным суффиксом (например, 00000100а) или с нетипично большим числом, система может неправильно выделить числовую часть или запомнить этот номер как новый максимум. В результате последующая автонумерация "залипает" или начинает выдавать ошибки уникальности номера. Платформа 1С не имеет штатных фильтров в настройках метаданных, позволяющих проигнорировать конкретный записанный документ при стандартном поиске максимума.

Способ 1. Использование префиксов (стандартный подход типовых решений)

Рассмотрим наиболее простое и типовое решение, не требующее сложной переработки логики нумерации. В 1С пространство номеров разделяется по префиксам. Для обычных документов и для "особых" документов создаются разные префиксы.

Разберем по шагам, как это устроено на примере типовых конфигураций (например, при нумерации счетов-фактур на аванс):

  1. Для стандартных документов используется основной префикс (или нулевой префикс 00).
  2. Для специальных документов подставляется специальный префикс (например, АВ или буквенный код подразделения).
  3. В результате платформа ведет две независимые последовательности номеров: одна для обычных документов, другая — для исключительных.

Способ 2. Разделение системного и пользовательского номеров

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

  1. Стандартный реквизит Номер оставляем исключительно для платформенной автонумерации и нумеруем им все документы подряд без исключения.
  2. Создаем для документа дополнительный реквизит (например, ПользовательскийНомер или ВнешнийНомер).
  3. В случаях, когда документу требуется задать особый номер, заполняем именно дополнительный реквизит.
  4. При формировании печатных форм, отчетов и списков документов настраиваем вывод: если заполнен ПользовательскийНомер, выводим его, иначе выводим стандартный Номер.

Способ 3. Программная поддержка нумерации в событии ПриУстановкеНовогоНомера

Посмотрим на вариант, когда необходимо полностью перехватить логику присвоения номера на уровне программного кода. В модуле объекта документа можно обработать событие ПриУстановкеНовогоНомера.

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

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


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

Способ 4. Использование регистра сведений для контроля счетчика

Рассмотрим еще одну практику — ведение собственного счетчика номеров в отдельном регистре сведений. Посмотрим, как это работает:

  1. Создается регистр сведений для хранения текущего значения счетчика стандартных номеров.
  2. При создании и записи нового стандартного документа система считывает номер из регистра, увеличивает его на 1 и обновляет запись в регистре в рамках транзакции.
  3. При записи документа со специальным номером значение счетчика в регистре сведений не меняется.

Такой подход гарантирует полное абстрагирование автонумерации от введенных вручную нетипичных номеров и исключает блокировки или сбои уникальности.

← На главную