Разработка и Конфигурация · 6 мин
Как изменить регистр строки в 1С
Как изменить регистр строки в 1С: функции ВРег(), НРег() и ТРег(), примеры кода, работа в запросах, типичные ошибки и способы проверки результата.
Функции для смены регистра строки
Во встроенном языке 1С есть три стандартные функции для изменения регистра строковых значений: ВРег(), НРег() и ТРег(). Они не меняют исходную переменную, а возвращают новую строку, поэтому результат нужно присваивать переменной или сразу использовать в выражении.
ВРег(Строка)— переводит все символы в верхний регистр (аналог UpperCase): «привет» → «ПРИВЕТ»;НРег(Строка)— переводит все символы в нижний регистр (аналог LowerCase): «ПРИВЕТ» → «привет»;ТРег(Строка)— переводит первый символ каждого слова в верхний регистр, остальные — в нижний (Title Case): «иванов иван» → «Иванов Иван».
Все три функции корректно работают с кириллицей и латиницей, а также с буквами других алфавитов, для которых определён регистр. Цифры, знаки препинания и пробелы не изменяются.
Примеры использования в коде
Базовый пример — нормализация пользовательского ввода перед сравнением или поиском:
Наименование = "карандаш простой";
ВерхнийРегистр = ВРег(Наименование); // "КАРАНДАШ ПРОСТОЙ"
НижнийРегистр = НРег(Наименование); // "карандаш простой"
Титульный = ТРег(Наименование); // "Карандаш Простой"
Типичный сценарий — сравнение строк без учёта регистра. Вместо прямого сравнения приводят обе строки к одному регистру:
Если НРег(ПользовательскийВвод) = НРег("отмена") Тогда
Отказ = Истина;
КонецЕсли;
Функцию ТРег() часто применяют к ФИО, названиям городов и улиц, чтобы исправить ввод заглавными буквами. Однако она обрабатывает каждое слово одинаково, поэтому аббревиатуры («ООО», «РФ») после ТРег превратятся в «Ооо», «Рф» — это нужно учитывать.
Смена регистра в запросах
В языке запросов 1С доступны функции ВРЕГ() и НРЕГ(), которые применяются к строковым полям выборки. Функции ТРЕГ() в языке запросов нет.
ВЫБРАТЬ
ВРЕГ(Номенклатура.Наименование) КАК НаименованиеВерхний
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НРЕГ(Номенклатура.Наименование) ПОДОБНО НРЕГ(&СтрокаПоиска)
Такой подход позволяет выполнять регистронезависимый поиск по подстроке. Учтите, что применение функции к полю в условии отбора отключает использование индекса по этому полю — на больших таблицах запрос может работать заметно медленнее.
Сравнение строк без учёта регистра
Если цель — не изменить строку, а сравнить значения без учёта регистра, есть два рабочих способа. Первый — приведение обеих строк к одному регистру через НРег() или ВРег(). Второй — функция СтрСравнить() с параметром, задающим правила сравнения, либо сравнение через объект СравнениеЗначений.
Способы регистронезависимого сравнения
Простой и читаемый способ, подходит для разовых сравнений в коде
Аналогично через верхний регистр; результат идентичен
Оператор = в языке запросов для строк работает без учёта регистра по умолчанию в большинстве конфигураций — отдельные функции часто не нужны
Важная особенность: в запросах 1С сравнение строк оператором = обычно регистронезависимое (зависит от настроек СУБД), поэтому оборачивать поля в ВРЕГ() для точного сравнения часто избыточно. А вот в коде встроенного языка оператор = сравнивает строки с учётом регистра — здесь приведение регистра обязательно.
Обработка специальных случаев
Первая буква предложения заглавная
Функция ТРег() делает заглавной первую букву каждого слова, а не только первого. Если нужно привести к виду «Первая буква заглавная, остальные строчные», комбинируйте функции:
Исходная = "ПРИВЕТ МИР";
Результат = ВРег(Лев(Исходная, 1)) + НРег(Сред(Исходная, 2));
// "Привет мир"
ФИО и составные фамилии
Для фамилий с дефисом («Салтыков-Щедрин») функция ТРег() воспринимает дефис как часть слова, и после него буква останется строчной: «Салтыков-щедрин». Если это критично, строку предварительно разбивают по дефису, обрабатывают каждую часть через ТРег() и склеивают обратно.
Перед записью ФИО в базу полезно сначала применить СокрЛП() для удаления лишних пробелов, а уже потом ТРег() — лишние пробелы не мешают функции, но портят данные и усложняют последующий поиск дублей.
Типичные ошибки и проверка результата
Чтобы убедиться, что преобразование сработало, выведите результат в сообщение или проверьте в отладчике. Для пакетной обработки данных (например, исправления регистра наименований в справочнике) сначала выполните обработку на копии базы и проверьте несколько записей вручную.
Как проверить результат
Все буквы заглавные, цифры и знаки без изменений
Строка не изменилась — результат не присвоен переменной
Каждое слово с заглавной буквы
Аббревиатуры искажены (Ооо вместо ООО)
Выполняется быстро, находит записи в любом регистре
Запрос выполняется секундами — проверьте план и индексы
FAQ
Меняет ли ВРег() исходную переменную?
Нет. Функция возвращает новую строку, поэтому результат нужно присвоить: Строка = ВРег(Строка);. Вызов без присваивания не даёт никакого эффекта.
Как сделать заглавной только первую букву строки?
Используйте комбинацию: ВРег(Лев(Строка,1)) + НРег(Сред(Строка,2)). Функция ТРег() не подходит, так как она делает заглавной первую букву каждого слова.
Есть ли ТРег() в языке запросов?
Нет, в языке запросов доступны только ВРЕГ() и НРЕГ(). Если нужен титульный регистр, обработайте результат запроса в коде после выборки.
Работают ли эти функции с английским текстом?
Да, ВРег(), НРег() и ТРег() корректно обрабатывают латиницу, кириллицу и другие алфавиты, для которых определён регистр символов.
Как сравнить строки без учёта регистра?
Приведите обе строки к одному регистру: Если НРег(Строка1) = НРег(Строка2) Тогда .... В запросах сравнение строк оператором = обычно уже регистронезависимое.
Что важно запомнить
Используйте ВРег(), НРег() и ТРег() для смены регистра в коде и ВРЕГ()/НРЕГ() в запросах. Результат всегда присваивайте переменной, а в условиях запросов помните о потере индекса.