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