При активной разработке и тестировании часто используется сценарий разворачивания свежих копий рабочих баз данных средствами СУБД (через операцию SQL backup / restore). Однако разработчики и системные администраторы нередко сталкиваются с проблемой: после очередного восстановления копии при создании новых документов или справочников возникает ошибка «Значение поля номер не уникально» или автонумератор начинает выдавать старые, уже использованные номера.
Проанализируем причины возникновения этой проблемы на уровне клиент-серверного архитектурного взаимодействия 1С и СУБД, а также рассмотрим практические способы её устранения и автоматизации.
Для ускорения работы и предотвращения избыточных блокировок в СУБД платформа «1С:Предприятие 8.3» использует механизм кэширования нумераторов. Сервер приложений 1С хранит в оперативной памяти рабочих процессов (rphost / rmngr) закэшированные значения максимальных номеров документов и кодов справочников для каждого периода и префикса.
Когда процедура восстановления резервной копии выполняется непосредственно средствами SQL-сервера, таблицы базы данных перезаписываются в обход кластера 1С. Поскольку сервер приложений не получает никаких уведомлений от СУБД об изменении данных в таблицах, в оперативной памяти процессов rphost остается устаревший кэш нумераторов. В результате при создании нового документа платформа берет следующий номер из старого кэша, что приводит к конфликту уникальности с уже существующими в восстановленной базе записями.
Самым быстрым и безопасным решением без остановки сеансов других пользователей является использование встроенной функции платформы ОбновитьНумерациюОбъектов(). Данный метод принудительно пересчитывает актуальные максимальные номера в базе данных и обновляет кэш сервера приложений.
Рассмотрим пример вызова данной функции. Метод можно вызывать как для всех объектов метаданных сразу, так и выборочно для конкретных типы объектов:
// Вызов обновления нумерации для всех объектов конфигурации
ОбновитьНумерациюОбъектов();
// Выборочное обновление нумерации для конкретных видов документов
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
МассивОбъектов.Добавить(Метаданные.Документы.СчетНаОплатуПокупателю);
ОбновитьНумерациюОбъектов(МассивОбъектов);
Важные особенности применения метода:
АдминистраторСистемы).ОбновитьНумерациюОбъектов() без параметров на крупных конфигурациях с миллиардными объемами данных, платформа выполнит полный сканирующий опрос всех таблиц справочников и документов. На больших базах это может вызвать ощутимую задержку. Рекомендуется передавать массив конкретных объектов метаданных, в которых активно вводятся новые записи.Поскольку кэш нумерации держится в оперативной памяти процесса rphost, проблема также полностью устраняется сбросом состояния процессов сервера приложений 1С.
Разберем основные варианты применения этого подхода:
rac можно автоматизировать процесс перерегистрации базы в скриптах сразу после завершения восстановления базы на SQL-сервере.Чтобы избежать ошибок пользователей и разработчиков после очередного разворачивания бэкапа, разберем порядок настройки автоматического вызова обновления нумерации:
ПриНачалеРаботыСистемы в модуле управляемого приложения выполянем проверку, является ли текущая база копией (например, с помощью встроенных механизмов БСП ЗаполнениеДокументов.ЭтоКопияМногопоточнойБазы() или проверки имени информационной базы/сервера).V83.COMConnector) сразу после выполнения команды восстановления бэкапа в SQL.Для предотвращения влияния операций восстановления баз на работу команды разберем архитектурные практики изоляции среды:
Вынесите тестовые и разработческие базы на отдельный рабочий процесс 1С или создайте отдельный локальный кластер серверов (на альтернативных сетевых портах, например 1640, 1641). В таком случае перезапуск процессов rphost или перерегистрация тестовых баз не будут затрагивать продуктивную среду и работу остальных специалистов.