При выполнении регламентной процедуры «Тестирование и исправление информационной базы» (ТИИ) разработчики и администраторы иногда сталкиваются с диагностическим сообщением вида: Справочники.ИмяСправочника. Табличная часть имеет записи, не относящиеся ни к одной записи главной таблицы. Разберем, почему возникает данная ситуация, насколько она критична для работоспособности системы и как правильно устранить нарушение целостности данных.
Табличные части справочников и документов в 1С физически хранятся в отдельных таблицах СУБД (как в файловой базе .1CD, так и в MS SQL Server, PostgreSQL и др.). Связь строки табличной части с объектом-владельцем осуществляется по внутреннему идентификатору ссылки (полю _Reference_IDRRef или аналогичному).
Платформа 1С:Предприятие не использует внешние ключи (FOREIGN KEY) с каскадным удалением на уровне СУБД — вся ссылочная целостность контролируется исключительно на уровне логики платформы в рамках транзакций. Если в момент записи или удаления объекта происходит аварийный сбой (внезапное отключение питания, падение рабочего процесса сервера 1С или СУБД, аппаратная ошибка дискового накопителя, сбои при обмене РИБ), транзакция может зафиксироваться частично. В результате сам элемент справочника удаляется, а строки его табличной части остаются в базе без родителя.
Проанализируем риски, возникающие при наличии записей-сирот в информационной базе:
Справочник.Номенклатура.Штрихкоды), система выберет записи потерянного элемента, что приведет к появлению некорректных строк или дублей в отчетах.Поле агрегатного объекта не обнаружено.Таким образом, оставлять эту ошибку без внимания не рекомендуется — базу данных необходимо восстановить до консистентного состояния.
Прежде чем выполнять исправление, мы можем локализовать поврежденные строки с помощью простого запроса в пользовательском режиме. Выполним проверку на наличие записей, у которых родительский объект отсутствует (равен NULL):
ВЫБРАТЬ
ТЧ.Ссылка КАК БитыйЭлемент,
ТЧ.НомерСтроки КАК НомерСтроки
ИЗ
Справочник.ИмяСправочника.ИмяТабличнойЧасти КАК ТЧ
ГДЕ
ТЧ.Ссылка.Наименование ЕСТЬ NULL
Если запрос возвращает строки, значит, в табличной части действительно присутствуют осиротевшие данные, подлежащие удалению.
Штатный механизм конфигуратора позволяет полностью удалить некорректные записи. Разберем по шагам правильный порядок действий:
.dt или средствами СУБД).В ходе исправления логической целостности платформа автоматически обнаружит строки табличной части без главного объекта и удалит этот мусор.
Если информационная база работает в файловом режиме (файл 1Cv8.1CD), можно применить следующие действия:
chdbfl.exe (находится в каталоге bin установленной платформы 1С)..dt через конфигуратор и загрузим ее в новую чистую базу. При выгрузке данных в формат выгрузки платформа сериализует только валидные объекты, отсекая битые хвосты.В нагруженных базах на MS SQL Server или PostgreSQL, когда монопольный запуск ТИИ недоступен из-за жестких регламентных окон, администраторы могут очистить потерянные строки табличной части на уровне СУБД.
Посмотрим на алгоритм действий:
ПолучитьСтруктуруХраненияБазыДанных().
SELECT * FROM _ReferenceTable_VT
WHERE _Reference_IDRRef NOT IN (SELECT _IDRRef FROM _ReferenceTable);
DELETE FROM _ReferenceTable_VT
WHERE _Reference_IDRRef NOT IN (SELECT _IDRRef FROM _ReferenceTable);
Важно: любые прямые манипуляции с таблицами базы данных через SQL следует проводить только после создания бэкапа и с полным пониманием структуры хранения данных платформы 1С.