Как отфильтровать документы в запросе 1С по списку определенных типов?

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

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

Почему нельзя просто передать список строк?

Начинающие разработчики часто пытаются передать в параметр запроса список имен документов в виде строк, например, "Документ.АвансовыйОтчет". Однако оператор ССЫЛКА и функция ТИПЗНАЧЕНИЯ работают с объектными типами данных, а не со строками. Попытка сравнить ссылку с текстовой строкой приведет к ошибке выполнения или пустому результату выборки. Чтобы решение работало, необходимо оперировать именно объектами Тип.

Способ 1: Использование массива объектов Тип и оператора В

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

  1. Формируем список типов на форме (например, в СписокЗначений).
  2. Преобразуем этот список в массив, где каждый элемент — это результат функции Тип().
  3. Используем этот массив в запросе с помощью оператора В.

Посмотрим на пример кода для формирования массива типов:


МассивТипов = Новый Массив;
Для Каждого ЭлементСписка Из СписокТипов Цикл
    Если ЭлементСписка.Пометка Тогда
        МассивТипов.Добавить(ТипЗнч(Документы[ЭлементСписка.Значение].СоздатьДокумент()));
    КонецЕсли;
КонецЦикла;

После подготовки массива передаем его в запрос как параметр &МассивТипов:


ВЫБРАТЬ
    Регистратор
ИЗ
    РегистрНакопления.ОстаткиТоваров КАК Остатки
ГДЕ
    ТИПЗНАЧЕНИЯ(Регистратор) В (&МассивТипов)

Способ 2: Использование метаданных для получения типов

Если вам нужно динамически получить список всех типов документов в системе, можно воспользоваться коллекцией Метаданные.Документы. Однако важно правильно преобразовывать их в нужный формат.

Рассмотрим пример, как получить все типы документов в системе:


// Получаем массив всех типов документов
СписокТипов = Документы.ТипВсеСсылки().Типы();

Этот метод удобен тем, что вам не нужно вручную прописывать каждый документ. Если пользователь отмечает галочками нужные документы в списке, достаточно отфильтровать этот массив перед передачей в запрос.

Важные рекомендации при работе с типами

Работая с типами в запросах, учитывайте следующие нюансы:

Подводим итоги

Чтобы успешно отфильтровать документы по списку типов, помните главное правило: в запросе вы сравниваете ТИПЗНАЧЕНИЯ(Поле) с объектами Тип, которые хранятся в массиве. Никогда не передавайте строки с именами метаданных напрямую, если не используете специфические функции приведения. Используя связку из Массив и оператора В, вы получите гибкий и понятный инструмент для фильтрации данных в ваших отчетах и обработках.

← На главную