Как выполнить сравнение строк с учетом регистра в запросе 1С?

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

При разработке запросов в платформе 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда условие равенства строк игнорирует регистр символов. Название "ТЕХНО-ромашка" и "техно-ромашка" для языка запросов оказываются идентичными. Проанализируем, почему возникает такое поведение, какие есть ограничения и какими способами можно реализовать регистрозависимое сравнение.

Причины регистронезависимого сравнения в запросах 1С

Выясним причину разницы между встроенным языком и языком запросов:

  1. Во встроенном языке 1С любое прямое сравнение строк (например, оператор = или функция СтрСравнить) по умолчанию выполняется с учетом регистра символов.
  2. В языке запросов 1С исполнение кода происходит на стороне СУБД (PostgreSQL, Microsoft SQL Server и др.). По умолчанию при создании баз данных 1С используется регистронезависимое сопоставление символов (Case-Insensitive Collation). Из-за этого операции сравнения и оператор ПОДОБНО транслируются в SQL без учета регистра.

Способ 1. Постфильтрация выборки во встроенном языке (Основной вариант)

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

Разберем пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗначенияСвойствОбъектов.Ссылка КАК Ссылка,
    |	ЗначенияСвойствОбъектов.Наименование КАК Наименование
    |ИЗ
    |	Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |	ЗначенияСвойствОбъектов.Наименование = &ИскомоеНаименование";

Запрос.УстановитьПараметр("ИскомоеНаименование", "ТЕХНО-ромашка");

Выборка = Запрос.Выполнить().Выбрать();

ИскомаяСтрока = "ТЕХНО-ромашка";
МассивРезультатов = Новый Массив;

Пока Выборка.Следующий() Цикл
    // Встроенный язык проверяет точное совпадение с учетом регистра
    Если Выборка.Наименование = ИскомаяСтрока Тогда
        МассивРезультатов.Добавить(Выборка.Ссылка);
    КонецЕсли;
КонецЦикла;

Этот способ эффективен, так как СУБД по индексам быстро отбирает минимальное количество совпадений без учета регистра, а программа 1С точно отсеивает записи с неверным регистром.

Способ 2. Хранение хеша или кодов символов в отдельном реквизите

Если выборка из базы данных должна возвращать строго точный результат без дополнительной обработки в цикле (например, для использования в сложных соединениях или вложенных запросах), разберем архитектурное решение с доработкой справочника или регистра.

  1. При записи объекта создаем и заполняем дополнительное индексируемое поле, например, ХешНаименования или КодыСимволов.
  2. Для расчета хеша с учетом регистра применяем функции контрольной суммы (MD5, SHA-256) или последовательность кодов символов Unicode, полученных с помощью функции КодСимвола.
  3. В запросе накладываем условие одновременно на текст и на значение хеша.

Посмотрим на пример условия в запросе при наличии реквизита ХешНаименования:


ВЫБРАТЬ
	ЗначенияСвойствОбъектов.Ссылка КАК Ссылка
ИЗ
	Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
	ЗначенияСвойствОбъектов.Наименование = &Наименование
	И ЗначенияСвойствОбъектов.ХешНаименования = &ХешНаименования

Способ 3. Прямые SQL-запросы и внешние источники данных

В случаях, когда проект предусматривает работу через прямые SQL-запросы (например, с использованием внешних источников данных или специализированных компонентов), мы можем явно указать языковые параметры сопоставления символов непосредственно в SQL-тексте.

Пример предложения COLLATE для Microsoft SQL Server:


SELECT Reference 
FROM Reference_PropertyValues 
WHERE Description COLLATE Russian_CS_AS = 'ТЕХНО-ромашка'

Параметр CS (Case-Sensitive) предписывает серверу СУБД проверять совпадение букв с учетом их регистра.

Почему не рекомендуется менять Collation всей базы данных

В свойствах СУБД при создании базы существует возможность установить регистрозависимое сопоставление (Case-Sensitive Collation). Однако делать это для рабочих баз 1С крайне не рекомендуется. Изменение параметра сопоставления на уровне СУБД приводит к сбоям в стандартных механизмах платформы 1С:Предприятие, в частности при контроле уникальности кодов справочников, номеров документов и префиксов.

← На главную