Как работать со строками в 1С: поиск, перебор и изменение регистра символов?

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

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

Задача 1: Поиск и вывод определенных символов из строки

Представим ситуацию, когда у нас есть длинная строка случайных букв, и нам необходимо найти все вхождения конкретной буквы (например, «Ы») и вывести их каждое в новой строке. Это классическая задача на перебор строки.

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


ПеременнаяА = "АППРРОРДГШЫЕПРМОЛОЛЖДЫАП";
ИскомыйСимвол = "Ы";

Для Счетчик = 1 По СтрДлина(ПеременнаяА) Цикл
    ТекущийСимвол = Сред(ПеременнаяА, Счетчик, 1);
    Если ТекущийСимвол = ИскомыйСимвол Тогда
        Сообщить("Найдена нужная буква: " + ИскомыйСимвол);
    КонецЕсли;
КонецЦикла;

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

Задача 2: Подсчет количества вхождений и оптимизация поиска

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


СтрокаСимволов = "АППРРОРДГШЫЕПРМОЛОЛЖДЫАПРВАОРЛДМИТЬТЫЫЕГГДЖЩЗХГШЩ";
ИскомыйСимвол = "Ы";
ВсегоВхождений = СтрЧислоВхождений(СтрокаСимволов, ИскомыйСимвол);

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

Проанализируем этот код: функция СтрНайти() в последних версиях платформы 8.3 имеет пятый параметр — номер вхождения. Это крайне удобно, так как нам не нужно вручную обрезать строку или высчитывать смещение. Мы сразу получаем индекс нужного нам символа.

Задача 3: Изменение регистра символов (Четные — строчные, Нечетные — заглавные)

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


ИсходнаяСтрока = "АППРРОРДГШЫЕПРМОЛОЛЖДЫАП";
РезультатЧетные = "";
РезультатНечетные = "";

Для Позиция = 1 По СтрДлина(ИсходнаяСтрока) Цикл
    ТекСимвол = Сред(ИсходнаяСтрока, Позиция, 1);
    
    Если Позиция % 2 = 0 Тогда
        // Позиция четная
        РезультатЧетные = РезультатЧетные + НРег(ТекСимвол);
    Иначе
        // Позиция нечетная
        РезультатНечетные = РезультатНечетные + ВРег(ТекСимвол);
    КонецЕсли;
КонецЦикла;

Сообщить("Нечетные (ВРег): " + РезультатНечетные);
Сообщить("Четные (НРег): " + РезультатЧетные);

Здесь функции ВРег() и НРег() отвечают за преобразование в верхний и нижний регистр соответственно. Проверка Позиция % 2 = 0 позволяет нам четко разделить логику обработки для каждого второго символа.

Задача 4: Перебор строки с конца (Реверс)

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


СтрокаА = "АБВГДЕ";
Для Счетчик = СтрДлина(СтрокаА) По 1 Цикл
    ТекСимвол = Сред(СтрокаА, Счетчик, 1);
    Сообщить(ТекСимвол);
КонецЦикла;

Обратите внимание, что в цикле Для по умолчанию используется инкремент (прибавление 1). Чтобы цикл корректно отработал «вниз», платформа 1С автоматически определит направление, если начальное значение больше конечного.

Важные советы по производительности

При работе с очень длинными строками (десятки тысяч символов) использование конструкции Строка = Строка + Символ может сильно замедлить работу программы. Это происходит потому, что в памяти 1С при каждом сложении создается новая копия строки.

Рассмотрим правильный подход через использование массива:

  1. Создайте новый объект Новый Массив.
  2. В цикле добавляйте обработанные символы в массив методом Добавить().
  3. После завершения цикла соберите финальную строку одним движением, используя функцию СтрСоединить(ВашМассив, "").

Этот метод работает в десятки раз быстрее на больших объемах данных, так как выделение памяти происходит более эффективно.

Современные функции платформы (8.3.10 и выше)

Не забывайте про вспомогательные функции, которые делают код чище:

Изучение этих методов позволит вам писать надежный и быстрый код для любых задач по обработке текстовой информации в системе 1С:Предприятие.

← На главную