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