При работе в конфигурациях на платформе 1С:Предприятие 8.3 (например, 1С:Управление торговлей 11 или 1С:ERP) пользователи и разработчики иногда сталкиваются с аномальным поведением системы. В форме документа отображается один номер (например, 112СС-З-АБ), но при попытке проведения или записи платформа выдает системную ошибку: «Значение "АБУТ-818ХА9" поля "Номер" не уникально». При этом номер из текста ошибки принадлежит совершенно другому документу, а точка останова в модуле формы перед вызовом Форма.Записать() показывает, что реквизит Номер содержит верное значение.
Рассмотрим подробнее причины возникновения этой технической проблемы и разберем по шагам эффективные способы её устранения.
Проанализируем ситуацию, почему платформа 1С может подменять корректный номер на чужое значение в момент записи транзакции:
112СС-З-АБ) нарушает стандартный алгоритм автонумерации 1С. Платформа ожидает структуру вида «Префикс + Числовой номер с лидирующими нулями». При отсутствии явной числовой части в конце строки нумератор не может корректно вычислить приращение.Если ошибка возникла при редактировании существующего документа и носит разовый характер, разберем самое простое и быстрое обходное решение. Оно позволяет сбросить некорректный внутренний контекст объекта и разорвать связь с заблокированным диапазоном номеров.
Посмотрим на пример использования штатной функции платформы 1С для сброса и пересчета максимального номера в базе данных. Выполним команду ОбновитьНумерациюОбъектов(). Данную процедуру можно вызвать во внешней обработке или через консоль кода:
// Пересчет нумерации для документа "ЗаказКлиента"
ОбновитьНумерациюОбъектов(Метаданные.Документы.ЗаказКлиента);
Этот метод заставляет платформу заново проанализировать существующие номера в таблице базы данных и пересчитать следующий свободный индекс. Однако следует учитывать, что метод не всегда сразу сбрасывает уже закэшированные диапазоны в активных сеансах пользователей без перезапуска сеанса.
Проанализируем код модуля объекта и подписок на события. Если ошибка ссылается на номер другого документа, проверим, не происходит ли при проведении фоновая запись сопутствующих сущностей.
ОбработкаПроведения и подписки на событие ОбработкаПроведения.Записать() для других документов, у которых номер совпадает с указанным в ошибке (например, АБУТ-818ХА9).Если проблема с неверным распределением номеров приобретает массовый характер, рекомендуется очистить сеансовый кэш на стороне сервера приложений. Для этого администратор системы производит перезапуск службы 1C:Enterprise Server в консоли служб операционной системы. Это принудительно сбрасывает все зарезервированные диапазоны автонумераторов в памяти сеансов.
Чтобы избежать подобных сбоев в будущем, соблюдаем следующие рекомендации по нумерации:
АБУТ-0000818).ВнешнийНомер), оставляя стандартное поле Номер для системной нумерации 1С.