Работа со строковыми данными — это одна из фундаментальных задач программиста 1С. Будь то разбор артикула, поиск определенных букв в комментарии или форматирование текста для отчетов, важно понимать, как платформа «1С:Предприятие 8.3» позволяет манипулировать текстом. В этой статье мы подробно разберем несколько практических задач: от простого поиска символа до сложной обработки регистра символов в зависимости от их позиции.
Представим ситуацию, когда у нас есть длинная строка случайных букв, и нам необходимо найти все вхождения конкретной буквы (например, «Ы») и вывести их каждое в новой строке. Это классическая задача на перебор строки.
Разберем самый простой и понятный способ — использование цикла Для по длине строки. В этом случае мы проходим по каждому индексу символа, извлекаем его с помощью функции Сред() и сравниваем с искомым значением.
ПеременнаяА = "АППРРОРДГШЫЕПРМОЛОЛЖДЫАП";
ИскомыйСимвол = "Ы";
Для Счетчик = 1 По СтрДлина(ПеременнаяА) Цикл
ТекущийСимвол = Сред(ПеременнаяА, Счетчик, 1);
Если ТекущийСимвол = ИскомыйСимвол Тогда
Сообщить("Найдена нужная буква: " + ИскомыйСимвол);
КонецЕсли;
КонецЦикла;
В данном примере функция СтрДлина() возвращает общее количество знаков в строке, а Сред(Строка, Позиция, Количество) позволяет получить ровно один символ в текущей позиции. Если условие Если...Тогда выполняется, программа выводит сообщение в окно сообщений.
Иногда нам недостаточно просто найти символы, нужно еще и узнать их точное количество. Рассмотрим более элегантный способ, который использует встроенную функцию СтрЧислоВхождений() и СтрНайти(). Это позволяет не перебирать каждый символ строки, а «прыгать» сразу к нужным позициям.
СтрокаСимволов = "АППРРОРДГШЫЕПРМОЛОЛЖДЫАПРВАОРЛДМИТЬТЫЫЕГГДЖЩЗХГШЩ";
ИскомыйСимвол = "Ы";
ВсегоВхождений = СтрЧислоВхождений(СтрокаСимволов, ИскомыйСимвол);
Для НомерВхождения = 1 По ВсегоВхождений Цикл
Позиция = СтрНайти(СтрокаСимволов, ИскомыйСимвол, , , НомерВхождения);
Если Позиция > 0 Тогда
Сообщить("Символ найден в позиции: " + Позиция);
КонецЕсли;
КонецЦикла;
Сообщить("Итого найдено символов: " + ВсегоВхождений);
Проанализируем этот код: функция СтрНайти() в последних версиях платформы 8.3 имеет пятый параметр — номер вхождения. Это крайне удобно, так как нам не нужно вручную обрезать строку или высчитывать смещение. Мы сразу получаем индекс нужного нам символа.
Рассмотрим более сложную задачу форматирования: нам нужно вывести строку так, чтобы все символы на нечетных позициях стали прописными (заглавными), а на четных — строчными (маленькими). Для этого мы будем использовать оператор остатка от деления %.
ИсходнаяСтрока = "АППРРОРДГШЫЕПРМОЛОЛЖДЫАП";
РезультатЧетные = "";
РезультатНечетные = "";
Для Позиция = 1 По СтрДлина(ИсходнаяСтрока) Цикл
ТекСимвол = Сред(ИсходнаяСтрока, Позиция, 1);
Если Позиция % 2 = 0 Тогда
// Позиция четная
РезультатЧетные = РезультатЧетные + НРег(ТекСимвол);
Иначе
// Позиция нечетная
РезультатНечетные = РезультатНечетные + ВРег(ТекСимвол);
КонецЕсли;
КонецЦикла;
Сообщить("Нечетные (ВРег): " + РезультатНечетные);
Сообщить("Четные (НРег): " + РезультатЧетные);
Здесь функции ВРег() и НРег() отвечают за преобразование в верхний и нижний регистр соответственно. Проверка Позиция % 2 = 0 позволяет нам четко разделить логику обработки для каждого второго символа.
Иногда алгоритм требует обработки текста с последнего символа к первому. В 1С это можно реализовать, настроив шаг цикла или используя отрицательные индексы в расчетах.
СтрокаА = "АБВГДЕ";
Для Счетчик = СтрДлина(СтрокаА) По 1 Цикл
ТекСимвол = Сред(СтрокаА, Счетчик, 1);
Сообщить(ТекСимвол);
КонецЦикла;
Обратите внимание, что в цикле Для по умолчанию используется инкремент (прибавление 1). Чтобы цикл корректно отработал «вниз», платформа 1С автоматически определит направление, если начальное значение больше конечного.
При работе с очень длинными строками (десятки тысяч символов) использование конструкции Строка = Строка + Символ может сильно замедлить работу программы. Это происходит потому, что в памяти 1С при каждом сложении создается новая копия строки.
Рассмотрим правильный подход через использование массива:
Новый Массив.Добавить().СтрСоединить(ВашМассив, "").Этот метод работает в десятки раз быстрее на больших объемах данных, так как выделение памяти происходит более эффективно.
Не забывайте про вспомогательные функции, которые делают код чище:
СтрНачинаетсяС(Строка, Префикс) — заменяет проверку через Лев().СтрЗаканчиваетсяНа(Строка, Суффикс) — заменяет проверку через Прав().СтрШаблон(Шаблон, Значение1, Значение2) — позволяет удобно вставлять переменные в текст без бесконечных плюсов.Изучение этих методов позволит вам писать надежный и быстрый код для любых задач по обработке текстовой информации в системе 1С:Предприятие.