Как в 1С преобразовать строку в CamelCase, обратно в текст с пробелами и создать валидный идентификатор?

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

При разработке на платформе 1С:Предприятие мы часто сталкиваемся с задачами обработки строк. Одной из специфических задач является приведение пользовательского ввода (например, "Мама мыла раму") к виду, пригодному для использования в коде или в качестве идентификаторов объектов метаданных (например, "МамаМылаРаму"). Этот стиль написания называется CamelCase (или PascalCase, если первая буква заглавная). Если подобные строки являются частью входящих заказов, инструмент автоматического создания документов по письмам сокращает время на преобразование содержимого текста в элементы справочников и документы.

В этой статье мы подробно разберем, как реализовать такое преобразование, обсудим подводные камни стандартных функций, рассмотрим обратную задачу (разделение слитного текста на слова) и, самое главное, выясним, как правильно генерировать идентификаторы для программного создания элементов справочников или команд. Когда сложная обработка строк нужна для рутинного переноса информации между программами, платформа для создания программных роботов выполняет эти операции без написания кода через имитацию действий пользователя.

Задача 1: Преобразование текста в CamelCase

Представим, что у нас есть исходная строка: "Мама мыла раму". Наша цель — получить строку "МамаМылаРаму". Рассмотрим несколько способов решения этой задачи.

Способ 1: Использование функции ТРег (Титульный Регистр)

Самый простой и быстрый способ, который первым приходит в голову, — использовать встроенную функцию глобального контекста ТРег(). Эта функция переводит первый символ каждого слова в верхний регистр, а остальные — в нижний.

Алгоритм действий следующий:

  1. Применяем ТРег() к исходной строке. Получаем "Мама Мыла Раму".
  2. Заменяем все пробелы на пустую строку с помощью функции СтрЗаменить().

ИсходнаяСтрока = "Мама мыла раму";
// Шаг 1: Приводим к титульному регистру
СтрокаТРег = ТРег(ИсходнаяСтрока); 
// Шаг 2: Удаляем пробелы
Результат = СтрЗаменить(СтрокаТРег, " ", "");
// Результат: "МамаМылаРаму"

Важное ограничение: Данный метод имеет существенный недостаток при работе с аббревиатурами. Если в исходной строке встречается слово, состоящее полностью из заглавных букв (например, "Расчет НДФЛ"), функция ТРег() превратит его в "Расчет Ндфл". В итоге мы получим "РасчетНдфл" вместо ожидаемого "РасчетНДФЛ".

Также стоит учитывать поведение функции в веб-клиенте. При работе с различными локалями и специфическими символами поведение функций преобразования регистра может отличаться, если код выполняется на клиенте (в браузере) без обращения к серверу.

Способ 2: Пословная обработка (сохранение регистра аббревиатур)

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

Для разбиения строки на слова удобно использовать функцию из Библиотеки Стандартных Подсистем (БСП) — СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок.


// Пример алгоритма для сохранения аббревиатур
ИсходнаяСтрока = "Расчет НДФЛ сотрудника";
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока, " ");

Результат = "";
Для Каждого Слово Из МассивСлов Цикл
    // Берем первую букву и делаем ее заглавной
    ПерваяБуква = ВРег(Лев(Слово, 1));
    // Остальную часть слова оставляем как есть (чтобы сохранить НДФЛ)
    ОстатокСлова = Сред(Слово, 2);
    
    Результат = Результат + ПерваяБуква + ОстатокСлова;
КонецЦикла;

// Результат: "РасчетНДФЛСотрудника"

Задача 2: Генерация валидного идентификатора (Имя метаданных)

Часто преобразование в CamelCase требуется не просто для красоты, а для программного создания элементов справочников (например, справочник "Команды", элементы формы, колонки таблиц). В этом случае простого удаления пробелов недостаточно. При миграции данных между конфигурациями, где элементы создавались вручную и имеют разные идентификаторы, обработка для переноса данных между похожими конфигурациями 1С служит для сопоставления объектов по любым реквизитам.

Имя (идентификатор) в 1С должно соответствовать строгим правилам:

Если мы просто преобразуем строку "1000 мелочей", мы получим "1000Мелочей", что вызовет ошибку платформы, так как имя не может начинаться с цифры. Строка "Заказ №5" превратится в "Заказ№5", что также недопустимо.

