В процессе работы с программой «1С:Управление торговлей» редакции 11 пользователи часто сталкиваются с ситуацией, когда при попытке создать или записать новый документ (например, «Приходный кассовый ордер») система выдает ошибку: «Значение поля "Номер" не уникально». Особенно остро проблема проявляется, когда текущий номер достигает определенного порога, например, 0К00-099999. В этой статье мы подробно разберем, почему так происходит, как работают механизмы нумерации 1С и какие шаги необходимо предпринять для исправления ситуации.
Разберем первопричину ошибки. В типовых конфигурациях 1С для большинства документов длина поля Номер ограничена в метаданных и составляет, как правило, 11 символов. Структура номера обычно включает в себя префикс организации, префикс информационной базы и собственно числовую часть.
Проанализируем ситуацию автора темы. Номер выглядит так: 0К00-099999.
Посчитаем количество символов:
0К00- — это 5 символов (префикс плюс дефис).
099999 — это еще 6 символов.
Итого: 11 символов. Это максимально допустимая длина строки для данного реквизита. Когда система пытается создать следующий номер, она прибавляет единицу к числовой части и должна получить 100000. Однако при добавлении префикса итоговая строка 0К00-100000 составит уже 12 символов, что физически не помещается в поле базы данных. В результате платформа «обрезает» номер или не может корректно инкрементировать его, что и приводит к конфликту уникальности.
Выясним причину появления лишних символов в префиксе. Часто в конфигурациях встречается обработчик события ПриУстановкеНовогоНомера, который программно модифицирует префикс в зависимости от определенных условий. Посмотрим на пример кода, который был обнаружен в модуле объекта документа:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы Тогда
Префикс = "В";
Иначе
Префикс = "0";
КонецЕсли;
КонецПроцедуры
В данном случае, если операция не является внутренним перемещением, система принудительно добавляет в префикс символ 0. Именно этот дополнительный ноль «съедает» один разряд у числовой части номера, ограничивая максимальное количество документов в серии до 99 999 штук вместо возможных 999 999.
Иногда ошибка может быть вызвана сбоем механизма автонумерации на стороне сервера 1С. Начиная с версии платформы 8.2, система кэширует номера (обычно по 10 штук) для ускорения работы. Если в кэш попал некорректный номер или произошла ошибка транзакции, следует выполнить следующие действия:
ОбновитьНумерациюОбъектов(). Это можно сделать через консоль кода или специальную обработку. Этот метод заставляет платформу заново просканировать базу данных и актуализировать последний номер.0К00-099999 ), автонумерация собьется.В новых версиях конфигураций «Управление торговлей» (например, 11.3 и выше) проблему можно решить штатными средствами настройки. Если нумерация по общей кассе исчерпана, можно выполнить следующие шаги:
После этого нумерация для данной кассы начнется с единицы в рамках нового префикса, и конфликт уникальности исчезнет.
Рассмотрим вариант, когда необходимо продолжить работу без изменения настроек кассовой книги. Мы можем принудительно сменить серию нумерации, изменив префикс в самом коде или вручную в последнем документе.
Например, если текущая серия 0К00- исчерпана, можно создать новый документ и вручную присвоить ему номер 0К01-000001. Важно убедиться, что новый префикс (в данном случае 0К01-) имеет ту же длину, что и старый, иначе при переходе через разряд ситуация повторится. После записи документа с новым префиксом платформа должна подхватить его и продолжить автоматическую нумерацию уже в новой серии.
Если бизнес-процессы не позволяют менять префиксы, а количество документов превышает лимиты, единственным техническим выходом является увеличение длины реквизита Номер в метаданных документа.
Проанализируем последствия: изменение длины номера потребует снятия конфигурации с поддержки (или использования расширения в современных версиях). Мы рекомендуем увеличить длину с 11 до 13 или 15 символов. Это даст значительный запас по количеству документов на многие годы вперед. После изменения длины обязательно выполните метод УстановитьНовыйНомер() для новых объектов, чтобы система пересчитала доступные диапазоны.