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

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

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

Использование конструкции ВЫБОР КОГДА

Самым популярным способом решения проблемы является использование логики ВЫБОР КОГДА непосредственно внутри текста запроса. Суть метода заключается в том, что мы дополнительно передаем параметр, содержащий количество элементов в массиве, и используем его для управления условием отбора.

Рассмотрим пошагово, как реализовать этот подход:

  1. На этапе подготовки параметров в коде 1С вычисляем размер массива: КоличествоЭлементов = ВашМассив.Количество();
  2. Передаем два параметра в запрос: сам &Массив и &КоличествоЭлементов.
  3. В тексте запроса пишем условие, которое проверяет количество элементов:

ВЫБРАТЬ
    Документ.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
    ВЫБОР
        КОГДА &КоличествоЭлементов = 0 ТОГДА ИСТИНА
        ИНАЧЕ Документ.Контрагент В (&Массив)
    КОНЕЦ

Этот метод хорош тем, что если массив пуст, условие превращается в ГДЕ ИСТИНА, что заставляет запрос вернуть все записи, игнорируя фильтр, как мы и задумывали.

Использование временных таблиц для оптимизации

Иногда использование сложных условий внутри ГДЕ может негативно сказаться на плане выполнения запроса, особенно если объем данных велик. В таких случаях более надежным и производительным решением будет использование временных таблиц.

Разберем логику работы с временными таблицами:

  1. Создаем временную таблицу, в которую помещаем данные из нашего массива.
  2. Если массив пуст, мы просто не создаем временную таблицу или не наполняем ее данными.
  3. В основном запросе выполняем ЛЕВОЕ СОЕДИНЕНИЕ с этой временной таблицей.

При таком подходе, если временная таблица пуста, соединение не накладывает строгих ограничений на выборку, а результат можно обработать функцией ЕСТЬNULL. Это позволяет серверу баз данных эффективнее выстраивать план выполнения, так как структура запроса становится более предсказуемой.

Рекомендации по работе с динамическими списками

Если вы решаете задачу в рамках динамического списка или системы компоновки данных (СКД), важно учитывать особенности платформы. Например, при работе с формой списка можно динамически управлять параметрами.

Посмотрим на пример кода в процедуре ПриСозданииНаСервере:


КоличествоСтрок = ВашМассив.Количество();
СписокПараметров = Новый Структура;
СписокПараметров.Вставить("КоличествоСтрок", КоличествоСтрок);
СписокПараметров.Вставить("СписокЗначений", ВашМассив);

// Установка параметров для динамического списка
Элементы.ВашДинамическийСписок.Параметры.УстановитьЗначениеПараметра("КоличествоСтрок", КоличествоСтрок);
Элементы.ВашДинамическийСписок.Параметры.УстановитьЗначениеПараметра("СписокЗначений", ВашМассив);

Работая с СКД, вы можете использовать возможности настройки параметров. В параметрах компоновки данных есть возможность указать, что параметр является необязательным или задать выражение, которое будет автоматически учитывать пустые значения. Это позволяет избежать написания громоздких условий непосредственно в текстах запросов.

Что важно запомнить

Подводя итог нашей совместной работе, выделим ключевые моменты:

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

← На главную