В процессе разработки отчетов или механизмов обработки данных в 1С часто возникает задача поиска записей, содержащих определенную подстроку. Нередко программисты пытаются использовать конструкцию вида &Параметр ПОДОБНО "%" + Поле + "%" или наоборот, пытаясь динамически сформировать условие прямо внутри запроса. Давайте разберемся, почему такой подход вызывает ошибку Неверные параметры ПОДОБНО и как правильно решать подобные задачи.
Оператор ПОДОБНО в языке запросов 1С предназначен для сравнения строкового поля с шаблоном. Ключевая проблема заключается в том, что правая часть выражения должна быть либо строковым литералом (например, "%Товар%"), либо параметром, переданным из кода 1С. Динамическая склейка строк прямо в тексте запроса с участием полей базы данных (например, &Текст + Поле) запрещена архитектурой платформы.
Даже если бы подобная конструкция работала, она была бы крайне неэффективной с точки зрения производительности. При выполнении такого запроса база данных вынуждена выполнять полное сканирование таблицы (Full Table Scan), просматривая каждую запись справочника, что недопустимо на больших объемах данных.
Рассмотрим несколько эффективных подходов для решения задачи, когда нужно найти объекты, названия которых содержатся в переданной строке.
Если задача заключается в том, чтобы найти номенклатуру, наименование которой точно соответствует одному из элементов в передаваемой пользователем строке, лучше всего разбить строку на части на стороне сервера приложения. Разберем алгоритм по шагам:
"Товар 1; Товар 2".СтрРазделить(Строка, ";").В для фильтрации.Такой подход позволяет 1С использовать индекс по полю Наименование, что делает поиск мгновенным.
// В коде 1С:
МассивНаименований = СтрРазделить(ВходящаяСтрока, ";");
Запрос.УстановитьПараметр("СписокНаименований", МассивНаименований);
// В запросе:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование В (&СписокНаименований)
Если элементов много или поиск сложнее, чем просто полное совпадение, рекомендуется использовать Временные таблицы. Этот способ считается «золотым стандартом» при работе с большими объемами данных.
Разберем логику:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (Inner Join) между вашей номенклатурой и временной таблицей.Соединение по полю Наименование (если по нему создан индекс) будет работать значительно быстрее, чем любая переборная логика.
Если задача стоит шире — например, нужно найти товары, если они упоминаются в очень длинном, неструктурированном тексте, где нет четких разделителей, стандартные запросы могут быть неудобны. В этом случае воспользуйтесь механизмом ПолнотекстовыйПоиск.
Этот механизм:
Для использования этого метода обратитесь к объекту ПолнотекстовыйПоиск, настройте индекс для нужных справочников и используйте метод Найти(), который вернет коллекцию найденных объектов.
Подводя итог, можно сделать следующие выводы для вашей работы:
ПОДОБНО — это ведет к ошибкам и низкой скорости работы.В или соединения (Join) по временным таблицам, так как они позволяют задействовать индексы СУБД.ПолнотекстовыйПоиск, разработанный специально для таких задач.Применяя эти методы, вы добьетесь не только чистого и профессионального кода, но и высокой производительности системы даже при интенсивном использовании поиска пользователями.