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

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

Разбор ошибки в синтаксисе запроса

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

Правильный синтаксис выглядит следующим образом:


ВЫБРАТЬ
    Т.Ссылка
ИЗ
    Документ.ЭтапПроизводства2_2.РасходМатериаловИРаботы КАК Т
ГДЕ
    Т.Ссылка.Номер В (&номера)

Обратите внимание: скобки вокруг имени параметра (&номера) обязательны. Без них запрос вернет ошибку, так как платформа не сможет корректно интерпретировать переданный массив как список элементов для сравнения.

Правильная подготовка данных перед передачей в запрос

Второй важный момент — это подготовка массива. Часто встречается ошибка, когда инициализация массива новый Массив происходит внутри цикла. Это приводит к тому, что на каждой итерации переменная перезаписывается, и в итоге в запросе оказывается только последнее значение. Рассмотрим, как нужно подготовить данные правильно:


// Инициализируем массив ДО начала цикла
МассивНомеров = Новый Массив;

Для Каждого Стр Из Таблица Цикл
    // Добавляем значения в уже созданный массив
    МассивНомеров.Добавить(Стр.Номер);
КонецЦикла;

// Передаем массив в запрос
Запрос.УстановитьПараметр("номера", МассивНомеров);

Обязательно проверяйте, чтобы имя параметра в методе УстановитьПараметр() в точности совпадало с именем, указанным в тексте запроса после знака амперсанда &. В нашем случае это "номера".

Оптимизация структуры запроса

Работая с запросами, важно избегать избыточности. Если вы обращаетесь к реквизитам табличной части, таким как Номенклатура или Характеристика, помните, что они уже являются ссылочными типами. Нет необходимости добавлять к ним .Ссылка — это делает код менее читаемым и загромождает текст запроса.

Также важно критически оценивать задачу поиска по номеру документа. Рассмотрим, почему это может быть плохой практикой:

  1. Неуникальность: Номера документов могут повторяться в разных периодах (например, при смене года или при использовании префиксов).
  2. Производительность: Поиск по строковому полю Номер работает значительно медленнее, чем поиск по внутреннему идентификатору Ссылка.
  3. Альтернатива: Если у вас есть таблица значений, содержащая ссылки на документы, гораздо эффективнее передать саму таблицу в запрос через Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений) и поместить её во временную таблицу средствами ПОМЕСТИТЬ. Это позволит соединить данные с помощью ВНУТРЕННЕЕ СОЕДИНЕНИЕ, что работает значительно быстрее любого поиска по массиву номеров.

Итоги

Подводя черту, запомним основные правила успешного запроса:

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

← На главную