Как исправить ошибку «Вставка записи с неуникальным значением ссылки. Таблица ConfigChangeRec» при обновлении 1С?

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

В процессе обновления структуры конфигурации разработчики и системные администраторы могут столкнуться с критическим сбоем: «Ошибка при попытке вставки записи с неуникальным значением ссылки. таблица ConfigChangeRec». Данная ситуация особенно часто проявляется в клиент-серверном варианте работы под управлением СУБД PostgreSQL или MS SQL Server на базах, которые ранее участвовали в распределенной информационной базе (РИБ) или содержат кастомные планы обмена.

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

Почему возникает ошибка в таблице ConfigChangeRec

Служебная таблица _ConfigChangeRec (а также сопутствующая ей _ConfigChangeRec_ExtProps) отвечает за фиксацию изменений метаданных конфигурации для узлов распределенной информационной базы. Когда администратор применяет обновление конфигурации базы данных, платформа автоматически пытается записать измененные структуры метаданных для каждого зарегистрированного узла РИБ.

Проанализируем основные причины сбоя:

  1. Нарушение уникальности записей в планах обмена. Если в базе остались «фантомные» ссылки на удаленные узлы обмена или в таблице регистрации изменений уже присутствуют некорректные записи, платформа пытается повторно вставить уже существующий первичный ключ.
  2. Повреждение индексов в СУБД PostgreSQL. В результате аварийного завершения фоновых процессов, внезапной перезагрузки сервера или сбоев транзакций индекс таблицы может рассинхронизироваться с физическими данными. В этом случае СУБД сообщает о нарушении уникальности индекса при вставке.
  3. Неотключенный признак РИБ. Если база ранее была периферийной или центральной в распределенной сети, но затем обмен был отключен без корректного удаления планов обмена и очистки регистраций, механизм продолжает пытаться протоколировать изменения каждого объекта.
  4. Кэш метаданных сервера 1С. Несоответствие метаданных в оперативной памяти рабочих процессов кластера 1С реальному состоянию схемы данных в PostgreSQL.

Способ 1: Очистка регистрации изменений через встроенный язык 1С

Если база данных запускается в режиме «1С:Предприятие», наиболее безопасным и штатным методом является программная очистка очереди изменений конфигурации для всех узлов планов обмена.

Создадим внешнюю обработку или выполним следующий код во встроенном редакторе или консоли кода:


Для Каждого План Из Метаданные.ПланыОбмена Цикл
    Если План.РаспределеннаяИнформационнаяБаза Тогда
        ВыборкаУзлов = ПланыОбмена[План.Имя].Выбрать();
        Пока ВыборкаУзлов.Следующий() Цикл
            УзелОбъекта = ВыборкаУзлов.ПолучитьОбъект();
            // Не удаляем регистрацию для предопределенного узла (текущей базы)
            Если Не УзелОбъекта.ЭтотУзел() Тогда
                ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбъекта.Ссылка);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

Если база была отключена от распределенной сети, но признак подчиненности остался, дополнительно выполним отвязку главного узла:

ПланыОбмена.УстановитьГлавныйУзел(Неопределено);

После выполнения кода перезапустим сеанс «Конфигуратора» и повторим попытку обновления конфигурации базы данных (клавиша F7).

Способ 2: Очистка и обслуживание служебных таблиц в PostgreSQL

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

Подключимся к СУБД через pgAdmin или консольный клиент psql и выполним очистку таблиц:


TRUNCATE TABLE "_configchangerec";
TRUNCATE TABLE "_configchangerec_extprops";

Обратите внимание: имена таблиц в PostgreSQL чувствительны к регистру, поэтому их необходимо заключать в двойные кавычки.

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


REINDEX TABLE "_configchangerec";
VACUUM FULL ANALYZE "_configchangerec";

Способ 3: Выборочное тестирование и исправление для больших баз

Штатная процедура «Тестирование и исправление» (ТиИ) из меню «Администрирование» -> «Тестирование и исправление...» способна устранить логическую несогласованность ссылок и индексов. Однако для информационных баз объемом свыше 100–200 ГБ запуск полного цикла ТиИ со всеми установленными флагами (особенно «Реструктуризация таблиц информационной базы» и «Пересчет итогов») может занять десятки часов или даже несколько суток.

Рассмотрим регламент ускоренного тестирования для локализации ошибки:

  1. Завершим все сеансы пользователей и регламентные задания.
  2. Запустим «Конфигуратор» в монопольном режиме.
  3. В окне «Тестирование и исправление» снимем все флажки, оставив включенными только два пункта: «Реиндексация таблиц информационной базы» и «Проверка логической целостности информационной базы».
  4. В блоке настроек «При наличии ссылок на несуществующие объекты» выберем «Очищать ссылки».
  5. Нажмем «Выполнить».

Данная комбинация выполняется значительно быстрее полной реструктуризации и при этом восстанавливает целостность связей служебных таблиц.

Способ 4: Очистка серверного кэша 1С:Предприятия

Если после выполнения предыдущих шагов ошибка дублирования ключа повторяется, проанализируем состояние серверного кэша. На сервере под управлением Linux (Ubuntu) кэш сеансов и метаданных может удерживать некорректное состояние схемы.

Выполним процедуру полной очистки кэша кластера серверов:

  1. Остановим службу сервера 1С командой: sudo systemctl stop srv1cv8-8.3... (или соответствующей версией службы).
  2. Перейдем в каталог данных кластера (по умолчанию /home/usr1cv8/.1cv8/1C/1cv8/ или /var/1C/v8.3/).
  3. Удалим содержимое каталогов временных файлов сеансов, начинающихся на snccntx*. Каталоги с идентификаторами баз (содержащие файл 1Cv8.1CD или настройки кластера 1Cv8Reg.lst) удалять нельзя.
  4. Запустим службу сервера 1С: sudo systemctl start srv1cv8-8.3....

После очистки кэша и перезапуска кластера откроем «Конфигуратор» и завершим обновление конфигурации.

← На главную