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