В процессе разработки конфигураций на платформе 1С:Предприятие часто возникают задачи по обработке текстовых строк. Одной из таких специфических задач является изменение регистра первой заглавной буквы. Важно понимать, что "первая заглавная" может быть как самым первым символом в строке, так и находиться где-то в середине текста (например, после пробелов или знаков препинания). В данной статье мы подробно разберем несколько подходов к решению этой задачи, от самых простых до универсальных алгоритмов с посимвольным перебором.
Рассмотрим наиболее простой вариант, когда мы заранее уверены, что наша строка начинается именно с заглавной буквы, которую необходимо изменить. В этом случае нам не нужно организовывать поиск, достаточно воспользоваться стандартными строковыми функциями 1С. Проанализируем пример кода, который часто используется для быстрой обработки:
// Предположим, переменная Стр содержит текст "Заголовок"
Стр = НРег(Лев(Стр, 1)) + Сред(Стр, 2);
// Результат будет: "заголовок"
Разберем по шагам, как работает этот код:
Лев(Стр, 1) выделяет самый первый символ из нашей переменной.НРег() переводит этот выделенный символ в нижний регистр.Сред(Стр, 2) берет всю оставшуюся часть строки, начиная со второй позиции.Важно: этот метод подходит только в том случае, если первый символ строки гарантированно является буквой в верхнем регистре. Если строка начинается с пробела или цифры, код отработает, но не принесет желаемого результата, так как "первая большая буква" может скрываться дальше.
Теперь разберем более сложную и универсальную ситуацию: нам нужно найти первую заглавную букву, где бы она ни находилась, и сделать маленькой только её, оставив остальной текст без изменений. Для этого нам понадобится цикл и условие сравнения регистров. Проанализируем исправленный алгоритм:
Для Сч = 1 По СтрДлина(Стр) Цикл
ТекБуква = Сред(Стр, Сч, 1);
// Сравниваем букву с её вариантом в верхнем регистре
// Дополнительно проверяем, что буква не совпадает со своим вариантом в нижнем регистре
// (чтобы исключить цифры и знаки препинания)
Если (ВРег(ТекБуква) = ТекБуква) И (НРег(ТекБуква) <> ТекБуква) Тогда
// Формируем новую строку: текст ДО буквы + буква в НРег + текст ПОСЛЕ буквы
Стр = Сред(Стр, 1, Сч - 1) + НРег(ТекБуква) + Сред(Стр, Сч + 1);
// Прерываем цикл, так как нам нужна только ПЕРВАЯ заглавная буква
Прервать;
КонецЕсли;
КонецЦикла;
Рассмотрим подробнее логику этого решения:
СтрДлина(), чтобы определить количество итераций цикла.Сред(Стр, Сч, 1) мы получаем доступ к каждому конкретному символу по его индексу.ВРег(ТекБуква) = ТекБуква позволяет понять, что символ находится в верхнем регистре. Однако стоит помнить, что в 1С для цифр и знаков препинания это условие тоже может вернуть Истина. Поэтому мы добавляем проверку НРег(ТекБуква) <> ТекБуква, которая гарантирует, что перед нами именно буква, имеющая строчный вариант.Прервать, чтобы не обрабатывать последующие заглавные буквы.Существует еще один интересный логический подход: мы можем найти позицию первого отличия между исходной строкой и этой же строкой, полностью переведенной в нижний регистр. Выясним причину эффективности этого метода: первое несовпадение символов укажет нам на позицию первой заглавной буквы.
Рассмотрим реализацию этой идеи:
СтрокаВНижнемРегистре = НРег(Стр);
Для Сч = 1 По СтрДлина(Стр) Цикл
Если Сред(Стр, Сч, 1) <> Сред(СтрокаВНижнемРегистре, Сч, 1) Тогда
// Мы нашли позицию первой заглавной буквы
Стр = Сред(Стр, 1, Сч - 1) + Сред(СтрокаВНижнемРегистре, Сч, 1) + Сред(Стр, Сч + 1);
Прервать;
КонецЕсли;
КонецЦикла;
Этот метод изящен тем, что нам не нужно вручную проверять каждый символ на принадлежность к алфавиту. Функция НРег() сама проигнорирует цифры и спецсимволы, поэтому первое же различие в строках будет означать нахождение заглавной буквы.
При работе с большими строками в современных версиях платформы 1С:Предприятие 8.3 следует учитывать нюансы регистрозависимости. Разберем несколько полезных советов:
СтрСравнить(), которая позволяет явно указать необходимость учета регистра.VBScript.RegExp. С помощью паттерна "[A-ZА-ЯЁ]" можно моментально найти индекс первой заглавной буквы без использования циклов Для, что значительно ускорит работу на длинных текстах.Проанализировав все вышеперечисленные методы, мы видим, что выбор решения зависит от конкретных условий вашей задачи. Если заглавная буква всегда первая — используйте компактный код из первого способа. Если же позиция буквы неизвестна — оптимальным будет цикл с поиском первого отличия от НРег().