При разработке и доработке конфигураций на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются со ситуацией, когда автонумерация документов начинает работать непредсказуемо. Например, при вызове метода УстановитьНовыйНомер() с заданным префиксом система может сгенерировать странный номер, содержащий посторонние буквенные символы или ошибочные цифровые индексы.
Рассмотрим подробно причины возникновения такой проблемы и способы её устранения.
Проанализируем типовой сценарий. В модуле объекта документа в обработчике события ОбработкаЗаполнения прописан следующий код:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЭтоНовый() Тогда
ЭтотОбъект.УстановитьНовыйНомер("11137-");
КонецЕсли;
КонецПроцедуры
Ожидается, что платформа сгенерирует следующий по порядку номер вида 11137-000000001. Однако вместо этого создается некорректный номер (например, 11137-0тест0001), даже если в списке документов нет записей с подобным индексом.
Выясним основные причины, из-за которых происходят такие сбои в нумераторе:
УстановитьНовыйНомер() в обработчике ОбработкаЗаполнения является методической ошибкой. В этот момент документ еще не записан, а реквизит Дата может быть не заполнен. Если для документа в метаданных задана периодичность нумерации (например, «Год»), платформа ищет последний номер в периоде пустой даты (01.01.0001), что приводит к сбоям.Наиболее быстрым и эффективным способом устранения сбоя нумератора без перезапуска сервера 1С является применение встроенного метода ОбновитьНумерациюОбъектов().
Выполним процедуру пересчета максимальных номеров для конкретного документа. Для этого достаточно запустить в контексте с административными правами следующий код:
ОбновитьНумерациюОбъектов(Метаданные.Документы.МойДокумент);
Этот метод сбрасывает кэшированные значения менеджера нумерации и заново анализирует фактические записи в таблице базы данных для указанного типа объекта, восстанавливая правильный порядок счисления.
Важная деталь: На поведение автонумератора при удалении документов влияет свойство конфигурации «Режим автонумерации объектов». Посмотрим на возможные варианты этого свойства:
Использование функции ОбновитьНумерациюОбъектов() помогает восстановить корректную последовательность независимо от установленного режима нумерации.
Чтобы избежать проблем с нумерацией в будущем, необходимо придерживаться стандарта разработки 1С. Вместо явного вызова УстановитьНовыйНомер() в событии ОбработкаЗаполнения логику установки префикса следует перенести в специальный обработчик события модуля объекта — ПриУстановкеНовогоНомера (или использовать подписку на событие).
Разберем пример правильной реализации:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Префикс = "11137-";
КонецПроцедуры
Посмотрим, почему этот подход является рекомендуемым:
ПриУстановкеНовогоНомера вызывается платформой автоматически непосредственно в транзакции записи документа.Дата уже гарантированно заполнен, поэтому платформа правильно определит период нумерации.Если сбой нумератора вызван залипанием кэша рабочих процессов в клиент-серверном варианте базы и нет возможности выполнить программный код, перезапустите службу агента сервера 1С (1C:Enterprise 8.3 Server Agent) или конкретные рабочие процессы через консоль администрирования. Это полностью очистит оперативную память процессов и принудительно обновит данные автонумератора.