Что делать, если при поиске ссылок на объект в 1С возникают фантомные ошибки Объект не найден

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

В практике разработчика 1С периодически возникает странная и на первый взгляд необъяснимая ситуация. Вы выполняете штатный «Поиск ссылок на объект» для вполне корректного, существующего элемента справочника (например, ФизическиеЛица), но в результатах поиска, помимо реальных документов, отображаются строки вида Документ1 <Объект не найден> (15593:890000505682f6c711ed7d04df56cc70). При этом, если попытаться найти этот «битый» документ в самой базе или даже напрямую через SQL-запросы в таблицах этого типа документов, вы ничего не обнаружите. Создается впечатление, что платформа «видит» то, чего нет.

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

Анализируем природу фантомных ссылок

Рассмотрим стандартный механизм работы платформы. Когда мы запускаем поиск ссылок на объект, система сканирует не только реквизиты документов и справочников, но и все метаданные, где этот объект может быть задействован. Проблема в том, что ссылка может «застрять» в служебных таблицах, которые не отображаются в обычном интерфейсе и часто игнорируются при стандартном написании запросов через Консоль запросов.

Проанализируем основные места, где могут скрываться такие ссылки:

  1. Последовательности документов. Это наиболее частая причина «невидимых» связей. Если документ входит в последовательность, которая имеет Измерения, то при проведении документа создается запись в специальной таблице регистрации последовательности.
  2. Планы обмена. Ссылка на удаленный или несуществующий объект может храниться в таблицах регистрации изменений (_DocumentChngR...).
  3. Движения без регистратора. Ситуация, когда в регистре накопления или сведений остались записи, но сам документ-регистратор был удален (например, через прямой SQL-запрос или вследствие программного сбоя).
  4. Записи перерасчетов. В зарплатных решениях ссылки могут оставаться в таблицах перерасчетов регистров расчета.

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

Выясним причину, по которой последовательности становятся источником проблем. Рассмотрим структуру последовательности в базе данных. Она состоит из двух основных типов таблиц:

Если в метаданных последовательности определено измерение (например, ФизическоеЛицо), то в таблице регистрации для каждой записи документа будет заполнено это поле. Если документ был удален некорректно или если возник сбой в логике очистки последовательностей, запись в таблице регистрации может остаться. В этой записи поле регистратора (ссылка на документ) станет «битым» (объект не найден), а поле измерения (наше ФизическоеЛицо) будет по-прежнему указывать на живой объект справочника.

Именно поэтому при поиске ссылок на ФизическоеЛицо платформа находит строку в таблице последовательности и пытается показать связанный с ней документ, который уже физически отсутствует в основной таблице _DocumentXXX.

Как найти виновника через SQL

Если штатные средства 1С не дают ответа на вопрос, в какой именно таблице «зависла» ссылка, мы можем прибегнуть к поиску на уровне СУБД. Нам необходимо найти все таблицы, в которых встречается GUID нашего искомого объекта.

Для начала получим GUID (УникальныйИдентификатор) объекта в 1С. После этого мы можем выполнить поиск по всей базе данных. Рассмотрим пример логики SQL-скрипта (для MS SQL Server), который поможет локализовать таблицу:


DECLARE @SearchBin binary(16) = 0x82F6C711ED7D04DF56CC70... -- Здесь должен быть бинарный GUID объекта
DECLARE @TableName nvarchar(256)
DECLARE @ColumnName nvarchar(256)
DECLARE @SQL nvarchar(max)

DECLARE cur CURSOR FOR 
SELECT t.name, c.name 
FROM sys.tables t 
JOIN sys.columns c ON t.object_id = c.object_id
WHERE c.system_type_id IN (165, 173) -- binary, varbinary

OPEN cur
FETCH NEXT FROM cur INTO @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'IF EXISTS (SELECT 1 FROM [' + @TableName + '] WHERE [' + @ColumnName + '] = @p1) 
                PRINT ''Найдено в таблице: ' + @TableName + ', Колонка: ' + @ColumnName + ''''
    EXEC sp_executesql @SQL, N'@p1 binary(16)', @SearchBin
    FETCH NEXT FROM cur INTO @TableName, @ColumnName
END
CLOSE cur
DEALLOCATE cur

Этот метод позволит точно определить, является ли это таблицей последовательности (имя вида _SequenceNNN), плана обмена или регистра.

Пошаговое решение проблемы

Разберем алгоритм действий по устранению фантомных ссылок в зависимости от их локализации.

Шаг 1: Использование специализированных инструментов.
Прежде чем переходить к радикальным мерам, попробуем использовать внешние обработки, такие как «Инструменты разработчика» (ИР). В консоли поиска ссылок этого инструментария отображается не только ссылка на «Объект не найден», но и конкретная метаданная (таблица), в которой эта ссылка обнаружена. Это позволяет сразу понять: «Ага, это последовательность ПартионныйУчет».

Шаг 2: Программная очистка последовательностей.
Если выяснилось, что дело в последовательности, нам нужно очистить записи по конкретному регистратору или измерению. Посмотрим на пример кода, как это сделать программно в среде 1С:


// Очистка записей последовательности по конкретному документу
Набор = Последовательности.ПартионныйУчет.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(БитыйДокументСсылка);
Набор.Записать();

// Если мы не можем получить ссылку на битый документ, 
// можно попробовать очистить всю последовательность по измерению (если это допустимо бизнес-логикой)
Набор = Последовательности.ПартионныйУчет.СоздатьНаборЗаписей();
Набор.Отбор.ФизическоеЛицо.Установить(НашеФизическоеЛицо);
Набор.Записать();

Шаг 3: Тестирование и исправление (ТиИ).
Запустим стандартную процедуру Тестирование и исправление из конфигуратора. Нас интересуют пункты:

Важно: ТиИ не всегда эффективно справляется с последовательностями, если записи в них считаются «валидными» с точки зрения структуры, но «битыми» по смыслу. Поэтому ручная очистка набора записей часто надежнее.

Шаг 4: Обновление индекса полнотекстового поиска.
Иногда поиск выдает старые данные из-за кэша полнотекстового поиска (ППТ). Если вы уверены, что в таблицах данных ссылки нет, но поиск ее находит — выполните полное перестроение индекса ППТ через меню Управление полнотекстовым поиском.

Профилактика появления битых ссылок

Проанализируем, как избежать подобных ситуаций в будущем. В 18-летней практике экспертов такие случаи часто связаны с:

Всегда используйте безопасные методы удаления и регулярно проводите регламентные операции по обслуживанию базы данных. Помните, что стандартный диалог «Найти ссылки» — это мощный диагностический инструмент, и если он показывает «Объект не найден», значит, в структуре БД действительно сохранился Binary GUID, требующий вашего внимания.

Таким образом, мы выяснили, что причина «невидимых» битых ссылок чаще всего кроется в последовательностях документов. Своевременное использование инструментов разработчика и понимание структуры хранения данных на уровне SQL позволяют быстро диагностировать и устранять подобные ошибки целостности.

← На главную