Как посчитать количество строчных и прописных букв в строке на 1С

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

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

Способ 1: Перебор символов в цикле с использованием функций ВРег и НРег

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

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

Разберем пример кода:


// Переменная ИсточникСтроки содержит текст для анализа
КолСимволовНРег = 0;
КолСимволовВРег = 0;

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

Сообщить("Строчных букв: " + КолСимволовНРег);
Сообщить("Прописных букв: " + КолСимволовВРег);

В этом примере функция Сред извлекает по одному символу, а конструкция Если...ИначеЕсли обеспечивает корректное распределение букв по счетчикам. Обратите внимание, что данный метод универсален и автоматически поддерживает как русские, так и английские буквы, а также любые другие алфавиты, имеющие понятие регистра.

Способ 2: Использование регулярных выражений (RegExp)

Если задача требует лаконичного кода или выполняется в высоконагруженных системах, стоит рассмотреть регулярные выражения. До версии платформы 8.3.23 для этого чаще всего использовали COM-объект VBScript.RegExp. Посмотрим, как это работает.

Для решения нашей задачи нам понадобятся два шаблона: один для строчных букв [а-яёa-z] и другой для прописных [А-ЯЁA-Z]. Обратите внимание на включение буквы «ё»: в кодировках она часто стоит отдельно от основного алфавитного диапазона «а-я», поэтому ее нужно указывать явно.


Reg = Новый COMОбъект("VBScript.RegExp");
Reg.IgnoreCase = Ложь; // Важно: учитываем регистр
Reg.Global = Истина;   // Ищем все вхождения, а не только первое

ТекстДляАнализа = "Пример Текста с English letters";

// Считаем строчные
Reg.Pattern = "[а-яёa-z]";
НР = Reg.Execute(ТекстДляАнализа).Count;

// Считаем прописные
Reg.Pattern = "[А-ЯЁA-Z]";
ВР = Reg.Execute(ТекстДляАнализа).Count;

Сообщить("Строчных: " + НР + ", Прописных: " + ВР);

Преимущество: код получается коротким, а логика выбора конкретных алфавитов (например, только латиница или только кириллица) настраивается простым изменением шаблона (Pattern).

Начиная с версии 8.3.23, в 1С появились встроенные функции для работы с регулярными выражениями, такие как НайтиПоРегулярномуВыражению. Мы рекомендуем использовать их, так как они работают быстрее и не зависят от операционной системы (что критично для серверов на Linux).

Оптимизация производительности на больших текстах

Проанализируем ситуацию, когда объем текста составляет несколько мегабайт. Использование функции Сред внутри цикла может существенно замедлить работу, так как 1С каждый раз обращается к строке для выделения подстроки.

В таких случаях эффективнее сначала преобразовать строку в массив символов. Рассмотрим этот прием:

  1. Используем функцию СтрРазделить с пустым разделителем, чтобы получить массив, где каждый элемент — один символ.
  2. Обходим массив обычным циклом Для Каждого.

МассивСимволов = СтрРазделить(ИсточникСтроки, "");
Для Каждого Симв Из МассивСимволов Цикл
    // Проверка регистра...
КонецЦикла;

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

Важные замечания по типам данных

В сообществе программистов 1С часто обсуждается возможность использования неявного приведения типов. Например, результат логического выражения (Символ = НРег(Символ)) платформа может интерпретировать как 1 (Истина) или 0 (Ложь) при сложении с числом. Рассмотрим такой "трюк":

НР = НР + (ТекСимвол = НРег(ТекСимвол));

Хотя такой код выглядит короче, мы советуем придерживаться явного написания через Если. Это делает код более читаемым для других разработчиков и страхует от изменения логики приведения типов в будущих версиях платформы.

Итоги

Мы разобрали основные методы подсчета регистра букв в 1С. Для простых задач идеально подходит цикл с использованием ВРег и НРег. Для сложных условий поиска и фильтрации символов лучше использовать регулярные выражения, не забывая про специфику буквы "Ё". При работе с большими текстами всегда помните об оптимизации через СтрРазделить. Используя эти инструменты, вы сможете эффективно решать задачи по анализу строковых данных в своих конфигурациях.

← На главную