Как найти точное место ссылки в объекте 1С, если НайтиПоСсылкам указывает на документ, но ссылка визуально отсутствует

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

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

Основные причины скрытого присутствия ссылок

Рассмотрим главные факторы, из-за которых ссылка на объект (например, справочник Ключи аналитики учета номенклатуры в 1С:ERP) не видна в интерфейсе:

  1. Пустые представления (Presentation) в отчетах: Если у элемента справочника или служебного ключа аналитики отсутствует наименование или сработал специальный обработчик формирования текста, отчет выводит пустое поле. Физически ссылка в записи присутствует, но визуально строчка выглядит незаполненной.
  2. Ссылки в измерениях последовательностей: Платформа 1С при поиске ссылок трактует вхождение справочника в измерения последовательности документов как ссылку на сам документ-регистратор.
  3. Неактивные записи регистров: В регистрах накопления или сведений записи могут иметь флаг Активность = Ложь. Стандартные отчеты по движениям накладывают фильтр по активным записям, скрывая неактивные строки с искомой ссылкой.
  4. Служебные реквизиты и реквизиты адресации: Ссылка может находиться в реквизитах, не выведенных на форму документа или в стандартные отчеты движений.

Способ 1. Программный поиск с помощью прямого запроса

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

Рассмотрим пример запроса для проверки конкретного регистра накопления по документу-регистратору:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТаблицаРегистра.Регистратор КАК Регистратор,
    |	ТаблицаРегистра.НомерСтроки КАК НомерСтроки,
    |	ТаблицаРегистра.АналитикаУчетаНоменклатуры КАК Аналитика
    |ИЗ
    |	РегистрНакопления.ВыручкаИАвтоматическиеПродажи КАК ТаблицаРегистра
    |ГДЕ
    |	ТаблицаРегистра.Регистратор = &ИскомыйДокумент
    |	И ТаблицаРегистра.АналитикаУчетаНоменклатуры = &ИскомаяСсылка";

Запрос.УстановитьПараметр("ИскомыйДокумент", ДокументСсылка);
Запрос.УстановитьПараметр("ИскомаяСсылка", ИскомыйКлючАналитики);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Ссылка найдена в строке " + Выборка.НомерСтроки);
КонецЦикла;

Способ 2. Проверка измерений последовательностей

Если справочник входящего типа (например, Организация или служебная аналитика) задействован в измерениях последовательностей документов, платформа НайтиПоСсылкам покажет документ. Проверим наличие документа в последовательностях простым запросом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПоследовательностьТаблица.Регистратор КАК Регистратор
    |ИЗ
    |	Последовательность.ПроведениеДокументовОтгрузки КАК ПоследовательностьТаблица
    |ГДЕ
    |	ПоследовательностьТаблица.Регистратор = &ИскомыйДокумент
    |	И ПоследовательностьТаблица.Организация = &ИскомаяСсылка";

Запрос.УстановитьПараметр("ИскомыйДокумент", ДокументСсылка);
Запрос.УстановитьПараметр("ИскомаяСсылка", ИскомаяСсылка);

Если НЕ Запрос.Выполнить().Пустой() Тогда
    Сообщить("Ссылка входит в измерение последовательности!");
КонецЕсли;

Способ 3. Универсальный обход метаданных объекта в отладчике

Для гарантированного выявления точного места можно запустить обработку Поиск и замена дублей из состава БСП или написать универсальный алгоритм обхода всех реквизитов документа и его движений. Выполним программный обход реквизитов и табличных частей найденного документа:


// Проверка шапки документа
МетаданныеДокумента = ДокументОбъект.Метаданные();
Для Каждого Реквизит Из МетаданныеДокумента.Реквизиты Цикл
    Если ДокументОбъект[Реквизит.Имя] = ИскомаяСсылка Тогда
        Сообщить("Найдено в реквизите шапки: " + Реквизит.Имя);
    КонецЕсли;
КонецЦикла;

// Проверка табличных частей
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
    Для Каждого СтрокаТЧ Из ДокументОбъект[ТЧ.Имя] Цикл
        Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
            Если СтрокаТЧ[РеквизитТЧ.Имя] = ИскомаяСсылка Тогда
                Сообщить("Найдено в ТЧ " + ТЧ.Имя + ", строка " + СтрокаТЧ.НомерСтроки + ", реквизит " + РеквизитТЧ.Имя);
            КонецЕсли;
        КонецЦикла;
    КонецДля;
КонецЦикла;

Рекомендации по устранению проблемы

Выделим основные шаги при поиске "невидимых" ссылок:

  1. Проверим представление элемента справочника в пользователе или коде. Если представление выводит пустую строку, в форме отчета движения будут выглядеть незаполненными.
  2. Используем запросы без фильтрации по полю Активность к регистрам накопления, сведений и бухгалтерии, где документа выступает регистратором.
  3. При проверке удаляемых ссылок учитываем возможность вызова метода Записать() у наборов записей с установленным замещением, чтобы старые движения физически удалялись из СУБД.
← На главную