К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сравнить строки в 1С

Как сравнить строки в 1С: операторы равенства, СтрСравнить, регистр символов, поиск подстроки и типичные ошибки при сравнении строк во встроенном языке.

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

В платформе 1С строки можно сравнивать напрямую операторами =, <>, >, <, а также с помощью функций СтрСравнить, СтрНайти и других методов работы со строками. Выбор способа зависит от задачи: нужно точное совпадение, поиск вхождения подстроки или сравнение без учёта регистра.

Ниже разобраны все основные приёмы сравнения строк с примерами кода, ограничениями каждого подхода и типичными ошибками, которые приводят к тому, что «одинаковые» строки оказываются не равны.

Как работает оператор равенства со строками

Самый простой способ сравнить две строки — оператор =. Он возвращает Истина, если строки полностью совпадают посимвольно, включая регистр букв, пробелы и специальные символы. Оператор <> проверяет обратное условие — неравенство.

Если Наименование = "ООО Ромашка" Тогда

Сообщить("Совпадение найдено");

КонецЕсли;

Если КодТовара <> "" Тогда

// строка не пустая

КонецЕсли;

Важная особенность: сравнение оператором = регистрозависимое. Строки "Привет" и "привет" считаются разными. Также учитываются все пробелы, в том числе неразрывные, и невидимые символы переноса строки. Именно поэтому сравнение часто «не срабатывает», хотя визуально строки выглядят одинаково.

Операторы > и < для строк выполняют лексикографическое сравнение по кодам символов. Это редко нужно в прикладных задачах, но используется, например, при ручной сортировке. Учтите, что порядок зависит от кодов символов Unicode, а не от привычного алфавитного порядка с учётом языка.

Сравнение без учёта регистра

Когда нужно сравнить строки независимо от того, заглавные в них буквы или строчные, обе строки приводят к одному регистру функциями ВРег() (верхний регистр) или НРег() (нижний регистр). После приведения сравнение выполняется обычным оператором равенства.

Если НРег(Наименование) = НРег("ооо ромашка") Тогда

// совпадение независимо от регистра

КонецЕсли;

Функция ТРег() для сравнения не подходит — она меняет регистр только первых букв слов и предназначена для оформления текста, а не для нормализации. Используйте именно ВРег() или НРег().

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

Функция СтрСравнить и её особенности

В новых версиях платформы доступна функция СтрСравнить(Строка1, Строка2). Она возвращает число: 0 — строки равны, отрицательное значение — первая строка меньше, положительное — первая строка больше. Сравнение выполняется посимвольно с учётом регистра.

Результат = СтрСравнить("Абв", "Абв"); // 0 — строки равны

Результат = СтрСравнить("Абв", "Где"); // меньше 0

Результат = СтрСравнить("Где", "Абв"); // больше 0

Эта функция удобна, когда нужен не просто факт равенства, а трёхсторонний результат — например, при реализации собственной сортировки или бинарного поиска. Для обычной проверки «равно / не равно» оператор = читается проще и работает так же надёжно.

Сравнение способов

Оператор =

Точное посимвольное сравнение с учётом регистра. Основной способ для проверки равенства.

ВРег()/НРег() + =

Сравнение без учёта регистра. Требует приведения обеих строк, подходит для пользовательского ввода.

СтрСравнить()

Возвращает -1/0/1, нужен для сортировки и трёхстороннего сравнения. Учитывает регистр.

СтрНайти()

Проверяет вхождение подстроки, а не равенство. Подходит для поиска фрагмента текста.

Проверка вхождения подстроки

Когда нужно не полное совпадение, а наличие фрагмента текста внутри строки, используется функция СтрНайти(Строка, ПодстрокаПоиска). Она возвращает позицию первого вхождения (нумерация с 1) или 0, если подстрока не найдена.

Если СтрНайти(Комментарий, "срочно") > 0 Тогда

// в комментарии есть слово "срочно"

КонецЕсли;

У функции есть дополнительные параметры: направление поиска (с начала или с конца), позиция начала поиска и номер вхождения. Это позволяет найти, например, второе вхождение запятой или последний символ слэша в пути к файлу.

Учтите, что СтрНайти тоже чувствительна к регистру. Для поиска без учёта регистра приведите обе строки к одному регистру перед вызовом функции.

Почему «одинаковые» строки не равны

Самая частая причина проблем со сравнением — лишние пробелы в начале или конце строки. Они появляются при загрузке данных из Excel, копировании из внешних систем, ручном вводе. Функция СокрЛП() удаляет незначащие пробелы слева и справа, СокрЛ() и СокрП() — только с одной стороны.

Если СокрЛП(Наименование) = СокрЛП(Эталон) Тогда

// сравнение без влияния крайних пробелов

КонецЕсли;

Вторая ловушка — неразрывный пробел (символ с кодом 160). Он выглядит как обычный пробел, но СокрЛП() его не всегда удаляет, а сравнение даёт ложь. Такие символы часто приходят из веб-страниц и Word. Для очистки используют СтрЗаменить(Строка, Символ(160), " ") с последующим СокрЛП().

