Как программно вывести список документов с отбором по типу данных реквизита в 1С 8.3?

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

Часто в процессе разработки прикладных решений на платформе 1С:Предприятие возникает задача динамического анализа структуры конфигурации. Одной из распространенных задач является поиск всех документов, в составе реквизитов или табличных частей которых присутствует определенный тип данных (например, СправочникСсылка.Валюты). Разберем, как реализовать такую задачу максимально эффективно.

Принципы работы с метаданными

Для решения поставленной задачи нам потребуется обратиться к объекту Метаданные. Платформа 1С позволяет программно перебирать коллекции объектов конфигурации. Основной инструмент для проверки того, подходит ли реквизит под наши критерии — это метод Тип.СодержитТип(). Этот метод универсален и отлично справляется даже с составными типами данных.

Разработка алгоритма поиска

Рассмотрим пошагово, как построить обход всех документов конфигурации. Нам необходимо не только проверить реквизиты «шапки» документа, но и заглянуть в каждую табличную часть, так как там также могут находиться ссылки на интересующий нас тип.

Для чистоты кода и удобства отладки вынесем логику проверки типа в отдельную функцию. Это позволит избежать дублирования кода при переборе реквизитов шапки и реквизитов табличных частей.

Ниже представлен пример функции, которая проверяет коллекцию реквизитов на наличие заданного типа:


Функция КоллекцияСодержитПроверяемыйТип(Коллекция, ПроверяемыйТип)
    Результат = Ложь;
    Для Каждого Реквизит Из Коллекция Цикл
        Если Реквизит.Тип.СодержитТип(ПроверяемыйТип) Тогда
            Результат = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Основной цикл перебора метаданных

Теперь, когда у нас есть инструмент проверки, мы можем реализовать основной цикл. Важно помнить, что обход метаданных — операция ресурсоемкая, поэтому выполняйте её только тогда, когда это действительно необходимо (например, при инициализации формы или в специальных обработках).

Реализуем основной алгоритм:


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

Оптимизация и важные рекомендации

При работе с данным кодом обратите внимание на следующие аспекты:

  1. Производительность: Если ваша конфигурация содержит сотни документов с множеством табличных частей, не вызывайте этот алгоритм при каждом открытии формы. Рекомендуется использовать кэширование результатов, например, сохраняя список в ПараметрыСеанса или используя временное хранилище.
  2. Составные типы: Метод СодержитТип() корректно обрабатывает составные типы данных. Если реквизит может принимать значения нескольких типов, и один из них — искомый, платформа вернет Истина. Это избавляет от необходимости парсить строку типов вручную.
  3. Расширение функционала: Предложенный подход легко масштабируется. Если вам потребуется искать тип не только в Документы, но и в Справочники или РегистрыСведений, просто замените в цикле Метаданные.Документы на нужную коллекцию.
  4. Инструменты платформы: Если задача стоит разово (например, найти использование валюты во всей базе для административных целей), не забывайте про стандартный механизм «Поиск ссылок на объект» в Конфигураторе. Он работает быстрее и нагляднее любого написанного кода, так как анализирует связи непосредственно в СУБД.

Используя описанный метод, вы сможете гибко управлять списком документов в интерфейсе пользователя и предоставлять им только те данные, которые действительно содержат указанный тип ссылки.

← На главную