Как найти неразрывный пробел в строках с помощью запроса 1С?

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

При работе с текстовыми данными в 1С:Предприятие разработчики часто сталкиваются с проблемой "невидимых" символов. Один из самых коварных — неразрывный пробел (код символа 160). Визуально он ничем не отличается от обычного пробела, но для оператора ПОДОБНО это совершенно другой символ. В этой статье мы разберем, как эффективно находить такие строки в базе данных, используя консоль запросов и программный код.

Проблема использования неразрывного пробела в тексте запроса

Попытка просто скопировать неразрывный пробел в текст запроса внутри кавычек в операторе ПОДОБНО часто приводит к ошибкам или отсутствию результатов. Это происходит потому, что редакторы кода или консоли запросов могут автоматически преобразовывать этот символ в обычный пробел или делать его неразличимым для отладки. Рассмотрим ситуацию: нам нужно найти все записи, где в наименовании затесался символ с кодом 160.

Способ 1. Использование параметров запроса (Рекомендуемый)

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

Для формирования шаблона поиска мы используем функцию Символ(160). Разберем по шагам, как подготовить параметр для оператора ПОДОБНО:


// Подготовка параметра для поиска любого вхождения неразрывного пробела
НеразрывныйПробел = Символ(160);
ШаблонПоиска = "%" + НеразрывныйПробел + "%";

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

Запрос.УстановитьПараметр("Шаблон", ШаблонПоиска);
РезультатЗапроса = Запрос.Выполнить();

Если вы используете специализированные инструменты, такие как Консоль запросов из состава "Инструментов разработчика", вы можете воспользоваться вкладкой "Перед выполнением запроса". Это позволит динамически установить параметр прямо в процессе отладки:


// В консоли запросов на вкладке обработки перед выполнением:
мОбъектЗапроса.УстановитьПараметр("ПараметрНПП", "%" + Символ(160) + "%");

Способ 2. Ввод символа с клавиатуры (Alt-код)

Если вам нужно быстро проверить гипотезу в консоли без написания кода, можно попробовать ввести символ напрямую. Выясним, как это сделать с помощью стандартных средств Windows. Удерживая клавишу Alt, наберите на цифровой клавиатуре (Numpad) комбинацию 0160. В тексте запроса это будет выглядеть так:

ГДЕ Наименование ПОДОБНО "% " (внутри кавычек на месте пробела набран Alt+0160).

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

Способ 3. Работа в системе компоновки данных (СКД)

В СКД задача решается еще элегантнее. Нам не обязательно писать программный код для установки параметров. Выберем следующий алгоритм действий:

  1. Перейдем на закладку Параметры в схеме компоновки данных.
  2. Добавим новый параметр (например, НПП).
  3. В колонке Выражение укажем Символы.НПП или Символ(160).
  4. В тексте запроса СКД используем условие: ГДЕ Поле ПОДОБНО &Шаблон, где шаблон формируется на основе этого параметра.

Использование встроенной переменной Символы.НПП (Неразрывный Пробел) является стандартом "хорошего тона" в разработке на платформе 1С, так как это делает код читаемым.

Важные нюансы: Узкий неразрывный пробел (Код 8239)

Проанализируем современную специфику платформы 8.3. В последних версиях при форматировании чисел (разделении триад) 1С часто использует узкий неразрывный пробел с кодом 8239 (U+202F). Если поиск по коду 160 не принес результатов, обязательно попробуйте повторить процедуру для кода 8239.


// Поиск узкого неразрывного пробела
Запрос.УстановитьПараметр("УзкийНПП", "%" + Символ(8239) + "%");

Как визуализировать неразрывные пробелы для проверки?

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


// Пример обработки результата для визуального контроля
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    ОчищенноеНаименование = СтрЗаменить(Выборка.Наименование, Символ(160), "[НПП]");
    ОчищенноеНаименование = СтрЗаменить(ОчищенноеНаименование, Символ(8239), "[УЗКИЙ_НПП]");
    Сообщить(ОчищенноеНаименование);
КонецЦикла;

Влияние СУБД на результаты поиска

Стоит учитывать, что поведение оператора ПОДОБНО может зависеть от настроек сопоставления (collation) вашей базы данных на SQL Server или PostgreSQL. В крайне редких случаях настройки сервера могут быть сконфигурированы так, что он будет игнорировать различие между обычным и неразрывным пробелом при поиске. Однако, так как 1С работает с типами NVARCHAR и кодировкой Unicode, стандартное поведение платформы — различать эти символы как абсолютно разные сущности.

Резюме

Для гарантированного поиска неразрывного пробела в запросе:

  1. Всегда используйте параметры запроса.
  2. Проверяйте как стандартный неразрывный пробел (160), так и узкий (8239).
  3. В СКД отдавайте предпочтение системной константе Символы.НПП.
  4. Используйте СтрЗаменить при выводе данных для визуального подтверждения наличия символа в строке.
← На главную