Как найти все документы, в движениях которых используется объект ПВХ «Статьи расходов»?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

Анализ проблемы производительности

Первое, что приходит на ум при постановке такой задачи — написать запрос, который через ОБЪЕДИНИТЬ ВСЕ соберет данные из всех регистров накопления. Однако, как показывает практика в крупных конфигурациях (ERP, КА), такой подход приведет к созданию «тяжелого» запроса из сотен таблиц. Система будет вынуждена пересобирать этот запрос при каждом обновлении динамического списка, что сделает интерфейс неработоспособным. Мы не рекомендуем использовать генерацию монструозных запросов «на лету».

Алгоритм программного поиска регистров

Вместо того чтобы гадать, в каких регистрах используется наш ПланВидовХарактеристикСсылка.СтатьиРасходов, давайте пройдемся по метаданным конфигурации. Для этого мы создадим массив, в который соберем только те регистры, чьи измерения или ресурсы содержат нужный нам тип данных.

Разберем пример кода, который позволяет собрать имена регистров, содержащих ПВХ.СтатьиРасходов:


Мас = Новый Массив;
Мас.Добавить(Тип("ПланВидовХарактеристикСсылка.СтатьиРасходов"));
ТипыЗнченияПВХ = Новый ОписаниеТипов(Мас);

МассивИменРегистров = Новый Массив;

// Проверяем регистры накопления
Для каждого РегистрН Из Метаданные.РегистрыНакопления Цикл
    Для Каждого ИзмеренияН Из РегистрН.Измерения Цикл
        Если ТипыЗнченияПВХ.СодержитТип(ИзмеренияН.Тип) Тогда
            МассивИменРегистров.Добавить(РегистрН.ПолноеИмя());
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Почему важен метод СодержитТип()

При работе с метаданными часто совершают ошибку, используя ПривестиЗначение или простое сравнение типов. Это неверно, так как поля часто имеют составной тип. Использование метода СодержитТип() объекта ОписаниеТипов позволяет точно определить, входит ли наш ПВХ в допустимый набор типов для конкретного измерения или ресурса регистра. Это исключает ложноположительные срабатывания.

Оптимальные подходы к реализации

Чтобы вывести данные в динамический список или отчет без потери производительности, мы рекомендуем следующие стратегии:

  1. Создание вспомогательного регистра: Если поиск документов по СтатьямРасходов является частой задачей пользователей, наилучшим решением будет создание отдельного регистра сведений «СвязиДокументовПоСтатьям». Заполняйте его при проведении документов с помощью подписок на события. Это позволит списку обращаться к одной индексируемой таблице вместо объединения множества регистров.
  2. Использование поиска ссылок (для разовых задач): Если задача разовая, воспользуйтесь стандартным механизмом «Поиск ссылок на объект» в Конфигураторе. Это сэкономит время на написание кода и гарантированно покажет все места использования ссылки в базе данных.
  3. Фильтрация по конкретной статье: Если вы ищете документы по конкретному значению СтатьиРасходов, всегда добавляйте условие ГДЕ Регистр.СтатьяРасходов = &НужнаяСтатья в запрос к регистрам. Это критически важно для работы индексов и ускорения поиска.

Заключение

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

Таким образом, мы выяснили, что путь к решению задачи лежит через грамотный анализ типов данных в метаданных и использование предрасчитанных данных (регистров сведений) вместо «тяжелых» объединений в запросах.

← На главную