В процессе разработки часто возникает задача фильтрации данных по начальному символу наименования. Например, нам нужно отобрать номенклатуру, которая начинается на букву «Р» или «р» (как русские, так и латинские символы). Давайте разберем, как сделать это правильно, эффективно и профессионально.
Начинающие разработчики часто используют конструкцию вида ПОДСТРОКА(Наименование, 1, 1) = «Р». Хотя такой подход работает, мы настоятельно не рекомендуем использовать его по нескольким причинам:
ПОДСТРОКА к полю базы данных в условии ГДЕ заставляет СУБД проводить полное сканирование таблицы (Full Scan). Это означает, что индексы по полю «Наименование» перестают работать, и запрос на больших объемах данных будет выполняться крайне медленно.ИЛИ, что затрудняет чтение и поддержку кода.Для решения подобных задач в языке запросов 1С предусмотрен мощный оператор ПОДОБНО. Он позволяет использовать шаблоны поиска, которые корректно обрабатываются оптимизатором СУБД. Давайте проанализируем, как правильно составить такой запрос.
Конструкция с ПОДОБНО позволяет нам искать значения, начинающиеся с определенного набора символов, используя специальные маски в квадратных скобках [].
Чтобы найти все записи, начинающиеся на «Р», «р», «P» или «p», мы используем шаблон внутри кавычек. Знак % в данном случае означает любое количество любых символов после найденной буквы.
Разберем пример кода, который эффективно решит вашу задачу:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование ПОДОБНО "[РрPp]%"
Что здесь происходит:
[РрPp] говорит системе: «ищи на первой позиции любую из перечисленных букв».% указывает, что за этой буквой может идти любой текст.ПОДОБНО в большинстве современных СУБД работает достаточно гибко, позволяя нам не перечислять множество условий через ИЛИ.Рассмотрим подробнее поведение системы:
ПОДОБНО в SQL-базах данных поиск по умолчанию чаще всего нечувствителен к регистру. Однако указание в шаблоне явно обоих вариантов (и «Р», и «р») является признаком хорошего тона и страховкой от специфических настроек сопоставления (collation) конкретной базы данных.[А-Яа-яA-Za-z]%. Это делает ваш код максимально универсальным.% или _, не забудьте воспользоваться ключевым словом СПЕЦСИМВОЛ, чтобы система не интерпретировала их как часть шаблона.Мы проанализировали ситуацию и выяснили, что оптимальный путь — это отказ от функций обработки строк в условиях ГДЕ в пользу оператора ПОДОБНО. Это обеспечит высокую скорость работы ваших отчетов и обработок, а также сделает код чистым и профессиональным. Используйте приведенный пример шаблона "[РрPp]%", и ваша задача будет решена корректно и быстро.