При работе с Системой компоновки данных (СКД) и языком запросов 1С часто возникает необходимость настроить гибкий фильтр по текстовым полям. Стандартных условий «Равно» или «Содержит» не всегда достаточно. В таких случаях на помощь приходит оператор ПОДОБНО, который позволяет использовать маски и шаблоны. Разберем подробно, как работают текстовые шаблоны, какие спецсимволы поддерживаются и как решать нестандартные задачи, такие как поиск строки определенной длины.
Для начала рассмотрим базовый синтаксис, который используется в языке запросов и настройках отборов СКД. Система 1С поддерживает стандартный набор символов для формирования масок:
"А%" найдет все строки, начинающиеся на букву «А»."Б__"."[АБ]%" найдет строки, начинающиеся либо на «А», либо на «Б»."[^0-9]%" найдет строки, которые не начинаются с цифры.Проанализируем ситуацию, когда необходимо отобрать данные, длина которых составляет не менее 7 символов. В СКД при использовании вида сравнения ПОДОБНО мы можем сконструировать маску, комбинируя подчеркивания и процент.
Поскольку каждое нижнее подчеркивание _ требует наличия ровно одного обязательного символа, для обеспечения минимальной длины в 7 знаков нам нужно поставить 7 таких символов подряд. Чтобы после них могло идти любое количество знаков (или не идти вовсе), в конце добавляется знак процента %.
Итоговый шаблон будет выглядеть так:
_______%
Рассмотрим, как это работает на практике. Если в базе есть строка «123456», она не попадет в выборку, так как не соответствует семи обязательным позициям. Строка «1234567» попадет (ровно 7 символов), и строка «Администратор» также попадет (больше 7 символов).
Выясним причину, по которой иногда стандартные шаблоны не работают. Бывают случаи, когда сам искомый текст содержит символы % или _. Например, нам нужно найти в справочнике номенклатуры все позиции, в наименовании которых встречается подстрока «50%».
Если мы напишем ПОДОБНО "%50%%", система воспримет все проценты как команды шаблона. Чтобы указать, что один из символов является частью текста, используется ключевое слово СПЕЦСИМВОЛ (в английском варианте ESCAPE). Мы назначаем любой символ (например, # или /) «экранирующим».
Пример кода в запросе:
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.Наименование ПОДОБНО "%50#%%" СПЕЦСИМВОЛ "#"
В данном примере символ, стоящий сразу после #, воспринимается как обычный текст, а не как команда маски.
Рассмотрим подробнее возможности квадратных скобок. Это мощный инструмент для сложной фильтрации:
[а-яА-Я] для поиска любых кириллических букв или [0-9] для цифр. Допускается объединение: [а-яА-Я0-9].], она должна стоять первой в списке внутри скобок. Дефис - должен стоять либо в самом начале, либо в самом конце перечисления, чтобы не восприниматься как разделитель диапазона.Проанализируем эффективность использования шаблонов типа _______%. Хотя этот способ рабочий, он имеет существенный недостаток — низкую производительность. СУБД не может эффективно использовать индексы, если первый символ шаблона не определен (является подстановочным знаком). Поиск будет выполняться полным сканированием таблицы, что критично для больших справочников или регистров.
Для задачи «строка не короче N символов» в СКД правильнее и эффективнее использовать встроенные функции работы со строками. Разберем по шагам, как это сделать:
ДЛИНАСТРОКИ().Условие в запросе или выражении СКД будет выглядеть так:
ДЛИНАСТРОКИ(Наименование) >= 7
Этот метод работает быстрее, так как функция ДЛИНАСТРОКИ на уровне SQL-сервера транслируется в высокооптимизированную команду (например, LEN() в MS SQL), и код становится более читаемым для других разработчиков.
Посмотрим на ситуацию, которая часто вводит в заблуждение начинающих программистов: работа с полями фиксированной длины. В некоторых конфигурациях строковые поля могут иметь фиксированную длину (например, 10 символов). Если в такое поле записано слово «Текст», фактически в базе оно хранится как «Текст» плюс 5 пробелов в конце.
При использовании шаблона "%Текст" (поиск в конце строки) такое значение найдено не будет. Чтобы избежать проблем, рекомендуется использовать функцию СОКРП() или добавлять процент в конце шаблона: "%Текст%".
Также важно помнить про регистрозависимость. В большинстве типовых инсталляций 1С на Windows + MS SQL Server поиск через ПОДОБНО является регистронезависимым (буквы «А» и «а» одинаковы). Однако при использовании PostgreSQL или специфических настроек базы данных это поведение может измениться. Всегда проверяйте настройки Collation вашей базы данных, если фильтры ведут себя непредсказуемо.
Если мы формируем отчет программно, важно правильно передать вид сравнения. Посмотрим на пример кода:
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
ЭлементОтбора.ПравоеЗначение = "ABC[0-9]%";
ЭлементОтбора.Использование = Истина;
В данном случае система автоматически применит правила шаблонирования к строке ПравоеЗначение. Помните, что если вы даете пользователю возможность самому вводить маску, стоит проинструктировать его о значении символов % и _.