При разработке запросов в платформе 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда условие равенства строк игнорирует регистр символов. Название "ТЕХНО-ромашка" и "техно-ромашка" для языка запросов оказываются идентичными. Проанализируем, почему возникает такое поведение, какие есть ограничения и какими способами можно реализовать регистрозависимое сравнение.
Выясним причину разницы между встроенным языком и языком запросов:
= или функция СтрСравнить) по умолчанию выполняется с учетом регистра символов.ПОДОБНО транслируются в SQL без учета регистра.Рассмотрим наиболее простой и надежный вариант, не требующий изменения структуры базы данных или использования сторонних расширений. Мы оставляем запрос регистронезависимым для быстрой выборки кандидатов из базы данных, а точную отбраковку по регистру выполняем во встроенном языке 1С при обходе результата.
Разберем пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Ссылка КАК Ссылка,
| ЗначенияСвойствОбъектов.Наименование КАК Наименование
|ИЗ
| Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Наименование = &ИскомоеНаименование";
Запрос.УстановитьПараметр("ИскомоеНаименование", "ТЕХНО-ромашка");
Выборка = Запрос.Выполнить().Выбрать();
ИскомаяСтрока = "ТЕХНО-ромашка";
МассивРезультатов = Новый Массив;
Пока Выборка.Следующий() Цикл
// Встроенный язык проверяет точное совпадение с учетом регистра
Если Выборка.Наименование = ИскомаяСтрока Тогда
МассивРезультатов.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Этот способ эффективен, так как СУБД по индексам быстро отбирает минимальное количество совпадений без учета регистра, а программа 1С точно отсеивает записи с неверным регистром.
Если выборка из базы данных должна возвращать строго точный результат без дополнительной обработки в цикле (например, для использования в сложных соединениях или вложенных запросах), разберем архитектурное решение с доработкой справочника или регистра.
ХешНаименования или КодыСимволов.КодСимвола.Посмотрим на пример условия в запросе при наличии реквизита ХешНаименования:
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Ссылка КАК Ссылка
ИЗ
Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
ЗначенияСвойствОбъектов.Наименование = &Наименование
И ЗначенияСвойствОбъектов.ХешНаименования = &ХешНаименования
В случаях, когда проект предусматривает работу через прямые SQL-запросы (например, с использованием внешних источников данных или специализированных компонентов), мы можем явно указать языковые параметры сопоставления символов непосредственно в SQL-тексте.
Пример предложения COLLATE для Microsoft SQL Server:
SELECT Reference
FROM Reference_PropertyValues
WHERE Description COLLATE Russian_CS_AS = 'ТЕХНО-ромашка'
Параметр CS (Case-Sensitive) предписывает серверу СУБД проверять совпадение букв с учетом их регистра.
В свойствах СУБД при создании базы существует возможность установить регистрозависимое сопоставление (Case-Sensitive Collation). Однако делать это для рабочих баз 1С крайне не рекомендуется. Изменение параметра сопоставления на уровне СУБД приводит к сбоям в стандартных механизмах платформы 1С:Предприятие, в частности при контроле уникальности кодов справочников, номеров документов и префиксов.