При интенсивном документообороте в программах системы 1С:Предприятие нередко возникает ситуация, когда при попытке создать или записать очередной документ система выдает ошибку: «Номер не уникальный». Особенно часто этот сбой проявляется на «пограничных» значениях — например, когда нумератор доходит до значения 099999 и вместо перехода на 100000 продолжает упорно предлагать уже занятый номер 099999, даже если документ с номером 100000 уже был успешно создан вручную.
Разберем подробно, почему механизм автонумерации платформы дает сбой в таких случаях, и какие шаги необходимо предпринять для устранения проблемы.
Выясним причину некорректного поведения системы. Механизм генерации номеров в платформе 1С опирается на строковое представление номера, разделяя его на две составляющие: префиксную (слева) и числовую часть (справа).
099998, 099999), платформа может воспринять лидирующий ноль как часть текстового префикса, а не как разряд числа. При попытке сформировать следующий номер 100000 разрядность увеличивается, ноль вытесняется, из-за чего шаблон префикса меняется. Платформа пытается продолжить инкремент по старому шаблону с префиксом 0, упирается в максимальное значение 099999 и повторяет его.rphost) кэширует в оперативной памяти последний выданный номер. Если кэш зафиксировал последний номер некорректно, система будет выдавать ошибку вплоть до принудительного обновления.Нумератор).0 случайно введена русская или латинская буква О/o, либо скрытые неразрывные пробелы, искажающие строковую сортировку.Проанализируем базовый программный метод платформы. Если нумерация сбилась из-за кэша или ручного ввода номеров, администратор системы может выполнить принудительное обновление пространства номеров с помощью функции ОбновитьНумерациюОбъектов().
Посмотрим на пример вызова метода для конкретного вида документов:
// Обновление нумерации для конкретного типа документа
ОбъектыМетаданных = Новый Массив;
ОбъектыМетаданных.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
ОбновитьНумерациюОбъектов(ОбъектыМетаданных);
Если требуется обновить нумерацию абсолютно для всех объектов информационной базы, вызовем метод без передачи параметров:
// Полное обновление нумерации по всей информационной базе
ОбновитьНумерациюОбъектов();
Данный метод считывает максимальные номера, фактически записанные в таблицах базы данных, и сбрасывает закэшированные невалидные счетчики.
Если вызов функции обновления не решил проблему, рассмотрим структуру текущих номеров. Когда число знаков приближается к пределу разрядности, необходимо обеспечить запас лидирующих нулей.
Номер в конфигураторе (рекомендуемая длина — от 9 до 11 символов).099999 и 100000 задайте формат 0099999 и 0100000.ОбновитьНумерациюОбъектов(). В этом случае механизм автонумерации четко распознает числовую часть и сможет корректно сформировать следующий номер 0100001.В ряде случаев в клиент-серверном режиме удерживаемый процессом rphost диапазон номеров не сбрасывается штатной процедурой. В такой ситуации разберем действия системного администратора:
ragent (или перезапустите рабочие процессы кластера).Если ошибка сохраняется, выполним поиск скрытых документов-дублей:
099999 может принадлежать документу совершенно другого типа.