Разработка и Конфигурация · 9 мин
Как перевести строку в нижний регистр в 1С
Как перевести строку в нижний регистр в 1С: функция НРег, примеры кода, сравнение строк без учёта регистра, типичные ошибки и ответы на вопросы.
Во встроенном языке 1С:Предприятие перевод строки в нижний регистр выполняется одной функцией — НРег() (в англоязычном синтаксисе — Lower()). Она принимает строку и возвращает новую строку, в которой все буквенные символы приведены к нижнему регистру, а цифры, знаки препинания и пробелы остаются без изменений.
Задача возникает постоянно: при сравнении наименований товаров, поиске дублей контрагентов, обработке email-адресов, разборе файлов загрузки и нормализации данных перед записью в информационную базу. Регистр букв в данных, введённых пользователями вручную, почти никогда не бывает единообразным, поэтому приведение к нижнему (или верхнему) регистру — стандартный приём нормализации.
Ниже разобран синтаксис функции, практические сценарии применения, сравнение строк без учёта регистра, ограничения и типичные ошибки, которые допускают даже опытные разработчики.
Синтаксис функции НРег и базовые примеры
Функция имеет один обязательный параметр — исходную строку. Результат — новое строковое значение; исходная переменная при этом не изменяется, если результат явно не присвоить обратно.
СтрокаИсходная = "Номенклатура ТОВАРА Пример";
СтрокаНижний = НРег(СтрокаИсходная);
// Результат: "номенклатура товара пример"
Если требуется изменить саму переменную, результат присваивают ей же:
Наименование = НРег(Наименование);
В англоязычном варианте синтаксиса используется имя Lower:
Result = Lower(SourceString);
Обратите внимание: функция работает как с кириллицей, так и с латиницей. Смешанные строки вида «ТовАр Product ABC» будут корректно приведены к виду «товар product abc».
Сравнение строк без учёта регистра
Самая частая практическая задача — сравнить две строки, игнорируя регистр. В 1С оператор сравнения = для строк регистрозависим, поэтому «Товар» и «товар» считаются разными значениями. Стандартное решение — привести обе строки к одному регистру перед сравнением.
Если НРег(Наименование1) = НРег(Наименование2) Тогда
// Наименования совпадают с точностью до регистра
КонецЕсли;
Такой приём применяют при поиске дублей в справочниках, сопоставлении данных из внешних файлов с элементами базы, проверке введённого пользователем значения против эталонного списка. Для устойчивости сравнение часто дополняют функцией СокрЛП(), чтобы убрать ведущие и завершающие пробелы:
Если НРег(СокрЛП(Значение1)) = НРег(СокрЛП(Значение2)) Тогда
// Совпадение
КонецЕсли;
НРег в запросах и при поиске в базе данных
В языке запросов 1С также доступна функция НРЕГ(), которую можно применять к строковым полям в секциях выборки и условий. Это удобно, когда нужно найти элементы справочника по наименованию без учёта регистра:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НРЕГ(Номенклатура.Наименование) = &Наименование";
Запрос.УстановитьПараметр("Наименование", НРег(ИскомаяСтрока));
У этого подхода есть ограничение по производительности: условие с функцией над полем не позволяет эффективно использовать индекс по наименованию, поэтому на больших таблицах запрос может выполняться медленно. Альтернатива — хранить в справочнике дополнительный реквизит с уже нормализованным (приведённым к нижнему регистру) значением и искать по нему.
Как выбрать способ поиска
Смежные функции работы с регистром и обработкой строк
НРег — часть небольшого семейства функций для работы с регистром и строками. Знание всего набора помогает выбирать правильный инструмент под конкретную задачу.
| Функция | Действие | Типичное применение |
|---|---|---|
НРег() | Приводит строку к нижнему регистру | Нормализация, сравнение, поиск дублей |
ВРег() | Приводит строку к верхнему регистру | Коды, артикулы, ключи поиска |
ТРег() | Первую букву каждого слова — в верхний регистр, остальные — в нижний | ФИО, названия в представлениях |
СокрЛП() | Удаляет пробелы по краям строки | Подготовка к сравнению |
СтрДлина() | Возвращает длину строки | Проверка пустых и обрезанных значений |
Функция ТРег() полезна, когда нужен «человеческий» вид: например, привести «ИВАНОВ ИВАН» к «Иванов Иван». Однако она не знает правил русского языка — фамилии с дефисами и частицами могут быть оформлены неидеально, поэтому для официальных документов результат стоит проверять.
Типичные ошибки при работе с НРег
Первая распространённая ошибка — забыть, что функция возвращает новое значение. Вызов НРег(Наименование); без присваивания результата ничего не меняет, и дальнейший код работает с исходной строкой. Симптом — сравнение «не срабатывает», хотя данные визуально совпадают.
Вторая ошибка — сравнение строк с неразрывными пробелами и невидимыми символами, которые часто попадают в данные при копировании из Excel или веб-страниц. НРег их не удаляет, и строки, выглядящие одинаково, оказываются разными. Решение — предварительная очистка через СтрЗаменить с заменой неразрывного пробела (Символ(160)) на обычный или на пустую строку.
Третья ошибка — применение НРег к значениям, не являющимся строками. Если переменная содержит Неопределено или значение другого типа, возникнет ошибка выполнения. Перед вызовом убедитесь в типе значения или явно преобразуйте его через Строка().
Проверка результата и отладка
Убедиться, что преобразование работает, проще всего через вывод значения в сообщение или в отладчике. В отладчике достаточно вычислить выражение НРег(ПроверяемаяСтрока) в окне «Вычислить выражение» и сравнить с ожидаемым результатом.
Результат = НРег(СокрЛП(ВходнаяСтрока));
Сообщить("[" + Результат + "]");
Квадратные скобки вокруг значения — простой приём, позволяющий увидеть ведущие и завершающие пробелы, которые иначе незаметны. Если строка в сообщении выглядит корректно, но сравнение не проходит, проверяйте наличие неразрывных пробелов и символов-невидимок.
Как проверить результат
Все буквы строчные, цифры и знаки без изменений
Строка не изменилась — результат не присвоен переменной
Одинаковые по смыслу строки признаются равными
Визуально совпадающие строки не равны — ищите пробелы и невидимые символы
Поиск выполняется быстро на рабочем объёме данных
Заметная задержка — перенесите нормализацию в служебный реквизит
Когда нижний регистр не подходит: альтернативы
Приведение к нижнему регистру — не единственный вариант нормализации. Для ключей поиска и кодов часто удобнее верхний регистр через ВРег(): артикулы, штрихкодовые префиксы и технические идентификаторы традиционно хранят в верхнем регистре, и сравнение через ВРег выглядит естественнее.
Если задача — не сравнение, а красивое отображение, используйте ТРег(). А для сложной нормализации (например, удаления всех символов, кроме букв и цифр, перед сравнением) НРег комбинируют с циклом посимвольной обработки или регулярными заменами через СтрЗаменить.
Что важно запомнить
НРег(Строка) возвращает строку в нижнем регистре, не меняя исходное значение. Для сравнения без учёта регистра приводите обе строки и дополнительно очищайте их от пробелов. В запросах НРЕГ удобен, но на больших таблицах заменяйте его поиском по заранее нормализованному реквизиту.
Частые вопросы
Изменяет ли НРег исходную переменную?
Нет. Функция возвращает новое строковое значение. Чтобы изменить переменную, присвойте результат ей же: Наименование = НРег(Наименование).
Работает ли НРег с английскими буквами?
Да. Функция корректно обрабатывает и кириллицу, и латиницу, включая смешанные строки. Цифры, знаки препинания и пробелы остаются без изменений.
Как сравнить строки без учёта регистра в запросе?
Примените функцию НРЕГ к полю в условии запроса и передайте параметр, уже приведённый к нижнему регистру через НРег в коде. Учтите, что на больших таблицах такой запрос может работать медленнее из-за отказа от индекса.
Почему строки выглядят одинаково, но сравнение даёт Ложь?
Чаще всего причина в неразрывных пробелах, табуляциях или невидимых символах, попавших в данные из Excel или веб-страниц. Очистите строки через СокрЛП и замену Символ(160) на обычный пробел, затем повторите сравнение.
Чем НРег отличается от ТРег?
НРег переводит все буквы в нижний регистр, а ТРег делает заглавной первую букву каждого слова, остальные приводя к нижнему. НРег используют для сравнения и поиска, ТРег — для представления ФИО и названий.
Можно ли применить НРег к числу или к Неопределено?
Нет, это вызовет ошибку выполнения. Сначала проверьте тип значения или преобразуйте его в строку функцией Строка(), после чего применяйте НРег.