Как исправить сбой и некорректное формирование номеров при использовании метода УстановитьНовыйНомер() в 1С

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

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

Рассмотрим подробно причины возникновения такой проблемы и способы её устранения.

Суть проблемы: почему генерируется некорректный номер

Проанализируем типовой сценарий. В модуле объекта документа в обработчике события ОбработкаЗаполнения прописан следующий код:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ЭтоНовый() Тогда
        ЭтотОбъект.УстановитьНовыйНомер("11137-");
    КонецЕсли;
КонецПроцедуры

Ожидается, что платформа сгенерирует следующий по порядку номер вида 11137-000000001. Однако вместо этого создается некорректный номер (например, 11137-0тест0001), даже если в списке документов нет записей с подобным индексом.

Выясним основные причины, из-за которых происходят такие сбои в нумераторе:

  1. Рассинхронизация кэша нумерации на сервере 1С. В клиент-серверном режиме работы менеджер автонумерации хранит диапазоны и максимальные значения номеров в оперативной памяти рабочих процессов сервера. Если документы удалялись, изменялись напрямую или база восстанавливалась из резервной копии, кэш нумератора может содержать устаревшие данные.
  2. Некорректная точка вызова метода. Вызов УстановитьНовыйНомер() в обработчике ОбработкаЗаполнения является методической ошибкой. В этот момент документ еще не записан, а реквизит Дата может быть не заполнен. Если для документа в метаданных задана периодичность нумерации (например, «Год»), платформа ищет последний номер в периоде пустой даты (01.01.0001), что приводит к сбоям.
  3. Ограничения прав на уровне записей (RLS). Если у пользователя нет прав на просмотр документов с максимальными номерами, платформа при вычислении очередного номера не видит скрытые записи.

Способ 1. Обновление нумерации объектов в базе данных

Наиболее быстрым и эффективным способом устранения сбоя нумератора без перезапуска сервера 1С является применение встроенного метода ОбновитьНумерациюОбъектов().

Выполним процедуру пересчета максимальных номеров для конкретного документа. Для этого достаточно запустить в контексте с административными правами следующий код:

ОбновитьНумерациюОбъектов(Метаданные.Документы.МойДокумент);

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

Важная деталь: На поведение автонумератора при удалении документов влияет свойство конфигурации «Режим автонумерации объектов». Посмотрим на возможные варианты этого свойства:

  1. Освобождать автоматически: При удалении объекта или отмене транзакции его номер освобождается и может быть повторно занят новым документом.
  2. Не освобождать: Пропущенные и удаленные номера не используются повторно, нумератор всегда движется только вперед.

Использование функции ОбновитьНумерациюОбъектов() помогает восстановить корректную последовательность независимо от установленного режима нумерации.

Способ 2. Правильное назначение префикса через событие ПриУстановкеНовогоНомера

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

Разберем пример правильной реализации:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    Префикс = "11137-";
КонецПроцедуры

Посмотрим, почему этот подход является рекомендуемым:

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

Способ 3. Перезапуск службы агента сервера 1С

Если сбой нумератора вызван залипанием кэша рабочих процессов в клиент-серверном варианте базы и нет возможности выполнить программный код, перезапустите службу агента сервера 1С (1C:Enterprise 8.3 Server Agent) или конкретные рабочие процессы через консоль администрирования. Это полностью очистит оперативную память процессов и принудительно обновит данные автонумератора.

← На главную