Как правильно выполнить отбор по справочнику в запросе 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему не стоит использовать поиск по наименованию

Часто возникает желание написать условие вида ГДЕ ВидНоменклатуры.Наименование = \"Товары\". Это крайне плохая практика по нескольким причинам:

  1. Неуникальность: Наименование — это лишь текстовое описание. В базе могут быть два разных элемента с одинаковым именем, что приведет к ошибкам в логике отчета.
  2. Изменчивость: Если пользователь переименует элемент справочника, ваш запрос перестанет возвращать данные, так как жестко заданная строка перестанет совпадать со значением в базе.
  3. Производительность: Поиск по строковым полям, особенно с использованием оператора ПОДОБНО, выполняется значительно медленнее, чем поиск по ссылке, так как СУБД не может эффективно использовать индексы.

Использование параметров как стандарт разработки

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

Вместо попыток «вшить» наименование в запрос, мы передаем туда уже найденную Ссылку на нужный элемент справочника. Процесс состоит из двух шагов:

  1. Находим нужный объект в коде (например, Справочники.ВидыНоменклатуры.НайтиПоНаименованию(\"Товары\")).
  2. Передаем полученную Ссылка в запрос через метод УстановитьПараметр().

Рассмотрим пример правильного кода:


// В модуле объекта или менеджера
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ПродажиОбороты.Номенклатура
    |ИЗ
    |    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    |ГДЕ
    |    ПродажиОбороты.Номенклатура.ВидНоменклатуры = &ВидНоменклатуры";

// Получаем ссылку на объект
ВидНоменклатурыСсылка = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары");

// Передаем ссылку в запрос через параметр
Запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатурыСсылка);

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

Преимущества подхода с параметрами

Рассмотрим подробнее, почему этот метод считается эталонным:

Особенности работы с СКД и временными таблицами

Часто возникают вопросы при работе с Системой Компоновки Данных (СКД). Помните, что СКД управляет параметрами автоматически через настройки. Если вы пытаетесь «перехватить» управление параметрами в коде, когда они уже определены в схеме, это может привести к конфликтам.

Для сложных задач используйте Временные таблицы. Разделение запроса на этапы с помощью Поместить позволяет СУБД лучше оптимизировать выполнение. Использование параметров внутри запросов к временным таблицам ничем не отличается от обычных запросов — это стандартный и эффективный способ передачи данных.

Подводя итог: избегайте поиска объектов по наименованию и «захардкоженных» строк. Всегда оперируйте ссылками и передавайте их в запросы с помощью параметров. Это сделает ваш код профессиональным, быстрым и легко поддерживаемым.

← На главную