Почему слетает нумерация объектов при копировании базы 1С и как это исправить?

Системный администратор 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При регулярном разворачивании копий рабочей базы 1С на сервере СУБД для тестирования или разработки специалисты нередко сталкиваются с неприятной ошибкой: при попытке создать новый документ или элемент справочника система генерирует старый номер либо выдает ошибку «Номер не уникален». При этом в рабочей базе нумерация продолжается корректно. Разберем детально, почему так происходит на уровне архитектуры платформы 1С:Предприятие и как гарантированно решить проблему.

Причины сбоя автонумерации при восстановлении бэкапа

Проанализируем механизм автонумерации на стороне сервера 1С:Предприятия. Основная причина кроется в кэшировании счетчиков номеров рабочими процессами кластера серверов rphost:

  1. Серверный кэш рабочих процессов: В целях оптимизации производительности сервер 1С кэширует диапазоны и последние выданные номера объектов в оперативной памяти процессов rphost. Когда администратор восстанавливает резервную копию средствами СУБД (например, в MS SQL Server или PostgreSQL) «на лету» поверх существующей тестовой базы, процессы сервера 1С не перезапускаются и сохраняют старые счетчики из своего кэша. В результате сервер пытается присвоить объекту номер, который в восстановленной базе уже занят более поздними записями.
  2. Лексикографическая сортировка строковых номеров: Номера и коды в 1С имеют строковый тип. Если ранее в базу был введен номер без ведущих нулей (например, 99 вместо 0000000099), платформа при поиске максимума считает строку 99 большей, чем 0000000100, так как символ '9' старше '0'. Это сбивает автоматический механизм автоинкремента.
  3. Нарушение порядка присвоения реквизитов: Если нумерация имеет периодичность (например, в пределах года), при программном создании документов важно сначала заполнять реквизит Дата, и только затем вызывать процедуру автонумерации или метод УстановитьНовыйНомер(). В противном случае номер вычисляется для даты по умолчанию, а при смене периода возникает коллизия.

Способ 1. Программный сброс кэша с помощью метода ОбновитьНумерациюОбъектов

Рассмотрим штатный и самый быстрый способ восстановления корректной нумерации без перезапуска всего кластера 1С. В платформе 1С:Предприятие предусмотрен метод глобального контекста ОбновитьНумерациюОбъектов(). Данный метод считывает максимальные номера непосредственно из таблиц базы данных и принудительно обновляет кэш сервера.

Выполнять вызов этого метода разрешено только пользователям с административными правами. Рассмотрим примеры программного вызова:

Для обновления номеров сразу по всем объектам конфигурации (документам, справочникам, бизнес-процессам):


// Сброс и актуализация кэша нумерации для всех объектов метаданных
ОбновитьНумерациюОбъектов();

Если сбой произошел только по определенному типу документов или справочников, можно передать конкретный объект метаданных в качестве параметра:


// Актуализация нумерации только для выбранного документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);

// Актуализация нумерации для конкретного справочника
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Номенклатура);

Также метод принимает массив объектов метаданных, если требуется обновить лишь определенную группу сущностей:


МассивМетаданных = Новый Массив;
МассивМетаданных.Добавить(Метаданные.Документы.ПоступлениеТоваровУслуг);
МассивМетаданных.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
МассивМетаданных.Добавить(Метаданные.Документы.СчетНаОплатуПокупателю);

ОбновитьНумерациюОбъектов(МассивМетаданных);

Важно: После вызова метода ОбновитьНумерациюОбъектов() все ранее выданные сеансам, но еще не записанные в базу номера становятся невалидными.

Способ 2. Корректный регламент копирования базы на уровне СУБД

Чтобы исключить проблему расхождения кэша и данных при регулярном автоматическом обновлении тестовых контуров из ночных бэкапов, скорректируем административный регламент разворачивания баз. Разберем правильную последовательность шагов:

  1. Завершить все активные пользовательские и фоновые сеансы в целевой информационной базе.
  2. Удалить целевую базу из консоли администрирования кластера серверов 1С (без удаления самой базы данных на СУБД) либо временно заблокировать ее.
  3. Выполнить восстановление резервной копии из продуктивной базы средствами СУБД в целевую базу данных.
  4. Заново добавить (зарегистрировать) информационную базу в консоли кластера 1С:Предприятия. При повторной регистрации база инициализируется с чистым контекстом, и старый кэш номеров в rphost не задействуется.
  5. Если на тестовом сервере 1С не размещены другие критичные базы, альтернативным решением является перезапуск службы сервера 1С (ragent) сразу после наката резервной копии.
  6. Встроить выполнение метода ОбновитьНумерациюОбъектов() в скрипт автоматической постобработки базы при первом запуске под служебным пользователем через ключ командной строки /C.
← На главную