В процессе обновления структуры конфигурации разработчики и системные администраторы могут столкнуться с критическим сбоем: «Ошибка при попытке вставки записи с неуникальным значением ссылки. таблица ConfigChangeRec». Данная ситуация особенно часто проявляется в клиент-серверном варианте работы под управлением СУБД PostgreSQL или MS SQL Server на базах, которые ранее участвовали в распределенной информационной базе (РИБ) или содержат кастомные планы обмена.
Разберем детально, почему возникает эта ошибка, как устроена служебная таблица ConfigChangeRec и какие существуют безопасные способы восстановления работоспособности базы данных.
Служебная таблица _ConfigChangeRec (а также сопутствующая ей _ConfigChangeRec_ExtProps) отвечает за фиксацию изменений метаданных конфигурации для узлов распределенной информационной базы. Когда администратор применяет обновление конфигурации базы данных, платформа автоматически пытается записать измененные структуры метаданных для каждого зарегистрированного узла РИБ.
Проанализируем основные причины сбоя:
Если база данных запускается в режиме «1С:Предприятие», наиболее безопасным и штатным методом является программная очистка очереди изменений конфигурации для всех узлов планов обмена.
Создадим внешнюю обработку или выполним следующий код во встроенном редакторе или консоли кода:
Для Каждого План Из Метаданные.ПланыОбмена Цикл
Если План.РаспределеннаяИнформационнаяБаза Тогда
ВыборкаУзлов = ПланыОбмена[План.Имя].Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
УзелОбъекта = ВыборкаУзлов.ПолучитьОбъект();
// Не удаляем регистрацию для предопределенного узла (текущей базы)
Если Не УзелОбъекта.ЭтотУзел() Тогда
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбъекта.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если база была отключена от распределенной сети, но признак подчиненности остался, дополнительно выполним отвязку главного узла:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
После выполнения кода перезапустим сеанс «Конфигуратора» и повторим попытку обновления конфигурации базы данных (клавиша F7).
Если база данных не используется в качестве главного узла РИБ, из которого требуется передавать изменения конфигурации в подчиненные узлы, служебные таблицы регистрации можно безопасно очистить напрямую средствами СУБД. Перед выполнением любых операций обязательно создадим резервную копию базы данных.
Подключимся к СУБД через pgAdmin или консольный клиент psql и выполним очистку таблиц:
TRUNCATE TABLE "_configchangerec";
TRUNCATE TABLE "_configchangerec_extprops";
Обратите внимание: имена таблиц в PostgreSQL чувствительны к регистру, поэтому их необходимо заключать в двойные кавычки.
Если очистка таблиц нежелательна, выполним процедуру восстановления целостности индексов и физической структуры таблицы:
REINDEX TABLE "_configchangerec";
VACUUM FULL ANALYZE "_configchangerec";
Штатная процедура «Тестирование и исправление» (ТиИ) из меню «Администрирование» -> «Тестирование и исправление...» способна устранить логическую несогласованность ссылок и индексов. Однако для информационных баз объемом свыше 100–200 ГБ запуск полного цикла ТиИ со всеми установленными флагами (особенно «Реструктуризация таблиц информационной базы» и «Пересчет итогов») может занять десятки часов или даже несколько суток.
Рассмотрим регламент ускоренного тестирования для локализации ошибки:
Данная комбинация выполняется значительно быстрее полной реструктуризации и при этом восстанавливает целостность связей служебных таблиц.
Если после выполнения предыдущих шагов ошибка дублирования ключа повторяется, проанализируем состояние серверного кэша. На сервере под управлением Linux (Ubuntu) кэш сеансов и метаданных может удерживать некорректное состояние схемы.
Выполним процедуру полной очистки кэша кластера серверов:
sudo systemctl stop srv1cv8-8.3... (или соответствующей версией службы)./home/usr1cv8/.1cv8/1C/1cv8/ или /var/1C/v8.3/).snccntx*. Каталоги с идентификаторами баз (содержащие файл 1Cv8.1CD или настройки кластера 1Cv8Reg.lst) удалять нельзя.sudo systemctl start srv1cv8-8.3....После очистки кэша и перезапуска кластера откроем «Конфигуратор» и завершим обновление конфигурации.