При длительной эксплуатации файловой базы 1С:Предприятие 7.7 или при подготовке к переходу на Microsoft SQL Server разработчики нередко сталкиваются с ошибками нарушения ссылочной целостности и уникальности внутренних ключей. Штатная процедура тестирования и исправления (ТиИ) выдает предупреждение вида: «Проверка уникальности внутреннего идентификатора в справочнике... Исправить вручную». Платформа фиксирует наличие двух и более записей с одинаковым внутренним кодом, но автоматически устранить коллизию не может. Разберем детально, как устроены идентификаторы в 1С 7.7, к чему приводит их задвоение и как корректно восстановить целостность базы данных.
Проанализируем структуру хранения ссылок в файловом формате DBF. Каждый элемент справочника, документ или строка имеют внутренний идентификатор (поле ID в таблицах SC*.DBF, поле IDDOC в журнале 1SJOURN.DBF):
0-9 и латинских букв A-Z. Для программного преобразования между десятичным числом и строковым представлением платформа использует встроенные функции _IdToStr() и _StrToId().1SUIDCTL.DBF и индексы таблиц. Если в файловом режиме при сбое индексных файлов *.CDX база может продолжать работать с задвоенным ID, то при конвертации в SQL накладываются жесткие ограничения первичного ключа (PRIMARY KEY), что приводит к сбою загрузки.Прежде чем приступать к любым правкам, обязательно выполним полное резервное копирование каталога информационной базы. Все дальнейшие манипуляции проводим исключительно на тестовой копии.
Выясним причину, почему нельзя просто отредактировать ID в DBF-редакторе на случайное значение:
ID записан в таблицах шапок (DH*.DBF) и табличных частей документов (DT*.DBF), в движениях и итогах регистров (RA*.DBF, RG*.DBF), а также в периодических реквизитах (1SCONST.DBF).ID встроенные отчеты платформы объединяют движения обоих объектов или отображают только первый найденный по индексу элемент.Наиболее безопасный путь, гарантирующий сохранение ссылочной целостности всех связанных регистров и документов, заключается в использовании встроенного языка 1С:
ID в Base-36.ПоискИЗаменаЗначений или ReplVal.ert) производим поиск всех ссылок на дублирующий элемент и перенаправляем их на вновь созданную позицию.Если один из дубликатов является ошибочной «пустышкой», не имеющей движений в документах и регистрах, либо требуется физически убрать лишнюю запись из таблицы:
1CV7.DD (например, справочнику «Продукция» соответствует таблица SC123.DBF).SC*.DBF в DBF-редакторе.ID.ID (помня о необходимости выравнивания пробелами).*.CDX в каталоге базы данных. При следующем входе в программу 1С перестроит индексы заново.При ручной очистке данных или сбоях в процессе тестирования базы может возникнуть сопутствующая ошибка: «Проверка таблицы журнала документов. Запись N. Нет ответной заголовочной части». Разберем по шагам механизм ее исправления:
1SJOURN.DBF и отдельная запись шапки в таблице DH<IDDOCDEF>.DBF, где <IDDOCDEF> — внутренний номер вида документа. Ошибка означает, что запись в 1SJOURN существует, но в таблице DH* документ с соответствующим IDDOC отсутствует.1SJOURN.DBF, переходим к записи с номером, указанным в сообщении об ошибке, и считываем значение полей IDDOC и IDDOCDEF.IDDOCDEF в файле 1CV7.DD определяем вид документа и имя таблицы шапки DH*.DBF.IDDOC из 1SJOURN.DBF (а также связанные строки из 1SCRDOC.DBF и DT*.DBF при их наличии), после чего упаковываем таблицы (PACK).IDDOC в целевой таблице DH*.DBF.*.CDX для запуска полной переиндексации базы данных и повторно запускаем тестирование и исправление.