Использование БСП для валидации имен

В БСП существует специализированная функция, предназначенная именно для таких задач. Она находится в общем модуле СтандартныеПодсистемыСервер.

Разберем пример использования функции ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки (или аналогичных методов для формирования имен полей):


// Пример использования функции БСП для создания имени
ИсходнаяСтрока = "1000 мелочей (склад)";

// Функция попытается сделать из этого валидное имя
// Обычно она добавляет префикс, если строка начинается с цифры,
// и заменяет недопустимые символы.
ИмяКолонки = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ИсходнаяСтрока);

// Результат может выглядеть как: "_1000МелочейСклад" или аналогично

Также полезно знать о транслитерации, если вам нужны идентификаторы на латинице (например, для API). В БСП для этого используется функция СтроковыеФункции.ЛатинскаяСтрока().

Совет: При создании имен программно всегда добавляйте префикс (например, "Команда_" + Имя), чтобы гарантировать, что идентификатор не начнется с цифры. А недопустимые символы лучше удалять или заменять на подчеркивания через СтрЗаменитьПоРегулярномуВыражению (доступно в новых версиях платформы).

Задача 3: Обратное преобразование (CamelCase в текст с пробелами)

Иногда возникает обратная задача: есть идентификатор "МамаМылаРаму" или "XMLHttpRequest", и нужно превратить его в читаемый заголовок "Мама Мыла Раму" или "XML Http Request".

Эту задачу нельзя решить на 100% идеально для всех случаев (особенно со сложными аббревиатурами), но мы можем приблизиться к хорошему результату.

Метод 1: Перебор символов (Классический подход)

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


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

Недостаток этого кода в том, что аббревиатура "НДФЛ" превратится в "Н Д Ф Л", так как каждая буква заглавная. Чтобы этого избежать, алгоритм нужно усложнять проверкой следующего и предыдущего символа.

Метод 2: Регулярные выражения (Платформа 8.3.23+)

В современных версиях платформы 1С появилась нативная поддержка регулярных выражений. Это позволяет решать такие задачи элегантно и быстро.

Нам нужно найти места, где строчная буква сменяется заглавной (граница слова), и места, где заглавная буква сменяется строчной (граница аббревиатуры и слова, например в "XMLHttp").

Рассмотрим пример процедуры, использующей СтрНайтиВсеПоРегулярномуВыражению:


&НаСервере
Процедура РазделитьCamelCaseРегуляркой(ИсходнаяСтрока)                  
    Результат = ИсходнаяСтрока;
    
    // Шаг 1: Находим переходы от строчной к заглавной (например "aM" в "MamaMyla")
    // Паттерн ищет пару символов: [строчная][ЗАГЛАВНАЯ]
    РезПоиска = СтрНайтиВсеПоРегулярномуВыражению(ИсходнаяСтрока, "[а-яa-z][А-ЯA-Z]"); 
    
    // Вставляем пробел между ними
    Для каждого Элемент Из РезПоиска Цикл 
        Найденное = Элемент.Значение;
        // Заменяем "aM" на "a M"
        Замена = Лев(Найденное, 1) + " " + Прав(Найденное, 1);
        Результат = СтрЗаменить(Результат, Найденное, Замена);
    КонецЦикла;    
    
    // Шаг 2: Обработка аббревиатур перед словами (например "LH" в "XMLHttp")
    // Паттерн ищет [ЗАГЛАВНАЯ][строчная], чтобы отделить аббревиатуру
    // Этот шаг сложнее и требует аккуратности, чтобы не разорвать обычные слова
    // В простом варианте часто достаточно первого шага.
    
    // Финальная очистка от возможных двойных пробелов
    Результат = СтрЗаменить(Результат, "  ", " ");
    Результат = СокрЛП(Результат);
    
    Сообщить(Результат);
КонецПроцедуры

Регулярные выражения дают гораздо больше гибкости. Например, паттерн [а-яa-z][А-ЯA-Z] найдет границы слов в строке "МамаМылаРаму" и позволит превратить ее в "Мама Мыла Раму", не разбивая при этом аббревиатуру "НДФЛ", если она стоит отдельно. Для проверки и отладки подобных шаблонов можно использовать обработку для тестирования регулярных выражений в 1С.

Заключение

При работе со строками в 1С важно четко понимать конечную цель:

← На главную