Как исправить ошибки целостности данных при тестировании и исправлении (ТиИ) базы 1С?

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

При проведении процедур регламентного обслуживания информационных баз 1С в режиме «Тестирование и исправление» (ТиИ) специалисты часто сталкиваются с сообщениями о нарушении ссылочной целостности. К наиболее распространенным относятся ошибки вида «Неверная ссылка на владельца», «Объект, на который ссылается значение, отсутствует» или «Неверная ссылка на регистратор».

Рассмотрем подробнее причины возникновения подобных сбоев, разберем по шагам алгоритмы их устранения и выясним, как правильно поступать с объектами, оставшимися без владельцев или корректных ссылок.

Возможные причины возникновения ошибок ссылочной целостности

Проанализируем ситуацию и выясним, из-за чего в информационной базе образуются «битые» ссылки:

  1. Некорректное программное удаление объектов: часто при доработках базы используется прямое удаление данных методом Удалить() вместо пометки на удаление с контролем ссылок. Если из базы физически удаляется организация или контрагент, подчинённые им элементы (договоры, банковские счета) становятся «сиротами» с недействительными ссылками.
  2. Ошибки механизмов обмена данными: при выгрузке данных через РИБ или правила обмена XML подчиненный объект (например, договор) может перенестись в приемник без объекта-владельца.
  3. Сбои платформы и физическое повреждение базы: внезапное отключение питания, завершение работы 1С во время записи или сбои при динамическом обновлении файловых баз 1Cv8.1CD приводят к повреждению таблиц.

Шаг 1. Предварительная подготовка и физическая проверка базы

Перед тем как запускать процедуру исправления в 1С, выполним обязательные подготовительные действия:

  1. Создадим резервную копию: выгрузим базу в файл .dt или скопируем файл 1Cv8.1CD (в файловом режиме). Все действия выполняем исключительно в монопольном режиме.
  2. Очистим кэш платформы: некорректное отображение ссылок иногда связано с повреждением локального кэша пользователя. Очистим папки %LOCALAPPDATA%\1C\1Cv8 и %APPDATA%\1C\1Cv8.
  3. Проверим базу утилитой chdbfl.exe: для файловых баз запустим утилиту тестирования из папки bin платформы 1С. Это позволит исправить физические повреждения таблиц до запуска ТиИ.

Шаг 2. Выбор режима тестирования и исправления (ТиИ)

В конфигураторе 1С перейдем в меню Администрирование — Тестирование и исправление. Для обработки несуществующих ссылок платформой предусмотрены два основных режима:

  1. Режим «Создавать объекты»: платформа создает вместо отсутствующих ссылок технические элементы-заглушки вида [Объект не найден (GUID)]. Этот вариант полезен, если битые ссылки находятся в важных первичных документах и требуется восстановить аналитику с помощью обработки «Поиск и замена дублей».
  2. Режим «Удалять объекты»: платформа автоматически очищает недействительные реквизиты в документах и удаляет записи регистров с «битыми» ссылками.

Если в базе ранее производилось удаление ненужных организаций или контрагентов, выбор режима «Удалять объекты / очищать ссылки» позволяет автоматически устранить ошибки в документах (например, СписаниеСРасчетногоСчета) и регистрах сведений (АрхивДанныхРегламентированнойОтчетности, НДФЛПрименениеВычетов и др.).

Шаг 3. Обработка элементов с незаполненным владельцем

Разберем ситуацию, когда после завершения ТиИ повторное тестирование показывает ошибку вида: Справочник.ДоговорыКонтрагентов Основной договор. Не определен владелец.

Ограничение платформы: если у подчинённого элемента реквизит Владелец пуст (содержит значение ПустаяСсылка, а не несуществующий GUID), алгоритм ТиИ считает такой элемент технически корректным и не удаляет его автоматически. Определение владельцев для таких справочников выполним вручную или программно.

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

  1. Откроем стандартную обработку «Групповое изменение реквизитов».
  2. Выберем справочник Договоры контрагентов и установим отбор по условию: Владелец Не Заполнено.
  3. Если данные договоры не представляют ценности, установим для них пометку на удаление. Если договор принадлежит действующему контрагенту — свяжем его с нужным владельцем.

Для программной пометки на удаление договоров без владельцев используем следующий код:


Выборка = Справочники.ДоговорыКонтрагентов.Выбрать();
Пока Выборка.Следующий() Цикл
    Если НЕ ЗначениеЗаполнено(Выборка.Владелец) Тогда
        ДоговорОбъект = Выборка.ПолучитьОбъект();
        ДоговорОбъект.УстановитьПометкуУдаления(Истина);
    КонецЕсли;
КонецЦикл;

Шаг 4. Очистка независимых регистров сведений

Записи в независимых регистрах сведений, оставшиеся от удаленных организаций, удалим программно путем создания и записи пустого набора записей с установленным отбором:


Набор = РегистрыСведений.НДФЛПрименениеВычетов.СоздатьНаборЗаписей();
Набор.Отбор.Организация.Установить(УдаленнаяОрганизация);
Набор.Прочитать();
Набор.Очистить();
Набор.Записать();

Последовательное выполнение тестирования в режиме очистки ссылок и последующая обработка элементов с незаполненными владельцами позволяет полностью вернуть информационную базу в корректное рабочее состояние.

← На главную