Как исправить повторяющуюся ошибку при ТИИ в регистре сведений «ОбъектыДоступаДокументов» в 1С?

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

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

Проанализируем пример протокола ошибки:

Регистры сведений. ОбъектыДоступаДокументов. Проверка уникальности записей
В таблице InfoReg6572 обнаружены неуникальные записи со значениями полей: Fld6574 = NULL, Fld6573 = NULL. Неуникальность записей устранена
Проверка логической целостности. РегистрСведений.ОбъектыДоступаДокументов.Измерение.ДокументСсылка: Неверный тип хранимого значения. Сохранено пустое значение допустимого типа.
Проверка логической целостности. РегистрСведений.ОбъектыДоступаДокументов.Измерение.ОбъектДоступа: Неверный тип хранимого значения. Сохранено пустое значение допустимого типа.

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

Разберем, почему штатный механизм ТИИ или стандартная утилита chdbfl.exe не всегда помогают полностью избавиться от проблемы:

  1. Ограниченность утилиты chdbfl.exe: Данная утилита выполняет только низкоуровневую физическую проверку структуры файла информационной базы (.1CD), его страниц и заголовков. Она не анализирует ссылочную целостность данных и составные типы. По этой причине chdbfl.exe часто сообщает об отсутствии ошибок, хотя в таблицах присутствуют битые записи.
  2. Повреждение индексов составных типов: В составных измерениях ДокументСсылка и ОбъектДоступа при сбоях (аварийное завершение работы, сетевые сбои) может нарушаться индексация, из-за чего платформа перестает верно определять тип хранимого значения и считывает его как NULL.
  3. Фантомные записи при проведении документов: При изменении или проведении документов в конфигурации срабатывают подписки на события, записывающие данные в служебные регистры RLS. Если в базе есть документы с битыми ссылками на удаленные объекты, система продолжит генерировать пустые записи.

Разберем по шагам проверенные способы решения этой проблемы.

Способ 1. Программная очистка регистра в режиме «1С:Предприятие»

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ОбъектыДоступаДокументов.ДокументСсылка КАК ДокументСсылка,
    |	ОбъектыДоступаДокументов.ОбъектДоступа КАК ОбъектДоступа
    |ИЗ
    |	РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
    |ГДЕ
    |	ОбъектыДоступаДокументов.ДокументСсылка ЕСТЬ NULL
    |	ИЛИ ОбъектыДоступаДокументов.ОбъектДоступа ЕСТЬ NULL";

Выборка = Запрос.Выполнить().Выбрать();

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

Примечание: Если в вашей организации не используются ограничения прав на уровне записей (RLS) по организациям или контрагентам, данный регистр можно полностью очистить методом Очистить() для всего набора записей.

Способ 2. Очистка битых записей через утилиту tool_CD

Когда платформа не позволяет программно обработать поврежденные строки из-за сбоя типов данных СУБД, наиболее эффективным решением является прямое редактирование физической таблицы файла .1CD с помощью сторонней утилиты tool_CD.

Разберем порядок действий:

  1. Обязательно создаем резервную копию файла базы данных 1Cv8.1CD и завершаем все сеансы работы с базой.
  2. Запускаем утилиту tool_CD и открываем файл информационной базы.
  3. В списке физических таблиц находим таблицу регистра сведений ОбъектыДоступаДокументов (в логе ошибки имя физической таблицы указано как InfoReg6572).
  4. Открываем содержимое таблицы и находим строки, в которых поля измерений содержат нулевые ссылки или значения NULL.
  5. Удаляем найденные поврежденные строки из таблицы и сохраняем изменения.
  6. Запускаем конфигуратор 1С и повторно проводим процедуру ТИИ. Проверка должна пройти без ошибок.

Способ 3. Выгрузка в .dt и принудительная реструктуризация

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

  1. В режиме «Конфигуратор» выполним выгрузку информационной базы в файл .dt (меню Администрирование -> Выгрузить информационную базу).
  2. Создадим новую пустую информационную базу и загрузим в нее полученный файл .dt. В процессе загрузки платформа полностью заново сформирует физический файл .1CD и его индексы.
  3. Для принудительного пересоздания структуры таблицы регистра перейдем в конфигуратор, открываем регистр сведений ОбъектыДоступаДокументов и добавим в него временный реквизит любого типа.
  4. Выполним обновление конфигурации базы данных (клавиша F7). Платформа проведет полную реструктуризацию таблицы InfoReg6572.
  5. Удалим ранее добавленный временный реквизит и снова обновим конфигурацию базы данных.

Способ 4. Обновление платформы и пересчет прав RLS

В устаревших релизах платформы (в частности, 8.1) алгоритмы реструктуризации при ТИИ не всегда корректно обрабатывали битые ссылки составных типов. Если есть возможность, переведите информационную базу на более актуальные версии платформы 1С:Предприятие (8.2 или 8.3 в режиме совместимости). В более новых версиях платформы механизмы исправления ссылочной целостности работают значительно корректнее.

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

← На главную