Рассмотрим распространенную проблему, с которой можно столкнуться при выполнении процедуры «Тестирование и исправление» (ТИИ) файловой информационной базы 1С (в частности, в конфигурациях «Управление торговлей 10.3» и других решениях на платформе 1С:Предприятие). В процессе проверки платформа выдает логические ошибки и сообщает об исправлении некорректных записей, однако при повторном прогоне ТИИ эти ошибки возникают снова.
Проанализируем пример протокола ошибки:
Регистры сведений. ОбъектыДоступаДокументов. Проверка уникальности записей
В таблице InfoReg6572 обнаружены неуникальные записи со значениями полей: Fld6574 = NULL, Fld6573 = NULL. Неуникальность записей устранена
Проверка логической целостности. РегистрСведений.ОбъектыДоступаДокументов.Измерение.ДокументСсылка: Неверный тип хранимого значения. Сохранено пустое значение допустимого типа.
Проверка логической целостности. РегистрСведений.ОбъектыДоступаДокументов.Измерение.ОбъектДоступа: Неверный тип хранимого значения. Сохранено пустое значение допустимого типа.
Разберем, почему штатный механизм ТИИ или стандартная утилита chdbfl.exe не всегда помогают полностью избавиться от проблемы:
.1CD), его страниц и заголовков. Она не анализирует ссылочную целостность данных и составные типы. По этой причине chdbfl.exe часто сообщает об отсутствии ошибок, хотя в таблицах присутствуют битые записи.ДокументСсылка и ОбъектДоступа при сбоях (аварийное завершение работы, сетевые сбои) может нарушаться индексация, из-за чего платформа перестает верно определять тип хранимого значения и считывает его как NULL.Разберем по шагам проверенные способы решения этой проблемы.
Если в режиме «1С:Предприятие» в регистре сведений ОбъектыДоступаДокументов видны пустые строки, их нельзя удалить вручную через стандартный интерфейс из-за особенностей структуры регистра. В этом случае создадим специальную обработку или запустим код во внешней обработке под пользователем с полными правами.
Рассмотрим пример кода для поиска и удаления записей с битыми или пустыми значениями измерений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОбъектыДоступаДокументов.ДокументСсылка КАК ДокументСсылка,
| ОбъектыДоступаДокументов.ОбъектДоступа КАК ОбъектДоступа
|ИЗ
| РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
|ГДЕ
| ОбъектыДоступаДокументов.ДокументСсылка ЕСТЬ NULL
| ИЛИ ОбъектыДоступаДокументов.ОбъектДоступа ЕСТЬ NULL";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
Набор.Отбор.ДокументСсылка.Установить(Выборка.ДокументСсылка);
Набор.Отбор.ОбъектДоступа.Установить(Выборка.ОбъектДоступа);
Набор.Прочитать();
Набор.Очистить();
Попытка
Набор.Записать();
Исключение
Сообщить("Ошибка очистки набора записей: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Примечание: Если в вашей организации не используются ограничения прав на уровне записей (RLS) по организациям или контрагентам, данный регистр можно полностью очистить методом Очистить() для всего набора записей.
Когда платформа не позволяет программно обработать поврежденные строки из-за сбоя типов данных СУБД, наиболее эффективным решением является прямое редактирование физической таблицы файла .1CD с помощью сторонней утилиты tool_CD.
Разберем порядок действий:
1Cv8.1CD и завершаем все сеансы работы с базой.tool_CD и открываем файл информационной базы.ОбъектыДоступаДокументов (в логе ошибки имя физической таблицы указано как InfoReg6572).NULL.Если прямое редактирование базы невозможно или требуется устранить физическое повреждение индексов без использования сторонних утилит, применим метод полного пересоздания структуры таблиц:
.dt (меню Администрирование -> Выгрузить информационную базу)..dt. В процессе загрузки платформа полностью заново сформирует физический файл .1CD и его индексы.ОбъектыДоступаДокументов и добавим в него временный реквизит любого типа.InfoReg6572.В устаревших релизах платформы (в частности, 8.1) алгоритмы реструктуризации при ТИИ не всегда корректно обрабатывали битые ссылки составных типов. Если есть возможность, переведите информационную базу на более актуальные версии платформы 1С:Предприятие (8.2 или 8.3 в режиме совместимости). В более новых версиях платформы механизмы исправления ссылочной целостности работают значительно корректнее.
Если в базе используется RLS, после удаления битых записей выполните процедуру обновления прав доступа (через настройки параметров учета или специализированную обработку обновления прав пользователей), чтобы платформа сформировала актуальную карту разрешений без потери данных.