Как правильно формировать текстовые шаблоны для отбора в СКД и запросах 1С

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

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

Основные спецсимволы оператора ПОДОБНО

Для начала рассмотрим базовый синтаксис, который используется в языке запросов и настройках отборов СКД. Система 1С поддерживает стандартный набор символов для формирования масок:

Решение задачи: Любая строка не короче 7 символов

Проанализируем ситуацию, когда необходимо отобрать данные, длина которых составляет не менее 7 символов. В СКД при использовании вида сравнения ПОДОБНО мы можем сконструировать маску, комбинируя подчеркивания и процент.

Поскольку каждое нижнее подчеркивание _ требует наличия ровно одного обязательного символа, для обеспечения минимальной длины в 7 знаков нам нужно поставить 7 таких символов подряд. Чтобы после них могло идти любое количество знаков (или не идти вовсе), в конце добавляется знак процента %.

Итоговый шаблон будет выглядеть так:

_______%

Рассмотрим, как это работает на практике. Если в базе есть строка «123456», она не попадет в выборку, так как не соответствует семи обязательным позициям. Строка «1234567» попадет (ровно 7 символов), и строка «Администратор» также попадет (больше 7 символов).

Использование спецсимвола ESCAPE (СПЕЦСИМВОЛ)

Выясним причину, по которой иногда стандартные шаблоны не работают. Бывают случаи, когда сам искомый текст содержит символы % или _. Например, нам нужно найти в справочнике номенклатуры все позиции, в наименовании которых встречается подстрока «50%».

Если мы напишем ПОДОБНО "%50%%", система воспримет все проценты как команды шаблона. Чтобы указать, что один из символов является частью текста, используется ключевое слово СПЕЦСИМВОЛ (в английском варианте ESCAPE). Мы назначаем любой символ (например, # или /) «экранирующим».

Пример кода в запросе:


ВЫБРАТЬ
    Товары.Наименование
ИЗ
    Справочник.Номенклатура КАК Товары
ГДЕ
    Товары.Наименование ПОДОБНО "%50#%%" СПЕЦСИМВОЛ "#"

В данном примере символ, стоящий сразу после #, воспринимается как обычный текст, а не как команда маски.

Работа с диапазонами внутри квадратных скобок

Рассмотрим подробнее возможности квадратных скобок. Это мощный инструмент для сложной фильтрации:

Альтернативный подход через функции СКД

Проанализируем эффективность использования шаблонов типа _______%. Хотя этот способ рабочий, он имеет существенный недостаток — низкую производительность. СУБД не может эффективно использовать индексы, если первый символ шаблона не определен (является подстановочным знаком). Поиск будет выполняться полным сканированием таблицы, что критично для больших справочников или регистров.

Для задачи «строка не короче N символов» в СКД правильнее и эффективнее использовать встроенные функции работы со строками. Разберем по шагам, как это сделать:

  1. В схеме компоновки данных перейдем на закладку «Настройки».
  2. В разделе «Отбор» добавим новое условие.
  3. В левой части выберем поле, а в правой вместо прямого значения нажмем на кнопку выбора типа и выберем «Выражение».
  4. Используем функцию ДЛИНАСТРОКИ().

Условие в запросе или выражении СКД будет выглядеть так:

ДЛИНАСТРОКИ(Наименование) >= 7

Этот метод работает быстрее, так как функция ДЛИНАСТРОКИ на уровне SQL-сервера транслируется в высокооптимизированную команду (например, LEN() в MS SQL), и код становится более читаемым для других разработчиков.

Особенности концевых пробелов и регистра

Посмотрим на ситуацию, которая часто вводит в заблуждение начинающих программистов: работа с полями фиксированной длины. В некоторых конфигурациях строковые поля могут иметь фиксированную длину (например, 10 символов). Если в такое поле записано слово «Текст», фактически в базе оно хранится как «Текст» плюс 5 пробелов в конце.

При использовании шаблона "%Текст" (поиск в конце строки) такое значение найдено не будет. Чтобы избежать проблем, рекомендуется использовать функцию СОКРП() или добавлять процент в конце шаблона: "%Текст%".

Также важно помнить про регистрозависимость. В большинстве типовых инсталляций 1С на Windows + MS SQL Server поиск через ПОДОБНО является регистронезависимым (буквы «А» и «а» одинаковы). Однако при использовании PostgreSQL или специфических настроек базы данных это поведение может измениться. Всегда проверяйте настройки Collation вашей базы данных, если фильтры ведут себя непредсказуемо.

Программная установка отборов

Если мы формируем отчет программно, важно правильно передать вид сравнения. Посмотрим на пример кода:


ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
ЭлементОтбора.ПравоеЗначение = "ABC[0-9]%";
ЭлементОтбора.Использование = Истина;

В данном случае система автоматически применит правила шаблонирования к строке ПравоеЗначение. Помните, что если вы даете пользователю возможность самому вводить маску, стоит проинструктировать его о значении символов % и _.

← На главную