Как объединить условия ПОДОБНО и В в одном запросе 1С?

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

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

Метод 1: Динамическое формирование текста запроса

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

  1. Создаем базовый текст запроса с плейсхолдером для условия.
  2. В цикле проходим по массиву значений.
  3. Добавляем к строке условий каждое значение, обрамляя его символами % для обеспечения поиска подстроки.
  4. Очищаем конструкцию от лишних операторов и выполняем запрос.

Посмотрим на пример реализации данного алгоритма:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ &Условие";
Условие = "";
Для Каждого Артикул Из МассивАртикулов Цикл
    Условие = Условие + СтрШаблон(" ИЛИ Т.Артикул ПОДОБНО ""%%"" + %1 + ""%%""", Артикул);
КонецЦикла;
// Удаляем первый оператор ИЛИ
Условие = СтрЗаменить(Условие, "ИЛИ", "", , 1);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", Условие);
Результат = Запрос.Выполнить();

Метод 2: Использование временных таблиц

Более элегантным и производительным способом для больших объемов данных является использование временных таблиц. Этот подход позволяет передать массив в запрос как таблицу, а затем выполнить внутреннее соединение с основным справочником, применив условие ПОДОБНО в блоке ОБЪЕДИНИТЬ или ГДЕ.

Разберем логику данного метода:

  1. Загружаем массив значений в таблицу значений (ТЗ), имеющую колонку Артикул.
  2. Передаем ТЗ в запрос как параметр.
  3. Помещаем данные во временную таблицу с помощью директивы ПОМЕСТИТЬ.
  4. Выполняем соединение, где условием будет выступать маска поиска.

Пример реализации через временные таблицы:


лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "
|ВЫБРАТЬ Таб.Артикул ПОМЕСТИТЬ втАртикулы ИЗ &Таблица КАК Таб;
|ВЫБРАТЬ спр.Ссылка, спр.Артикул 
|ИЗ Справочник.Номенклатура КАК спр 
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ втАртикулы КАК Таб 
|ПО (спр.Артикул ПОДОБНО ""%"" + Таб.Артикул + ""%"")";
лкЗапрос.УстановитьПараметр("Таблица", тзАртикулы);
Результат = лкЗапрос.Выполнить();

Важные замечания по производительности и безопасности

Работая с оператором ПОДОБНО, важно учитывать следующие аспекты:

Выбирайте метод в зависимости от размера базы и частоты выполнения таких операций. Динамические запросы отлично подходят для разовых задач, а временные таблицы — для профессиональной разработки с расчетом на масштабируемость.

← На главную