Как в 1С преобразовать строку с разделителями в массив значений?

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача, аналогичная функции explode в PHP или split в JavaScript: необходимо взять текстовую строку, в которой данные разделены определенным символом (например, запятой, точкой с запятой или решеткой), и превратить ее в массив для дальнейшей обработки. Рассмотрим подробнее, как это реализовать, исходя из возможностей различных версий платформы и типовых конфигураций.

Метод 1: Использование встроенной функции СтрРазделить

Если вы работаете на платформе версии 8.3.6 или выше, этот способ является наиболее правильным и производительным. Разберем по шагам, как работает встроенная функция СтрРазделить. Проанализируем пример кода:


ИсходнаяСтрока = "Товар#ЦенаПокупки#ЦенаПродажи";
МассивРезультат = СтрРазделить(ИсходнаяСтрока, "#");

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

  1. Источник: Строка, которую нужно разбить.
  2. Разделители: Строка, содержащая символы-разделители. Внимание: Если вы укажете в этом параметре несколько символов, например ",;", то платформа разобьет строку по любому из этих символов (и по запятой, и по точке с запятой).
  3. ВключатьПустые: Булево значение (по умолчанию Истина). Если установить Ложь, то пустые подстроки (например, если два разделителя идут подряд) не попадут в итоговый массив.

Посмотрим на более сложный пример с удалением пустых строк:


СписокДанных = "Иванов,,Петров, ,Сидоров";
// Разделяем по запятой, игнорируя пустые элементы
МассивСотрудников = СтрРазделить(СписокДанных, ",", Ложь);
// В результате получим массив: "Иванов", "Петров", " " (пробел не считается пустой строкой)

Метод 2: Использование функций Библиотеки Стандартных Подсистем (БСП)

Если ваша конфигурация построена на базе БСП (что верно для большинства современных типовых решений), мы можем воспользоваться готовыми методами из общего модуля. Чаще всего это модуль СтроковыеФункцииКлиентСервер.

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


Разделитель = ";";
СтрокаТекста = " Склад 1 ; Склад 2 ; Склад 3 ";
МассивСкладов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаТекста, Разделитель);

Этот метод гарантирует стабильную работу в рамках экосистемы 1С и избавляет от необходимости писать собственные велосипеды в каждой новой обработке.

Метод 3: Универсальный алгоритм для старых версий (до 8.3.6)

Иногда нам приходится работать с "антикварными" конфигурациями на обычных формах (например, старые редакции УПП или УТ 10.3), где встроенной функции еще нет. В этом случае разработаем собственную функцию. Рассмотрим наиболее эффективный алгоритм, использующий функции Найти, Лев и Сред.


Функция РазложитьСтрокуВМассив(Знач Стр, Разделитель = ",") Экспорт
    Результат = Новый Массив;
    ДлинаРазделителя = СтрДлина(Разделитель);
    
    Пока Истина Цикл
        Поз = Найти(Стр, Разделитель);
        Если Поз = 0 Тогда
            Результат.Добавить(Стр);
            Возврат Результат;
        КонецЕсли;
        
        Подстрока = Лев(Стр, Поз - 1);
        Результат.Добавить(Подстрока);
        
        Стр = Сред(Стр, Поз + ДлинаРазделителя);
    КонецЦикла;
КонецФункции

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

Метод 4: Преобразование через СтрЗаменить (Осторожно!)

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


ТекстМногострочный = СтрЗаменить(ИсходнаяСтрока, "#", Символы.ПС);
Для н = 1 По СтрЧислоСтрок(ТекстМногострочный) Цикл
    ТекЗначение = СтрПолучитьСтроку(ТекстМногострочный, н);
    Массив.Добавить(СокрЛП(ТекЗначение));
КонецЦикла;

Критически важный момент: Этот метод крайне не рекомендуется использовать для больших объемов данных! Разберем почему: функция СтрПолучитьСтроку при каждом вызове в цикле начинает поиск нужной строки с самого начала текста. Если у вас в строке 10 000 элементов, скорость работы будет падать в геометрической прогрессии. Используйте этот метод только для коротких строк (например, 5-10 элементов).

Метод 5: Использование объекта ТекстовыйДокумент

Для случаев, когда нужно не просто разбить строку, но и произвести какую-то сложную фильтрацию или если данные приходят в специфической кодировке, можно использовать объект ТекстовыйДокумент. Посмотрим, как это выглядит:


ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(СтрЗаменить(ИсходнаяСтрока, "#", Символы.ПС));
Для НомерСтроки = 1 По ТекстДок.КоличествоСтрок() Цикл
    Значение = ТекстДок.ПолучитьСтроку(НомерСтроки);
    Если Не ПустаяСтрока(Значение) Тогда
        Результат.Добавить(СокрЛП(Значение));
    КонецЕсли;
КонецЦикла;

Этот способ чуть быстрее, чем предыдущий (через СтрПолучитьСтроку), но все равно уступает специализированной функции СтрРазделить.

Обратная операция: СтрСоединить

Выясним, как собрать массив обратно в строку. В паре к СтрРазделить платформа предлагает функцию СтрСоединить. Это гораздо эффективнее, чем простое сложение строк в цикле через +.


МассивЦен = Новый Массив;
МассивЦен.Добавить("100");
МассивЦен.Добавить("250");
МассивЦен.Добавить("500");

// Соединяем элементы массива в строку через разделитель ";"
ИтоговаяСтрока = СтрСоединить(МассивЦен, ";");
// Результат: "100;250;500"

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

Подведем итоги

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

Мы рассмотрели все основные способы преобразования строки в массив. Выбирайте тот, который лучше всего подходит под ваши условия разработки и версию платформы.

← На главную