Как исправить ошибку с дубликатом ключа в индексе CHILD таблицы _1SCRDOC в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При активной доработке конфигурации 1С 7.7, работающей в связке с Microsoft SQL Server, разработчики нередко сталкиваются с аварийным завершением работы Конфигуратора. Типичная ситуация: создается новый журнал документов, добавляются новые графы отбора или изменяется состав реквизитов, после чего при сохранении метаданных платформа зависает и выдает ошибку SQL State 2000: The CREATE UNIQUE INDEX statement terminated because a duplicate key was found. The object name dbo._1SCRDOC and the index name CHILD. Выясним причину этой неполадки и подробно рассмотрим шаги по ее устранению.

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

Таблица _1SCRDOC (служебная таблица «Ссылки документов») отвечает за хранение информации о перекрестных ссылках между документами. Она обеспечивает функционирование дерева подчиненных документов, быстрое построение журналов и работу механизмов отбора по графам. Основной уникальный индекс этой таблицы носит наименование CHILD и формируется по трем полям:

  1. CHILDID — идентификатор подчиненного документа (соответствует полю IDDOC из таблицы _1SJOURN);
  2. MDID — идентификатор объекта метаданных (графы отбора, общего реквизита или 0 для стандартной связи подчинения);
  3. PARENTVAL — строковое представление родительского документа или значения реквизита отбора.

В момент добавления нового журнала или графы отбора Конфигуратор инициирует реструктуризацию таблицы и пытается заново пересоздать индекс с требованием уникальности. Если в таблице уже присутствуют строки с полностью идентичной комбинацией CHILDID + MDID + PARENTVAL, сервер СУБД отвергает создание индекса, и сессия 1С аварийно завершается.

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

  1. Некорректная настройка граф отбора: если в одну и ту же графу отбора включено несколько реквизитов одного документа (например, реквизит шапки и реквизит табличной части) и их значения совпали, платформа пытается записать дублирующие связки.
  2. Повторяющиеся ссылки в табличной части: указание одного и того же документа-основания в разных строках табличной части подчиненного документа.
  3. Сбои транзакций: аварийные отключения пользователей или сетевые разрывы в момент проведения документов, из-за чего старые служебные записи не очистились перед добавлением новых.

Способ 1. Поиск и исправление проблемных документов в базе

Самый правильный путь исправления — локализовать документы, породившие дублирующие записи, и исправить сами данные. Для поиска проблемных документов обратимся напрямую к SQL Server Management Studio (или Query Analyzer) и выполним следующий аналитический запрос:


SELECT distinct
    _1sjourn.docno,
    _1sjourn.DATE_TIME_IDDOC
FROM [dbo].[_1SCRDOC]
    LEFT JOIN [dbo].[_1SJOURN] 
    ON [_1SCRDOC].childid = [_1SJOURN].IDDOC 
GROUP BY PARENTVAL, CHILDID, MDID, DOCNO, DATE_TIME_IDDOC
HAVING COUNT(*) > 1
ORDER BY DATE_TIME_IDDOC;

Разберем полученный результат. Запрос вернет номер проблемного документа (DOCNO) и его внутреннюю позицию с идентификатором (DATE_TIME_IDDOC). По этим данным мы легко найдем документ в пользовательском режиме 1С.

Чтобы понять, какая именно графа отбора или реквизит вызвали сбой, посмотрим на значение MDID из текста ошибки или расширенного запроса. Откроем файл словаря структуры базы данных 1Cv7.DD (или 1Cv7.DDS) в каталоге информационной базы через текстовый редактор и выполним поиск по числовому значению MDID. Это позволит определить конкретный реквизит или графу отбора и скорректировать метаданные так, чтобы исключить дублирование данных в будущем.

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

Способ 2. Экстренный обход ошибки через файл словаря данных (DDS)

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

Разберем последовательность действий:

  1. Обязательно создадим резервную копию базы данных на SQL Server и копию каталога информационной базы.
  2. Найдем в каталоге базы файл 1Cv7.DDS и откроем его любым текстовым редактором.
  3. Найдем секцию описания таблицы _1SCRDOC и блок описания индексов #----Indexes------.
  4. Найдем индекс с именем CHILD. В строке параметров индекса найдем флаг уникальности и временно изменим его значение на 0 (снятие требования уникальности).
  5. Сохраним изменения в файле и запустим сохранение конфигурации или вход в базу данных. Платформа создаст индекс без проверки уникальности записей.
  6. Зайдем в режиме «1С:Предприятие» и перепроведем проблемные документы, выявленные SQL-запросом.

Важное предупреждение: изменение флага уникальности в 1Cv7.DDS является лишь временной мерой для получения доступа к данным. При следующем изменении метаданных Конфигуратор заново перезапишет файл 1Cv7.DDS из файла 1Cv7.MD, восстановит требование уникальности индекса и ошибка повторится, если дубликаты не были устранены в самих таблицах.

Способ 3. Пакетная очистка дублей средствами SQL

Если документов с дубликатами слишком много или они относятся к закрытым периодам, которые нежелательно перепроводить, устраним дубликаты непосредственно на стороне СУБД с помощью инструкции обобщенного табличного выражения (CTE):


WITH Duplicates AS (
    SELECT ROW_ID,
           ROW_NUMBER() OVER (
               PARTITION BY CHILDID, MDID, PARENTVAL 
               ORDER BY ROW_ID
           ) AS RowNum
    FROM _1SCRDOC
)
DELETE FROM Duplicates WHERE RowNum > 1;

Этот скрипт оставит ровно одну уникальную запись для каждой связки CHILDID + MDID + PARENTVAL и удалит все лишние повторы. После выполнения запроса вернемся в Конфигуратор и завершим операцию сохранения структуры — уникальный индекс CHILD будет успешно построен.

Способ 4. Полная перегенерация таблицы _1SCRDOC (рекомендуемый метод)

Таблица _1SCRDOC содержит исключительно производные, вычисляемые данные, которые можно полностью восстановить штатными механизмами платформы. Если в таблице накопилось множество некорректных связей из-за сбоев прошлых лет, наиболее чистым решением является ее полная переиндексация с нуля.

Выполним процедуру по шагам:

  1. Создадим полную резервную копию базы данных.
  2. В SQL Server Management Studio выполним команду полной очистки таблицы: TRUNCATE TABLE _1SCRDOC;
  3. Запустим 1С 7.7 в режиме Конфигуратор в монопольном режиме.
  4. Откроем меню Администрирование -> Тестирование и исправление ИБ.
  5. Снимем все флажки, кроме одного пункта: «Пересчет служебных данных».
  6. Нажмем кнопку «Выполнить».

В процессе пересчета служебных данных платформа последовательно обработает все документы информационной базы и заново сформирует содержимое таблицы _1SCRDOC. В результате все дубликаты будут исключены, структура таблицы станет полностью консистентной, а индекс CHILD успешно зафиксируется со статусом уникальности.

← На главную