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

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

Как изменить регистр строки в 1С

Как изменить регистр строки в 1С: функции ВРег(), НРег() и ТРег(), примеры кода, работа в запросах, типичные ошибки и способы проверки результата.

Функции для смены регистра строки

Во встроенном языке 1С есть три стандартные функции для изменения регистра строковых значений: ВРег(), НРег() и ТРег(). Они не меняют исходную переменную, а возвращают новую строку, поэтому результат нужно присваивать переменной или сразу использовать в выражении.

  • ВРег(Строка) — переводит все символы в верхний регистр (аналог UpperCase): «привет» → «ПРИВЕТ»;
  • НРег(Строка) — переводит все символы в нижний регистр (аналог LowerCase): «ПРИВЕТ» → «привет»;
  • ТРег(Строка) — переводит первый символ каждого слова в верхний регистр, остальные — в нижний (Title Case): «иванов иван» → «Иванов Иван».

Все три функции корректно работают с кириллицей и латиницей, а также с буквами других алфавитов, для которых определён регистр. Цифры, знаки препинания и пробелы не изменяются.

Примеры использования в коде

Базовый пример — нормализация пользовательского ввода перед сравнением или поиском:

Наименование = "карандаш простой";

ВерхнийРегистр = ВРег(Наименование); // "КАРАНДАШ ПРОСТОЙ"

НижнийРегистр = НРег(Наименование); // "карандаш простой"

Титульный = ТРег(Наименование); // "Карандаш Простой"

Типичный сценарий — сравнение строк без учёта регистра. Вместо прямого сравнения приводят обе строки к одному регистру:

Если НРег(ПользовательскийВвод) = НРег("отмена") Тогда

Отказ = Истина;

КонецЕсли;

Функцию ТРег() часто применяют к ФИО, названиям городов и улиц, чтобы исправить ввод заглавными буквами. Однако она обрабатывает каждое слово одинаково, поэтому аббревиатуры («ООО», «РФ») после ТРег превратятся в «Ооо», «Рф» — это нужно учитывать.

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

В языке запросов 1С доступны функции ВРЕГ() и НРЕГ(), которые применяются к строковым полям выборки. Функции ТРЕГ() в языке запросов нет.

ВЫБРАТЬ

ВРЕГ(Номенклатура.Наименование) КАК НаименованиеВерхний

ИЗ

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

ГДЕ

НРЕГ(Номенклатура.Наименование) ПОДОБНО НРЕГ(&СтрокаПоиска)

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

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

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

Способы регистронезависимого сравнения

НРег(А) = НРег(Б)

Простой и читаемый способ, подходит для разовых сравнений в коде

ВРег(А) = ВРег(Б)

Аналогично через верхний регистр; результат идентичен

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

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

Важная особенность: в запросах 1С сравнение строк оператором = обычно регистронезависимое (зависит от настроек СУБД), поэтому оборачивать поля в ВРЕГ() для точного сравнения часто избыточно. А вот в коде встроенного языка оператор = сравнивает строки с учётом регистра — здесь приведение регистра обязательно.

Обработка специальных случаев

Первая буква предложения заглавная

Функция ТРег() делает заглавной первую букву каждого слова, а не только первого. Если нужно привести к виду «Первая буква заглавная, остальные строчные», комбинируйте функции:

Исходная = "ПРИВЕТ МИР";

Результат = ВРег(Лев(Исходная, 1)) + НРег(Сред(Исходная, 2));

// "Привет мир"

ФИО и составные фамилии

Для фамилий с дефисом («Салтыков-Щедрин») функция ТРег() воспринимает дефис как часть слова, и после него буква останется строчной: «Салтыков-щедрин». Если это критично, строку предварительно разбивают по дефису, обрабатывают каждую часть через ТРег() и склеивают обратно.

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

Типичные ошибки и проверка результата

Типичные ошибки
01
Вызов ВРег(Строка) без присваивания результата — функция возвращает новое значение, исходная строка не меняется
02
Ожидание, что ТРег() сохранит аббревиатуры: «ООО Ромашка» превратится в «Ооо Ромашка»
03
Использование НРЕГ() в условии запроса на большой таблице — отключается индекс, запрос тормозит
04
Сравнение строк оператором = в коде без приведения регистра — «Да» и «да» окажутся не равны

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

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

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

Результат ВРег()
Норма

Все буквы заглавные, цифры и знаки без изменений

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

Строка не изменилась — результат не присвоен переменной

Результат ТРег() для ФИО
Норма

Каждое слово с заглавной буквы

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

Аббревиатуры искажены (Ооо вместо ООО)

Запрос с НРЕГ()
Норма

Выполняется быстро, находит записи в любом регистре

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

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

FAQ

Меняет ли ВРег() исходную переменную?

Нет. Функция возвращает новую строку, поэтому результат нужно присвоить: Строка = ВРег(Строка);. Вызов без присваивания не даёт никакого эффекта.

Как сделать заглавной только первую букву строки?

Используйте комбинацию: ВРег(Лев(Строка,1)) + НРег(Сред(Строка,2)). Функция ТРег() не подходит, так как она делает заглавной первую букву каждого слова.

Есть ли ТРег() в языке запросов?

Нет, в языке запросов доступны только ВРЕГ() и НРЕГ(). Если нужен титульный регистр, обработайте результат запроса в коде после выборки.

Работают ли эти функции с английским текстом?

Да, ВРег(), НРег() и ТРег() корректно обрабатывают латиницу, кириллицу и другие алфавиты, для которых определён регистр символов.

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

Приведите обе строки к одному регистру: Если НРег(Строка1) = НРег(Строка2) Тогда .... В запросах сравнение строк оператором = обычно уже регистронезависимое.

Итог

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

Используйте ВРег(), НРег() и ТРег() для смены регистра в коде и ВРЕГ()/НРЕГ() в запросах. Результат всегда присваивайте переменной, а в условиях запросов помните о потере индекса.