При разработке алгоритмов в 1С:Предприятии нередко возникает задача посимвольной обработки текста: например, при разборе штрихкодов, шифровании, проверке корректности ввода или форматировании текста. В других языках программирования к отдельному символу часто можно обратиться по индексу через квадратные скобки либо разделить строку с помощью пустой строки-разделителя. В платформе 1С действуют свои особенности и ограничения, поэтому разберем основные и наиболее эффективные способы решения этой задачи.
Прежде чем приступать к написанию кода, проанализируем важные ограничения платформы 1С:
Строка[Индекс] в 1С не поддерживается. Доступ к отдельным позициям строки осуществляется только с помощью встроенных функций.СтрРазделить: Данный метод требует обязательного указания непустого разделителя. Передать пустую строку "", чтобы сразу получить массив символов, нельзя — платформа вернет ошибку или исходную строку без разделения.Рассмотрим стандартный и самый универсальный способ: мы вычисляем общую длину строки через СтрДлина и в цикле последовательно извлекаем по одному символу с помощью функции Сред.
Посмотрим на пример кода, где строка разбивается на отдельные буквы и помещается в массив:
ИсходноеСлово = "правило";
МассивБукв = Новый Массив;
Для Индекс = 1 По СтрДлина(ИсходноеСлово) Цикл
ТекущийСимвол = Сред(ИсходноеСлово, Индекс, 1);
МассивБукв.Добавить(ТекущийСимвол);
КонецЦикла;
// Выведем полученные символы
Для Каждого Символ Из МассивБукв Цикл
Сообщить(Символ);
КонецЦикла;
Разберем этот код по шагам:
Для Индекс = 1 По СтрДлина(ИсходноеСлово) Цикл вычисляет длину строки один раз при входе в цикл и запускает итерации с 1 по общую длину строки.Сред(ИсходноеСлово, Индекс, 1) принимает три параметра: исходную строку, начальную позицию (нумерация в 1С начинается с 1) и количество извлекаемых знаков (в нашем случае 1).Добавить в результирующий Массив.Если промежуточный массив не требуется, а нужно сразу обработать или вывести символы, мы можем избавиться от двойного цикла и выполнять действия непосредственно внутри первой итерации:
ИсходноеСлово = "правило";
Для Индекс = 1 По СтрДлина(ИсходноеСлово) Цикл
Сообщить(Сред(ИсходноеСлово, Индекс, 1));
КонецЦикла;
Рассмотрим еще один подход, основанный на последовательном получении первого символа через Лев и усечении строки через Сред. Этот способ демонстрирует логику работы с подстроками, хотя на больших объемах данных он работает медленнее из-за постоянного пересоздания строк в памяти.
Текст = "правило";
Пока СтрДлина(Текст) > 0 Цикл
ПерваяБуква = Лев(Текст, 1);
Сообщить(ПерваяБуква);
// Отрезаем первый символ, оставляя остаток строки со 2-й позиции
Текст = Сред(Текст, 2);
КонецЦикла;
Если цель посимвольного разбора заключается в проверке текста (например, валидация на наличие только цифр или определенных букв), эффективнее работать не со строковыми срезами, а с числовыми кодами символов. Для этого используем функцию КодСимвола:
Текст = "Пример123";
Для Индекс = 1 По СтрДлина(Текст) Цикл
Код = КодСимвола(Текст, Индекс);
// Получить обратно строковое представление можно функцией Символ(Код)
Сообщить("Символ: " + Символ(Код) + " | Код: " + Строка(Код));
КонецЦикла;
При посимвольной обработке строк важно помнить о следующих деталях:
Символы.ПС, Символы.ВК), знаки табуляции (Символы.Таб) и неразрывные пробелы (Символы.НПП) воспринимаются платформой как полноценные символы единичной длины и также будут извлекаться на своих позициях.СтрДлина и Сред работают с 16-битными кодовыми единицами UTF-16. Если в строке присутствуют составные символы (например, эмодзи или редкие исторические знаки с кодами выше U+FFFF), один такой символ будет иметь длину 2 единицы, и обычный срез с длиной 1 разобьет его на две некорректные части.