Часто в работе с базами данных 1С возникает ситуация, когда при проверке ссылочной целостности мы обнаруживаем «битые» документы, которые отображаются как Объект не найден. Если стандартная процедура Тестирование и исправление (ТиИ) завершается аварийным закрытием платформы или «молчаливым» вылетом, это говорит о глубоком повреждении логической связи между таблицами данных. В этой статье мы разберем, как принудительно удалить такие «фантомные» объекты программным способом.
Ситуация, когда платформа «вылетает», обычно связана с тем, что в таблице движений (регистре) остались записи, ссылающиеся на Регистратор, который физически отсутствует или поврежден в таблице документов. При попытке автоматического исправления платформа пытается обратиться к этому объекту, не может его прочитать и вызывает критическую ошибку доступа к памяти. Чтобы исправить это, мы пойдем другим путем — очистим записи в регистрах, минуя обращение к самому «битому» документу.
Самый надежный способ устранить проблему — найти все записи в регистрах накопления или бухгалтерии, у которых Регистратор является «битым», и удалить их. Для этого мы будем использовать Запрос к данным регистра, чтобы выявить записи, в которых Регистратор фактически отсутствует (значение NULL при обращении через точку).
Рассмотрим алгоритм действий по шагам:
Запрос, который выберет все уникальные ссылки на регистраторы, не имеющие физического воплощения в базе.СоздатьНаборЗаписей() для соответствующего регистра.Давайте проанализируем реализацию данного метода на примере регистра накопления (логика применима и для регистра бухгалтерии):
Запрос = Новый Запрос("
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Регистр.Регистратор
|ИЗ
| РегистрНакопления.СписаниеСРасчетногоСчета КАК Регистр
|ГДЕ
| Регистр.Регистратор.Ссылка ЕСТЬ NULL");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыНакопления.СписаниеСРасчетногоСчета.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
// Записываем пустой набор для удаления записей, связанных с битым документом
НаборЗаписей.Записать();
КонецЦикла;
Обратите внимание: для выполнения операции очистки нет необходимости вызывать Прочитать() или Очистить(). Достаточно просто создать набор записей с установленным отбором по конкретному регистратору и выполнить Записать(). Платформа воспримет это как команду удалить все записи, соответствующие данному отбору.
Перед тем как приступать к манипуляциям с данными, обязательно учитывайте следующие аспекты:
ИмяРегистра (например, РегистрыБухгалтерии.Хозрасчетный вместо регистра накопления), так как битые ссылки могут присутствовать в разных таблицах.Если после выполнения данной процедуры в списке документов все еще отображаются «фантомы», проверьте, нет ли у вас специфических настроек RLS или расширений конфигурации, которые могут искажать представление данных. В 90% случаев данный программный метод позволяет полностью очистить базу от поврежденных ссылок и подготовить её к обновлению или дальнейшей работе.