Как в запросе 1С заменить букву «ё» на «е» при поиске?

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

При интеграции систем или обмене данными через HTTP-сервисы часто возникает задача поиска физических лиц или контрагентов по наименованию или ФИО. Одна из распространенных проблем — различие в написании букв «е» и «ё». Например, в одной базе человек записан как «Секретарев», а из другой приходит «Секретарёв». Прямое сравнение через оператор равенства = в языке запросов 1С не считает такие строки идентичными.

Рассмотрим, как решить эту проблему с помощью встроенных возможностей языка запросов и встроенного языка 1С, а также проанализируем альтернативные архитектурные подходы.

Решение через оператор ПОДОБНО и маску [ЕЁ]

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

Разберем по шагам, как сформировать поисковую строку:

  1. Приведем исходную строку к верхнему регистру с помощью ВРег(), чтобы не завязываться на регистр.
  2. Заменим все вхождения букв «Е» и «Ё» на подстановочную маску [ЕЁ].
  3. Передадим полученную строку в качестве параметра для оператора ПОДОБНО.

Посмотрим на пример реализации кода:


// Исходное ФИО, полученное из сторонней системы
ИскомоеФИО = "Секретарев"; 

// Формируем шаблон для оператора ПОДОБНО
СтрокаПоиска = ВРег(ИскомоеФИО);
СтрокаПоиска = СтрЗаменить(СтрокаПоиска, "Е", "[]");
СтрокаПоиска = СтрЗаменить(СтрокаПоиска, "Ё", "[]");
СтрокаПоиска = СтрЗаменить(СтрокаПоиска, "[]", "[ЕЁ]");

// Выполняем запрос
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ФизическиеЛица.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ФизическиеЛица КАК ФизическиеЛица
    |ГДЕ
    |	ВРЕГ(ФизическиеЛица.Наименование) ПОДОБНО &СтрокаПоиска
    |	И ФизическиеЛица.ДатаРождения = &ДатаРождения";

Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска);
Запрос.УстановитьПараметр("ДатаРождения", ВходнаяДатаРождения);

РезультатЗапроса = Запрос.Выполнить();

При таком подходе строка "Секретарев" превратится в шаблон "С[ЕЁ]КР[ЕЁ]ТАР[ЕЁ]В". Оператор ПОДОБНО корректно найдет в базе записи с любым сочетанием букв «е» и «ё».

Ограничения и нюансы производительности

Проанализируем производительность данного решения. Использование масок и условий вида ПОДОБНО или функций вроде ВРЕГ() в секции ГДЕ имеет существенные недостатки на больших объемах данных:

Альтернативные способы решения для высоконагруженных систем

Если справочник содержит десятки или сотни тысяч записей, рассмотрим более оптимальные варианты архитектуры:

1. Добавление индексируемого реквизита для поиска

В объект (например, справочник ФизическиеЛица) добавляется дополнительный реквизит ФИОДляПоиска с включенным свойством Индексировать.

  1. В обработчике ПередЗаписью модуля объекта исходное ФИО очищается: приводится к верхнему регистру, а все буквы «Ё» заменяются на «Е».
  2. В запросе поиск выполняется простым и быстрым сравнением через оператор равенства: ГДЕ ФИОДляПоиска = &ИскомоеФИОНайти.

Такой подход позволяет СУБД мгновенно находить нужные записи с использованием индексов.

2. Использование встроенного полнотекстового поиска (ПТП)

Механизм полнотекстового поиска 1С автоматически приводит букву «ё» к «е» при построении полнотекстового индекса. Поиск через объект ПолнотекстовыйПоиск.СоздатьСписок() работает быстро и не требует дополнительных манипуляций со строками.

← На главную