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

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

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

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

Сравнение строк — одна из самых частых операций при разработке на встроенном языке 1С: проверка введённого значения, поиск совпадений в справочниках, сравнение кодов, артикулов, наименований. Платформа предлагает несколько способов: оператор равенства «=», функции Найти(), СтрСравнить() и приёмы с приведением регистра. Каждый способ ведёт себя по-разному при различиях в регистре, пробелах и невидимых символах.

Основная ловушка для начинающего разработчика — сравнение, которое «должно работать», но возвращает Ложь. Причины почти всегда одинаковы: лишние пробелы, разный регистр букв, неразрывные пробелы из скопированного текста или сравнение строки со значением другого типа. Ниже разобраны все рабочие варианты с примерами кода и способами проверки результата.

Сравнение оператором равенства

Самый простой способ — операторы «=» (равно) и «<>» (не равно). Сравнение выполняется посимвольно с учётом регистра: строки «Счёт» и «счёт» для платформы разные. Также учитываются все пробелы, включая начальные и конечные.

Строка1 = "Привет";

Строка2 = "Привет";

Если Строка1 = Строка2 Тогда

Сообщить("Строки совпадают");

Иначе

Сообщить("Строки различаются");

КонецЕсли;

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

Обратите внимание: если одна из переменных имеет тип, отличный от строки (число, дата, ссылка), сравнение вернёт Ложь без ошибки. Поэтому при сомнениях в типе значения явно преобразуйте его функцией Строка() или проверяйте тип через ТипЗнч().

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

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

Если ВРег(СокрЛП(Строка1)) = ВРег(СокрЛП(Строка2)) Тогда

Сообщить("Строки совпадают без учёта регистра");

КонецЕсли;

Функция СокрЛП() удаляет пробельные символы в начале и в конце строки. Её стоит применять почти всегда, когда строка получена из поля ввода, файла Excel, CSV или буфера обмена. Есть также варианты СокрЛ() и СокрП(), убирающие пробелы только слева или только справа.

Учтите, что ВРег() и НРег() корректно работают с кириллицей и латиницей, но не устраняют различия между похожими символами разных алфавитов — например, русской «С» и латинской «C». Такие подмены часто встречаются в данных, скопированных из внешних систем, и являются частой причиной «непонятных» несовпадений.

Типичные ошибки
01
Сравнение строк без СокрЛП() — лишний пробел в конце делает строки неравными
02
Сравнение без приведения регистра там, где данные вводит пользователь
03
Путаница между русской и латинской раскладкой в одинаковых на вид символах
04
Сравнение строки со ссылкой или числом без преобразования типа — результат всегда Ложь

Функция Найти() и поиск подстроки

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

Если Найти(Наименование, "кабель") > 0 Тогда

// наименование содержит слово "кабель"

КонецЕсли;

Функция Найти() чувствительна к регистру, поэтому для поиска без учёта регистра применяйте её к строкам, приведённым через ВРег() или НРег(). Для проверки начала строки удобно сравнивать результат с 1, а для проверки окончания — использовать функцию СтрЗаканчиваетсяНа(), доступную в современных версиях платформы.

Для более сложных проверок — например, соответствия шаблону с символами «*» и «?» — есть функция СтрПодобна() (в новых версиях платформы), а для замен и разбора — СтрНайти(), СтрЗаменить() и СтрРазделить(). Эти функции позволяют строить гибкие условия без ручного посимвольного разбора.

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

В языке запросов 1С сравнение строк работает иначе, чем во встроенном языке. Оператор «=» в запросе сравнивает с учётом настроек базы данных, а для поиска по части строки применяется оператор ПОДОБНО с шаблоном.

ВЫБРАТЬ

Номенклатура.Ссылка

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Наименование ПОДОБНО "%кабель%"

Символ «%» означает любую последовательность символов, «_» — ровно один символ. Условие ПОДОБНО с «%» в начале шаблона не использует индекс и может заметно замедлить запрос на больших таблицах. Если поиск по подстроке выполняется часто, рассмотрите полнотекстовый поиск или хранение нормализованного варианта строки в отдельном реквизите.

Для точного сравнения в запросе передавайте строку параметром через УстановитьПараметр() — это исключает ошибки с кавычками и спецсимволами и защищает от некорректной подстановки пользовательского ввода в текст запроса.

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

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

Для глубокой очистки используйте СтрЗаменить() с явным указанием символа через Символ() — например, Символ(160) для неразрывного пробела — или функцию СтрСоединить() после разбора строки. Проверить фактическое содержимое строки можно, выведя коды символов в цикле через КодСимвола().

Строка1 = СтрЗаменить(Строка1, Символ(160), " ");

Строка2 = СтрЗаменить(Строка2, Символ(160), " ");

Если ВРег(СокрЛП(Строка1)) = ВРег(СокрЛП(Строка2)) Тогда

Сообщить("Совпадают");

КонецЕсли;

Как проверить, что сравнение работает правильно

После написания условия протестируйте его на граничных случаях: пустая строка, строка из одних пробелов, разный регистр, значение с неразрывным пробелом, значение другого типа. Пустая строка и строка из пробелов после СокрЛП() становятся равны — убедитесь, что это соответствует логике задачи, иначе добавьте проверку ПустаяСтрока().

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

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

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

СтрДлина() обеих строк
Норма

Длины совпадают после нормализации

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

Длины разные при визуально одинаковом тексте — есть скрытые символы

Результат сравнения после ВРег(СокрЛП())
Норма

Истина для логически равных строк

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

Ложь — проверяйте раскладку символов и типы значений

Тип значений через ТипЗнч()
Норма

Обе переменные — строки

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

Одно из значений — число, дата или ссылка

Итог

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

Для точного сравнения используйте «=», для пользовательских данных — связку ВРег(СокрЛП()), для поиска вхождения — Найти(), в запросах — ПОДОБНО с параметрами. Большинство «неработающих» сравнений объясняются пробелами, регистром, скрытыми символами или различием типов.

Частые вопросы

Учитывает ли сравнение «=» регистр букв в 1С?

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

Почему визуально одинаковые строки не равны?

Чаще всего причина в концевых пробелах, неразрывных пробелах (код 160), символах табуляции или буквах из другой раскладки — русская «а» и латинская «a» выглядят одинаково, но имеют разные коды. Примените СокрЛП() и проверьте коды символов через КодСимвола().

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

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

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

В языке запросов нет прямого аналога ВРег() для условий сравнения. Обычно используют ПОДОБНО с шаблоном либо хранят в базе дополнительный реквизит с нормализованным (приведённым к одному регистру) значением и сравнивают по нему.

Что возвращает функция Найти(), если подстрока не найдена?

Функция Найти() возвращает 0, если вхождение не найдено, и позицию первого символа вхождения (начиная с 1), если найдено. Поэтому условие обычно записывают как Найти(Строка, Подстрока) > 0.

Можно ли сравнить строку со ссылкой на элемент справочника?

Напрямую — нет, результат всегда будет Ложь из-за разных типов. Сравнивайте ссылки со ссылками, а если нужно строковое сравнение, преобразуйте ссылку через Строка() или используйте уникальный идентификатор.