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