Разработка и Конфигурация · 10 мин
Как сравнить две строки в 1С
Способы сравнения строк в 1С: оператор равенства, СтрСравнить, сравнение без учёта регистра, примеры кода и типичные ошибки разработчиков.
Сравнение строк — одна из самых частых операций при разработке на встроенном языке 1С: проверка введённого значения, поиск совпадений в справочниках, сравнение кодов, артикулов, наименований. Платформа предлагает несколько способов: оператор равенства «=», функции Найти(), СтрСравнить() и приёмы с приведением регистра. Каждый способ ведёт себя по-разному при различиях в регистре, пробелах и невидимых символах.
Основная ловушка для начинающего разработчика — сравнение, которое «должно работать», но возвращает Ложь. Причины почти всегда одинаковы: лишние пробелы, разный регистр букв, неразрывные пробелы из скопированного текста или сравнение строки со значением другого типа. Ниже разобраны все рабочие варианты с примерами кода и способами проверки результата.
Сравнение оператором равенства
Самый простой способ — операторы «=» (равно) и «<>» (не равно). Сравнение выполняется посимвольно с учётом регистра: строки «Счёт» и «счёт» для платформы разные. Также учитываются все пробелы, включая начальные и конечные.
Строка1 = "Привет";
Строка2 = "Привет";
Если Строка1 = Строка2 Тогда
Сообщить("Строки совпадают");
Иначе
Сообщить("Строки различаются");
КонецЕсли;
Оператор равенства подходит, когда обе строки формируются программно в одном месте и гарантированно имеют одинаковый регистр и формат — например, при сравнении внутренних кодов, ключей настроек, значений перечислений, преобразованных в строку. Для данных, введённых пользователем или полученных из файлов, прямое сравнение без предварительной обработки ненадёжно.
Обратите внимание: если одна из переменных имеет тип, отличный от строки (число, дата, ссылка), сравнение вернёт Ложь без ошибки. Поэтому при сомнениях в типе значения явно преобразуйте его функцией Строка() или проверяйте тип через ТипЗнч().
Сравнение без учёта регистра
Если регистр букв не важен — например, пользователь мог ввести наименование с заглавной или строчной буквы, — приведите обе строки к одному регистру перед сравнением. Для этого используются функции ВРег() (верхний регистр) или НРег() (нижний регистр).
Если ВРег(СокрЛП(Строка1)) = ВРег(СокрЛП(Строка2)) Тогда
Сообщить("Строки совпадают без учёта регистра");
КонецЕсли;
Функция СокрЛП() удаляет пробельные символы в начале и в конце строки. Её стоит применять почти всегда, когда строка получена из поля ввода, файла Excel, CSV или буфера обмена. Есть также варианты СокрЛ() и СокрП(), убирающие пробелы только слева или только справа.
Учтите, что ВРег() и НРег() корректно работают с кириллицей и латиницей, но не устраняют различия между похожими символами разных алфавитов — например, русской «С» и латинской «C». Такие подмены часто встречаются в данных, скопированных из внешних систем, и являются частой причиной «непонятных» несовпадений.
Функция Найти() и поиск подстроки
Когда нужно не полное совпадение, а проверка, что одна строка содержит другую, используется функция Найти(). Она возвращает позицию первого вхождения подстроки (нумерация с единицы) или 0, если вхождения нет.
Если Найти(Наименование, "кабель") > 0 Тогда
// наименование содержит слово "кабель"
КонецЕсли;
Функция Найти() чувствительна к регистру, поэтому для поиска без учёта регистра применяйте её к строкам, приведённым через ВРег() или НРег(). Для проверки начала строки удобно сравнивать результат с 1, а для проверки окончания — использовать функцию СтрЗаканчиваетсяНа(), доступную в современных версиях платформы.
Для более сложных проверок — например, соответствия шаблону с символами «*» и «?» — есть функция СтрПодобна() (в новых версиях платформы), а для замен и разбора — СтрНайти(), СтрЗаменить() и СтрРазделить(). Эти функции позволяют строить гибкие условия без ручного посимвольного разбора.
Сравнение строк в запросах
В языке запросов 1С сравнение строк работает иначе, чем во встроенном языке. Оператор «=» в запросе сравнивает с учётом настроек базы данных, а для поиска по части строки применяется оператор ПОДОБНО с шаблоном.
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование ПОДОБНО "%кабель%"
Символ «%» означает любую последовательность символов, «_» — ровно один символ. Условие ПОДОБНО с «%» в начале шаблона не использует индекс и может заметно замедлить запрос на больших таблицах. Если поиск по подстроке выполняется часто, рассмотрите полнотекстовый поиск или хранение нормализованного варианта строки в отдельном реквизите.
Для точного сравнения в запросе передавайте строку параметром через УстановитьПараметр() — это исключает ошибки с кавычками и спецсимволами и защищает от некорректной подстановки пользовательского ввода в текст запроса.
Невидимые символы и нормализация строк
Частая причина «фантомных» несовпадений — неразрывные пробелы, символы табуляции и переносы строк, попадающие в данные при загрузке из Excel, веб-страниц или печатных форм. Визуально строки выглядят одинаково, но посимвольно различаются. СокрЛП() удаляет часть таких символов по краям, но не внутри строки.
Для глубокой очистки используйте СтрЗаменить() с явным указанием символа через Символ() — например, Символ(160) для неразрывного пробела — или функцию СтрСоединить() после разбора строки. Проверить фактическое содержимое строки можно, выведя коды символов в цикле через КодСимвола().
Строка1 = СтрЗаменить(Строка1, Символ(160), " ");
Строка2 = СтрЗаменить(Строка2, Символ(160), " ");
Если ВРег(СокрЛП(Строка1)) = ВРег(СокрЛП(Строка2)) Тогда
Сообщить("Совпадают");
КонецЕсли;
Как проверить, что сравнение работает правильно
После написания условия протестируйте его на граничных случаях: пустая строка, строка из одних пробелов, разный регистр, значение с неразрывным пробелом, значение другого типа. Пустая строка и строка из пробелов после СокрЛП() становятся равны — убедитесь, что это соответствует логике задачи, иначе добавьте проверку ПустаяСтрока().
Для отладки выводите оба значения и промежуточные результаты через Сообщить() или смотрите их в табло отладчика. В конфигураторе удобно поставить точку останова на строке сравнения и проверить фактическое содержимое переменных, включая длину строки функцией СтрДлина() — разная длина сразу укажет на скрытые символы.
Как проверить результат
Длины совпадают после нормализации
Длины разные при визуально одинаковом тексте — есть скрытые символы
Истина для логически равных строк
Ложь — проверяйте раскладку символов и типы значений
Обе переменные — строки
Одно из значений — число, дата или ссылка
Что важно запомнить
Для точного сравнения используйте «=», для пользовательских данных — связку ВРег(СокрЛП()), для поиска вхождения — Найти(), в запросах — ПОДОБНО с параметрами. Большинство «неработающих» сравнений объясняются пробелами, регистром, скрытыми символами или различием типов.
Частые вопросы
Учитывает ли сравнение «=» регистр букв в 1С?
Да, во встроенном языке сравнение оператором «=» чувствительно к регистру. Чтобы сравнить без учёта регистра, приведите обе строки к одному регистру функциями ВРег() или НРег() перед сравнением.
Почему визуально одинаковые строки не равны?
Чаще всего причина в концевых пробелах, неразрывных пробелах (код 160), символах табуляции или буквах из другой раскладки — русская «а» и латинская «a» выглядят одинаково, но имеют разные коды. Примените СокрЛП() и проверьте коды символов через КодСимвола().
Как проверить, что строка пустая?
Используйте функцию ПустаяСтрока(Значение) — она возвращает Истина как для пустой строки, так и для строки, состоящей только из пробелов и непечатаемых символов. Это надёжнее, чем сравнение с "".
Как сравнить строки в запросе 1С без учёта регистра?
В языке запросов нет прямого аналога ВРег() для условий сравнения. Обычно используют ПОДОБНО с шаблоном либо хранят в базе дополнительный реквизит с нормализованным (приведённым к одному регистру) значением и сравнивают по нему.
Что возвращает функция Найти(), если подстрока не найдена?
Функция Найти() возвращает 0, если вхождение не найдено, и позицию первого символа вхождения (начиная с 1), если найдено. Поэтому условие обычно записывают как Найти(Строка, Подстрока) > 0.
Можно ли сравнить строку со ссылкой на элемент справочника?
Напрямую — нет, результат всегда будет Ложь из-за разных типов. Сравнивайте ссылки со ссылками, а если нужно строковое сравнение, преобразуйте ссылку через Строка() или используйте уникальный идентификатор.