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