Как в запросе 1С сделать отбор по нескольким хозяйственным операциям в УТ 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с конфигурацией «Управление торговлей 11» (а также ERP и «Комплексная автоматизация») часто возникает задача анализа данных в регистре накопления Выручка и себестоимость продаж. Одной из типичных проблем для начинающих разработчиков становится необходимость отфильтровать данные не по одной, а по списку конкретных хозяйственных операций. Разберем детально, как реализовать такой отбор различными способами, от простого перечисления в тексте запроса до динамического формирования списка в программном коде.

Метод 1. Использование оператора В (IN) в тексте запроса

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


ВЫБРАТЬ
    Продажи.ХозяйственнаяОперация,
    Продажи.СуммаВыручкиОборот
ИЗ
    РегистрНакопления.ВыручкаСебестоимостьПродажи.ОБОРОТЫ(
        &НачалоПериода,
        &КонецПериода,
        ,
        ХозяйственнаяОперация В (
            ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияКлиенту),
            ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.АвансовыйОтчет)
        )
    ) КАК Продажи

В данном примере мы используем конструкцию ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения). Это позволяет жестко зафиксировать список операций прямо в коде запроса. Обратите внимание, что отбор накладывается в параметрах виртуальной таблицы Обороты, что крайне важно для производительности системы.

Метод 2. Логическое условие ИЛИ (OR)

Если по каким-то причинам вы не хотите использовать оператор В, можно воспользоваться классическим логическим сложением. Выясним причину, почему этот метод менее предпочтителен: при большом количестве операций (например, более 5–10) текст запроса становится трудночитаемым, однако для 2–3 значений он вполне допустим.

Пример реализации через логическое ИЛИ:


ГДЕ
    ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияКлиенту)
    ИЛИ ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияЧерезКомиссионера)

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

Метод 3. Программная передача списка значений (динамический отбор)

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

  1. Создаем объект СписокЗначений.
  2. Наполняем его нужными ссылками на перечисления.
  3. Передаем этот список в параметр запроса.

Проанализируем пример программного кода:


// 1. Подготавливаем список операций
СписокОпер = Новый СписокЗначений;
СписокОпер.Добавить(Перечисления.ХозяйственныеОперации.РеализацияКлиенту);
СписокОпер.Добавить(Перечисления.ХозяйственныеОперации.ВозвратТоваровОтКлиента);

// 2. Создаем запрос
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Выручка.СуммаВыручкиОборот
    |ИЗ
    |   РегистрНакопления.ВыручкаСебестоимостьПродажи.ОБОРОТЫ(,, , ХозяйственнаяОперация В (&СписокОпераций)) КАК Выручка";

// 3. Устанавливаем параметр
Запрос.УстановитьПараметр("СписокОпераций", СписокОпер);

Результат = Запрос.Выполнить();

Важный технический нюанс: при программном заполнении желательно явно указывать тип элементов списка значений. Это помогает избежать ошибок сопоставления типов в сложных запросах. Для этого можно использовать СписокОпер.ТипЗначений = Новый ОписаниеТипов("ПеречислениеСсылка.ХозяйственныеОперации");.

Метод 4. Настройка через Конструктор запросов (без кода)

Если вы предпочитаете визуальные инструменты разработки, разберем, как настроить такой отбор в Конструкторе запросов 1С:

  1. Откройте Конструктор запроса и перейдите на закладку «Условия».
  2. Если вы работаете с виртуальной таблицей, лучше нажать кнопку «Параметры виртуальной таблицы» (снизу слева под списком таблиц).
  3. В поле «Условие» выберите поле ХозяйственнаяОперация.
  4. В колонке «Условие» вместо знака = (равно) выберите или напишите вручную оператор В.
  5. В колонке «Произвольное» нажмите на многоточие. Здесь вы можете либо указать имя параметра (например, &СписокХозопераций), либо выбрать конкретные значения из перечисления, если список статичен. Конструктор автоматически сгенерирует правильный синтаксис В (ЗНАЧЕНИЕ(...)).

Оптимизация производительности: Виртуальные таблицы vs ГДЕ

Рассмотрим подробнее вопрос производительности. Регистр Выручка и себестоимость продаж в крупных базах УТ 11 может содержать миллионы записей.

Когда мы пишем условие внутри скобок виртуальной таблицы Обороты(..., ХозяйственнаяОперация В (...)), платформа 1С передает этот фильтр непосредственно СУБД (SQL Server или PostgreSQL). База данных отсекает ненужные записи еще на этапе чтения с диска.

Если же мы напишем условие в секции ГДЕ, СУБД сначала сформирует таблицу всех оборотов за период, передаст их на сервер приложений 1С, и только потом 1С отфильтрует лишнее. Это критическая ошибка, которой следует избегать при разработке отчетов.

Дополнительные возможности: Исключение операций (НЕ В)

Иногда ситуация бывает обратной: нам нужны почти все операции, кроме одной или двух (например, нужно исключить внутренние перемещения). В таком случае проще использовать отрицание НЕ В. Это значительно сокращает текст запроса и упрощает его поддержку.


ХозяйственнаяОперация НЕ В (
    ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПередачаМеждуОрганизациями),
    ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПеремещениеТоваров)
)

Использование в Системе компоновки данных (СКД)

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

Таким образом, мы рассмотрели все основные способы реализации отбора по нескольким значениям. Наиболее универсальным и производительным является использование оператора В внутри параметров виртуальной таблицы.

← На главную