Нередко системные администраторы и разработчики сталкиваются с ситуацией: после создания копии рабочей базы и ее развертывания из резервной копии СУБД (например, MS SQL Server) пользователи не могут записать ни один новый документ или элемент справочника. При попытке сохранения система выдает сообщение об ошибке: «Номер не уникален» или «Код не уникален». При этом в рабочей базе все функционирует штатно.
В этой статье мы подробно разберем причины такого сбоя, выясним, как работает автонумератор платформы «1С:Предприятие», и рассмотрим все способы гарантированного устранения этой ошибки.
Для понимания корня проблемы проанализируем архитектуру автонумерации в клиент-серверном варианте 1С. Платформа управляет генерацией номеров и кодов через собственный сервис кластера серверов, а не с помощью встроенных средств СУБД:
rphost) кэшируют в оперативной памяти последние сгенерированные и максимальные значения номеров для каждого вида метаданных, префикса и периода.1 вместо стандартного 0000000001), автонумератор переключается на короткую длину. Достигнув предела (например, 99 при двухсимвольной длине), платформа больше не может инкрементировать номер и выдает ошибку уникальности.Это самый быстрый и корректный способ без необходимости перезапуска серверов или монопольной выгрузки базы. Метод доступен только пользователям с административными правами и выполняет синхронизацию нумератора в памяти рабочих процессов с реальными данными в таблицах базы.
Рассмотрим примеры вызова процедуры через внешнюю обработку или консоль кода:
1. Обновление нумерации для всей базы целиком:
ОбновитьНумерациюОбъектов();
2. Обновление нумерации для конкретного типа метаданных или массива объектов:
// Сброс нумератора для конкретного документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
// Сброс нумератора для списка справочников и документов
МассивМетаданных = Новый Массив;
МассивМетаданных.Добавить(Метаданные.Справочники.Контрагенты);
МассивМетаданных.Добавить(Метаданные.Документы.ЗаказПокупателя);
ОбновитьНумерациюОбъектов(МассивМетаданных);
После вызова метода все ранее выданные, но не записанные в базу номера становятся недействительными, а система заново вычисляет следующий свободный номер по фактическим записям в таблицах.
Если программный метод по каким-то причинам недоступен, разберем по шагам очистку состояния кластера через консоль администрирования 1С:
1C:Enterprise Server Agent (ragent), переходим в каталог данных кластера (по умолчанию C:\Program Files\1cv8\srvinfo\...) и очищаем временные кэши сеансов и рабочих процессов.Для баз небольшого объема (до 4–8 Гб) эффективным решением остается классическая цепочка действий:
*.dt.При загрузке из *.dt платформа заново пересчитывает все внутренние структуры, индексы и состояние нумераторов, что гарантированно устраняет рассинхронизацию.
Если после очистки кэша нумератора ошибка возвращается при создании конкретного вида документа, проанализируем последние номера в таблице:
УТ00-000125 вместо 125).ОбновитьНумерациюОбъектов() для данного вида метаданных.