Третья причина — переносы строк и табуляции внутри значения, особенно при сравнении многострочных полей. Перед сравнением такие строки стоит нормализовать: убрать лишние символы через СтрЗаменить или сравнивать построчно в цикле.

Типичные ошибки
01
Сравнение без СокрЛП() — строки с пробелами по краям считаются разными, хотя визуально совпадают.
02
Игнорирование регистра — пользователь ввёл значение с маленькой буквы, а в условии заглавная, проверка не срабатывает.
03
Использование ТРег() для нормализации — функция меняет только начала слов и не подходит для сравнения.
04
Сравнение строки с числом без приведения типов — результат непредсказуем, нужно явное преобразование через Строка() или Число().
05
Проверка пустоты через = "" вместо ПустаяСтрока() — строка из пробелов проходит проверку как непустая.

Сравнение строк в запросах

В языке запросов 1С сравнение строк выполняется оператором =, а для поиска по шаблону — оператор ПОДОБНО со спецсимволами: % (любая последовательность символов), _ (один произвольный символ), [...] (диапазон символов).

ВЫБРАТЬ

Контрагенты.Ссылка

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Наименование ПОДОБНО "%ромашка%"

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

Регистрозависимость сравнения в запросах зависит от настроек СУБД: в файловом варианте и при стандартных настройках MS SQL сравнение обычно регистронезависимое, но полагаться на это в переносимом коде не стоит.

Практический порядок надёжного сравнения

Чтобы сравнение строк работало предсказуемо в любых условиях, удобно придерживаться единой последовательности нормализации: убрать неразрывные пробелы, сократить крайние пробелы, привести к одному регистру — и только потом сравнивать.

Порядок действий
  1. 1
    Замените неразрывные пробелы: СтрЗаменить(Строка, Символ(160), " ").
  2. 2
    Уберите крайние пробелы функцией СокрЛП() у обеих строк.
  3. 3
    Приведите обе строки к одному регистру через НРег() или ВРег(), если регистр не важен.
  4. 4
    Выполните сравнение оператором = или проверку вхождения через СтрНайти().
  5. 5
    Проверьте результат на тестовых данных с пробелами, разным регистром и пустыми значениями.

Для проверки строки на пустоту используйте специализированную функцию ПустаяСтрока(Строка) — она возвращает Истина как для пустой строки, так и для строки, состоящей только из пробелов и незначащих символов. Это надёжнее, чем сравнение с пустой строкой.

Контрольные точки

Как проверить результат

Сравнение с тестовой строкой
Норма

Строки с разным регистром и пробелами распознаются как равные, если это задумано

Тревожный признак

Визуально одинаковые строки дают Ложь

Пустые значения
Норма

ПустаяСтрока() отлавливает и "", и строку из пробелов

Тревожный признак

Строка из пробелов проходит как заполненная

Производительность в цикле
Норма

Эталон нормализован один раз до цикла

Тревожный признак

НРег/СокрЛП вызываются для эталона на каждой итерации

Ответы на частые вопросы

Учитывает ли оператор = регистр букв при сравнении строк?

Да, сравнение оператором = регистрозависимое: «Текст» и «текст» считаются разными строками. Чтобы сравнить без учёта регистра, приведите обе строки к одному регистру функцией НРег() или ВРег() перед сравнением.

Как проверить, что строка пустая?

Используйте функцию ПустаяСтрока(Строка). Она возвращает Истина и для пустой строки, и для строки из одних пробелов, тогда как сравнение с "" отлавливает только полностью пустое значение.

Чем СтрСравнить отличается от обычного оператора равенства?

СтрСравнить возвращает число: 0 при равенстве, отрицательное или положительное значение при неравенстве, что удобно для сортировки. Оператор = возвращает только Истина или Ложь и проще читается в обычных проверках условий.

Почему строки выглядят одинаково, но сравнение даёт Ложь?

Чаще всего мешают невидимые символы: неразрывный пробел (код 160), табуляция, перенос строки. Удалите их через СтрЗаменить и СокрЛП перед сравнением. Для диагностики полезно вывести коды символов обеих строк в цикле.

Как найти подстроку без учёта регистра?

Приведите обе строки к одному регистру и затем вызовите СтрНайти: СтрНайти(НРег(Текст), НРег("искомое")) > 0. Сама функция СтрНайти регистр учитывает, поэтому нормализация обязательна.

Можно ли сравнивать строку с числом напрямую?

Нет, типы нужно привести явно. Преобразуйте число функцией Строка() или строку функцией Число() — иначе сравнение даст непредсказуемый результат или ошибку. Учтите, что Строка(Число) может добавить неразрывные пробелы-разделители разрядов.

Итог

Что важно запомнить

Для точного сравнения строк в 1С используйте оператор =, помня о его чувствительности к регистру и пробелам. Нормализуйте строки через СокрЛП() и НРег()/ВРег(), для поиска подстроки применяйте СтрНайти(), для проверки пустоты — ПустаяСтроку(), а в запросах — оператор ПОДОБНО с учётом его влияния на производительность.