Как преобразовать строку из формата CamelCase в текст с пробелами с помощью регулярных выражений

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С программисты часто сталкиваются с необходимостью преобразовать техническое имя объекта или переменной (написанное в стиле CamelCase или PascalCase) в человекочитаемую строку. Например, превратить АналитикаУчетаПоПартиям в Аналитика учета по партиям. Основным разделителем здесь выступает заглавная буква. В этой статье мы подробно разберем, как решить эту задачу с помощью регулярных выражений и альтернативных методов.

Решение через COM-объект VBScript.RegExp

Самый распространенный способ, который работает во всех версиях платформы 1С на операционных системах Windows, — это использование внешнего компонента VBScript.RegExp. Разберем по шагам, как настроить этот объект и применить его для вставки пробелов перед заглавными буквами.

Рассмотрим пример кода, который выполняет замену:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; // Важно: учитывать регистр букв
RegExp.Global = Истина;   // Искать все вхождения, а не только первое
RegExp.MultiLine = Ложь;  // Работаем с одной строкой
RegExp.Pattern = "([^^])([А-ЯЁ]+)"; // Шаблон поиска

Вход = "АналитикаУчетаПоПартиям";
// Выполняем замену: добавляем пробел между найденными группами
Выход = RegExp.Replace(Вход, "$1 $2");

// Приводим результат к нижнему регистру (необязательно)
Выход = Нрег(Выход);
// Делаем первую букву заглавной
Выход = Врег(Лев(Выход, 1)) + Сред(Выход, 2);

Проанализируем работу шаблона ([^^])([А-ЯЁ]+):

  1. ([^^]) — первая группа захвата, которая ищет любой символ, кроме начала строки. Это нужно, чтобы не добавить лишний пробел перед самым первым словом.
  2. ([А-ЯЁ]+) — вторая группа захвата, которая ищет одну или несколько заглавных букв кириллицы.
  3. В методе Replace мы указываем "$1 $2", что означает: взять первый найденный символ, поставить после него пробел и добавить вторую найденную группу (заглавную букву).

Обработка сложных случаев: аббревиатуры и цифры

Стандартный подход с регулярными выражениями может столкнуться с трудностями, если в строке встречаются аббревиатуры (несколько заглавных букв подряд) или цифры. Например, строка Аналитика23УчетаРФПоПартиям может быть обработана некорректно. Выясним причину: простые шаблоны часто не знают, как отделять цифры от букв или где заканчивается аббревиатура.

Для таких случаев лучше всего подходит алгоритмический перебор строки. Рассмотрим профессиональный метод, который используется в сложных инструментах разработки:


Функция ПолучитьПредставлениеИзИдентификатора(ИсходнаяСтрока) Экспорт
    СтрокаВозврата = Сред(ИсходнаяСтрока, 1, 1);
    Для Сч = 2 По СтрДлина(ИсходнаяСтрока) Цикл
        ПредыдущийСимвол = Сред(ИсходнаяСтрока, Сч - 1, 1);
        ТекущийСимвол = Сред(ИсходнаяСтрока, Сч, 1);
        СледующийСимвол = Сред(ИсходнаяСтрока, Сч + 1, 1);
        
        // Обработка нижнего подчеркивания
        Если ТекущийСимвол = "_" Тогда 
            СтрокаВозврата = СтрокаВозврата + " ";
            Продолжить;
        КонецЕсли;
        
        // Если текущий символ заглавный
        Если ВРЕГ(ТекущийСимвол) = ТекущийСимвол И ТекущийСимвол <> " " Тогда 
            // Проверяем условия для вставки пробела
            Если ВРЕГ(ПредыдущийСимвол) <> ПредыдущийСимвол 
                ИЛИ (ВРЕГ(ПредыдущийСимвол) = ПредыдущийСимвол И ВРЕГ(СледующийСимвол) <> СледующийСимвол И СледующийСимвол <> "") Тогда 
                СтрокаВозврата = СтрокаВозврата + " ";
            КонецЕсли;
        КонецЕсли;
        
        СтрокаВозврата = СтрокаВозврата + ТекущийСимвол;
    КонецЦикла;
    Возврат СтрокаВозврата;
КонецФункции

Разберем логику этого алгоритма:

Использование современных возможностей 1С (8.3.24+)

Если вы работаете на современной версии платформы 1С (8.3.24 и выше), использование VBScript.RegExp через COM-объекты становится неактуальным. Платформа теперь поддерживает нативные регулярные выражения. Это работает быстрее и, что самое главное, кроссплатформенно (в том числе на серверах под управлением Linux).

Посмотрим на пример использования нового объекта РегулярноеВыражение:


// В современных версиях 1С
РегВыр = Новый РегулярноеВыражение("([а-яё])([А-ЯЁ])", "m");
Результат = РегВыр.Заменить("АналитикаУчета", "$1 $2");

Также стоит помнить о Библиотеке Стандартных Подсистем (БСП). Если в вашей конфигурации есть БСП, вам не нужно писать регулярные выражения самостоятельно. В общем модуле СтроковыеФункцииКлиентСервер существует готовая функция НаименованиеОбъектаПоИдентификатору(), которая выполняет именно это преобразование, учитывая все правила платформы.

Резюме и рекомендации

Подведем итоги нашего анализа:

  1. Для простых строк вида ИмяПользователя достаточно простого регулярного выражения через VBScript.RegExp.
  2. Для корректной обработки строк с цифрами и аббревиатурами (например, УСН2023) используйте посимвольный перебор с проверкой регистра соседних символов.
  3. В новых проектах на платформе 8.3.24+ всегда отдавайте предпочтение встроенному объекту РегулярноеВыражение.
  4. Если конфигурация типовая или использует БСП, проверьте наличие готовых функций в СтроковыеФункцииКлиентСервер, чтобы не "изобретать велосипед".

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

← На главную