Как разбить строку или слово по буквам в 1С?

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

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

Ограничения платформы при работе со строками

Прежде чем приступать к написанию кода, проанализируем важные ограничения платформы 1С:

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

Основное решение: обход строки в цикле с функцией Сред

Рассмотрим стандартный и самый универсальный способ: мы вычисляем общую длину строки через СтрДлина и в цикле последовательно извлекаем по одному символу с помощью функции Сред.

Посмотрим на пример кода, где строка разбивается на отдельные буквы и помещается в массив:


ИсходноеСлово = "правило";
МассивБукв = Новый Массив;

Для Индекс = 1 По СтрДлина(ИсходноеСлово) Цикл
    ТекущийСимвол = Сред(ИсходноеСлово, Индекс, 1);
    МассивБукв.Добавить(ТекущийСимвол);
КонецЦикла;

// Выведем полученные символы
Для Каждого Символ Из МассивБукв Цикл
    Сообщить(Символ);
КонецЦикла;

Разберем этот код по шагам:

  1. Конструкция Для Индекс = 1 По СтрДлина(ИсходноеСлово) Цикл вычисляет длину строки один раз при входе в цикл и запускает итерации с 1 по общую длину строки.
  2. Функция Сред(ИсходноеСлово, Индекс, 1) принимает три параметра: исходную строку, начальную позицию (нумерация в 1С начинается с 1) и количество извлекаемых знаков (в нашем случае 1).
  3. Каждый полученный символ добавляется методом Добавить в результирующий Массив.

Если промежуточный массив не требуется, а нужно сразу обработать или вывести символы, мы можем избавиться от двойного цикла и выполнять действия непосредственно внутри первой итерации:


ИсходноеСлово = "правило";

Для Индекс = 1 По СтрДлина(ИсходноеСлово) Цикл
    Сообщить(Сред(ИсходноеСлово, Индекс, 1));
КонецЦикла;

Альтернативный вариант: посимвольное усечение строки

Рассмотрим еще один подход, основанный на последовательном получении первого символа через Лев и усечении строки через Сред. Этот способ демонстрирует логику работы с подстроками, хотя на больших объемах данных он работает медленнее из-за постоянного пересоздания строк в памяти.


Текст = "правило";

Пока СтрДлина(Текст) > 0 Цикл
    ПерваяБуква = Лев(Текст, 1);
    Сообщить(ПерваяБуква);
    
    // Отрезаем первый символ, оставляя остаток строки со 2-й позиции
    Текст = Сред(Текст, 2);
КонецЦикла;

Анализ строки через числовые коды символов

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


Текст = "Пример123";

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

Важные нюансы при обработке текста

При посимвольной обработке строк важно помнить о следующих деталях:

  1. Управляющие и невидимые символы: Переносы строк (Символы.ПС, Символы.ВК), знаки табуляции (Символы.Таб) и неразрывные пробелы (Символы.НПП) воспринимаются платформой как полноценные символы единичной длины и также будут извлекаться на своих позициях.
  2. Суррогатные пары Unicode: Функции СтрДлина и Сред работают с 16-битными кодовыми единицами UTF-16. Если в строке присутствуют составные символы (например, эмодзи или редкие исторические знаки с кодами выше U+FFFF), один такой символ будет иметь длину 2 единицы, и обычный срез с длиной 1 разобьет его на две некорректные части.
← На главную