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