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