В практике разработки и администрирования 1С часто возникает ситуация: платформа или стандартный поиск ссылок сообщает, что элемент справочника используется в конкретном документе, но при детальном осмотре формы документа, его табличных частей и отчетов по движениям данная ссылка не обнаруживается. Разберем, почему метод НайтиПоСсылкам возвращает документ-регистратор, где именно может "прятаться" значение и как точно локализовать ссылку в конфигурации.
Рассмотрим главные факторы, из-за которых ссылка на объект (например, справочник Ключи аналитики учета номенклатуры в 1С:ERP) не видна в интерфейсе:
Активность = Ложь. Стандартные отчеты по движениям накладывают фильтр по активным записям, скрывая неактивные строки с искомой ссылкой.Чтобы исключить влияние вывода представлений в отчетах, проанализируем физические таблицы базы данных с помощью прямого запроса к подчиненным регистрам и табличным частям. При сравнении необходимо сопоставлять сам объект-ссылку, а не его текстовое представление.
Рассмотрим пример запроса для проверки конкретного регистра накопления по документу-регистратору:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаРегистра.Регистратор КАК Регистратор,
| ТаблицаРегистра.НомерСтроки КАК НомерСтроки,
| ТаблицаРегистра.АналитикаУчетаНоменклатуры КАК Аналитика
|ИЗ
| РегистрНакопления.ВыручкаИАвтоматическиеПродажи КАК ТаблицаРегистра
|ГДЕ
| ТаблицаРегистра.Регистратор = &ИскомыйДокумент
| И ТаблицаРегистра.АналитикаУчетаНоменклатуры = &ИскомаяСсылка";
Запрос.УстановитьПараметр("ИскомыйДокумент", ДокументСсылка);
Запрос.УстановитьПараметр("ИскомаяСсылка", ИскомыйКлючАналитики);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Ссылка найдена в строке " + Выборка.НомерСтроки);
КонецЦикла;
Если справочник входящего типа (например, Организация или служебная аналитика) задействован в измерениях последовательностей документов, платформа НайтиПоСсылкам покажет документ. Проверим наличие документа в последовательностях простым запросом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоследовательностьТаблица.Регистратор КАК Регистратор
|ИЗ
| Последовательность.ПроведениеДокументовОтгрузки КАК ПоследовательностьТаблица
|ГДЕ
| ПоследовательностьТаблица.Регистратор = &ИскомыйДокумент
| И ПоследовательностьТаблица.Организация = &ИскомаяСсылка";
Запрос.УстановитьПараметр("ИскомыйДокумент", ДокументСсылка);
Запрос.УстановитьПараметр("ИскомаяСсылка", ИскомаяСсылка);
Если НЕ Запрос.Выполнить().Пустой() Тогда
Сообщить("Ссылка входит в измерение последовательности!");
КонецЕсли;
Для гарантированного выявления точного места можно запустить обработку Поиск и замена дублей из состава БСП или написать универсальный алгоритм обхода всех реквизитов документа и его движений. Выполним программный обход реквизитов и табличных частей найденного документа:
// Проверка шапки документа
МетаданныеДокумента = ДокументОбъект.Метаданные();
Для Каждого Реквизит Из МетаданныеДокумента.Реквизиты Цикл
Если ДокументОбъект[Реквизит.Имя] = ИскомаяСсылка Тогда
Сообщить("Найдено в реквизите шапки: " + Реквизит.Имя);
КонецЕсли;
КонецЦикла;
// Проверка табличных частей
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
Для Каждого СтрокаТЧ Из ДокументОбъект[ТЧ.Имя] Цикл
Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
Если СтрокаТЧ[РеквизитТЧ.Имя] = ИскомаяСсылка Тогда
Сообщить("Найдено в ТЧ " + ТЧ.Имя + ", строка " + СтрокаТЧ.НомерСтроки + ", реквизит " + РеквизитТЧ.Имя);
КонецЕсли;
КонецЦикла;
КонецДля;
КонецЦикла;
Выделим основные шаги при поиске "невидимых" ссылок:
Активность к регистрам накопления, сведений и бухгалтерии, где документа выступает регистратором.Записать() у наборов записей с установленным замещением, чтобы старые движения физически удалялись из СУБД.