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