К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

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

Задача разложить строку в массив возникает в 1С постоянно: при разборе CSV-файлов, обработке адресов, парсинге ответов веб-сервисов, разделении ФИО на части. Во встроенном языке платформы для этого есть штатная функция СтрРазделить(), а также несколько альтернативных приёмов для случаев, когда её возможностей недостаточно.

Выбор способа зависит от версии платформы, структуры строки и требований к пустым элементам. Если строка содержит пустые фрагменты между разделителями (например, «Иванов;;Сидоров»), результат работы разных методов будет отличаться, и это нужно учитывать заранее, а не после того, как в отчёте появятся лишние или потерянные значения.

Ниже разобраны основные подходы: штатная функция СтрРазделить(), универсальный метод через СтрЗаменить() и СтрЧислоСтрок(), разбор в цикле, а также обратная операция — склейка массива обратно в строку.

Основной способ: функция СтрРазделить

Функция СтрРазделить() появилась в платформе 8.3.6 и стала стандартным решением задачи. Она принимает три параметра: исходную строку, разделитель и необязательный признак включения пустых строк в результат.

1c
Строка = "Иванов;Петров;Сидоров";
Массив = СтрРазделить(Строка, ";");
Для Каждого Элемент Из Массив Цикл
    Сообщить(Элемент);
КонецЦикла;

Разделителем может быть строка любой длины, а не только один символ. Например, СтрРазделить(Текст, \"||\") корректно разобьёт строку по двойной вертикальной черте. Это удобно, когда данные содержат запятые или точки с запятой внутри значений, а в качестве разделителя выбрана редкая последовательность символов.

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

Третий параметр: включать пустые элементы или нет

По умолчанию третий параметр равен Истина, и пустые фрагменты между разделителями попадают в массив. Строка \"А;;Б\" даст массив из трёх элементов: «А», «», «Б». Если передать Ложь, пустые элементы будут отброшены и массив будет содержать только «А» и «Б».

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

Сравнение вариантов

СтрРазделить()

Штатный способ для платформы 8.3.6 и новее. Быстрый, управляет пустыми элементами, разделитель любой длины.

СтрЗаменить + СтрЧислоСтрок

Универсальный приём для старых версий. Работает только с односимвольным разделителем, пустые строки сохраняются.

Разбор в цикле через СтрНайти

Полный контроль над логикой: можно обрезать пробелы, пропускать элементы по условию. Больше кода, выше риск ошибки.

Разбор строки на старых версиях платформы

Если конфигурация работает на платформе ниже 8.3.6, функции СтрРазделить() нет, и попытка её вызвать завершится ошибкой «Процедура или функция с указанным именем не определена». Для таких случаев используют классический приём с заменой разделителя на символ переноса строки.

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

Суть приёма: разделитель заменяется на перевод строки, после чего строка обрабатывается как многострочная — функции СтрЧислоСтрок() и СтрПолучитьСтроку() позволяют пройти по всем фрагментам. Ограничение метода очевидно: если в исходных данных уже есть переносы строк, они смешаются с искусственными разделителями, и результат будет искажён.

Второе ограничение — разделитель должен быть односимвольным, иначе замена СтрЗаменить() всё равно сработает, но нужно быть уверенным, что сама заменяемая последовательность не встречается внутри значений. Перед применением приёма на реальных данных стоит проверить пару типовых строк вручную.

Разбор в цикле через СтрНайти

Когда требуется полный контроль — например, обрезать пробелы у каждого элемента, пропускать значения по условию или обрабатывать вложенные разделители, — строку разбирают вручную в цикле. Метод универсален и работает на любой версии платформы.

1c
Функция РазложитьСтроку(Строка, Разделитель)
    Массив = Новый Массив;
    Позиция = СтрНайти(Строка, Разделитель);
    Пока Позиция > 0 Цикл
        Массив.Добавить(СокрЛП(Лев(Строка, Позиция - 1)));
        Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
        Позиция = СтрНайти(Строка, Разделитель);
    КонецЦикла;
    Массив.Добавить(СокрЛП(Строка));
    Возврат Массив;
КонецФункции

Ключевые моменты реализации: после каждой итерации из строки отрезается обработанная часть вместе с разделителем, а после завершения цикла в массив добавляется остаток строки — последний элемент, после которого разделителя уже нет. Забыть про этот остаток — самая частая ошибка при ручном разборе.

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

Обратная операция и обход результата

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

1c
Массив = Новый Массив;
Массив.Добавить("Иванов");
Массив.Добавить("Петров");
Результат = СтрСоединить(Массив, ", "); // "Иванов, Петров"

Обход массива после разбора выполняется либо циклом Для Каждого, когда порядок и индекс не важны, либо циклом со счётчиком Для Н = 0 По Массив.Количество() - 1 Цикл, когда нужен индекс элемента. Помните, что индексация массивов в 1С начинается с нуля, а Количество() возвращает число элементов — поэтому верхняя граница цикла всегда на единицу меньше.

Типичные ошибки при разборе строк

Типичные ошибки
01
Разбор CSV простым СтрРазделить по запятой: если значение содержит запятую внутри кавычек, колонки сместятся. Для CSV с кавычками нужен специализированный парсер.
02
Потеря последнего элемента при ручном разборе в цикле: после цикла остаток строки не добавлен в массив.
03
Игнорирование третьего параметра СтрРазделить: пустые элементы либо неожиданно появляются, либо теряются, что смещает позиции колонок.
04
Обход массива циклом от 1 до Количество(): первый элемент пропускается, а последняя итерация падает с ошибкой выхода за границу.
05
Разбор строки, полученной из файла, без учёта конца строки: последний элемент может содержать символы переноса, которые потом мешают сравнению значений.

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

Проверка результата разбора

После разбора полезно убедиться, что массив содержит ожидаемое. Минимальный набор проверок: количество элементов соответствует ожиданиям, ни один элемент не содержит «лишних» символов разделителя, пустые элементы присутствуют или отсутствуют в соответствии с логикой задачи.

Контрольные точки

Как проверить результат

Количество элементов
Норма

Совпадает с числом разделителей плюс один (при включённых пустых)

Тревожный признак

Элементов меньше или больше ожидаемого — проверьте параметр ВключатьПустые и сам разделитель

Содержимое элементов
Норма

Нет пробелов по краям и остатков разделителя

Тревожный признак

Элементы содержат пробелы, переносы строк или фрагменты разделителя

Обход массива
Норма

Цикл проходит все элементы без ошибок

Тревожный признак

Ошибка «Индекс за границами массива» — неверная верхняя граница цикла

Быстрый способ отладки — вывести результат в цикле Сообщить(\"[\" + Н + \"] = '\" + Элемент + \"'\"). Кавычки вокруг значения сразу покажут скрытые пробелы и переносы, которые иначе незаметны.

Итог

Что важно запомнить

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

Частые вопросы

Чем разложить строку в массив в 1С 8.3?

Функцией СтрРазделить(Строка, Разделитель, ВключатьПустые). Она доступна начиная с платформы 8.3.6. Если режим совместимости конфигурации установлен ниже 8.3.6, функция может быть недоступна — тогда используйте разбор через СтрЗаменить и СтрПолучитьСтроку или цикл со СтрНайти.

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

Штатной функции для нескольких разделителей нет. Приём: сначала заменить все дополнительные разделители на один основной через СтрЗаменить(), затем вызвать СтрРазделить() по нему. Например, заменить и запятую, и точку с запятой на «;», а потом разделить.

СтрРазделить вернул массив из одного элемента — почему?

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

Как убрать пробелы у элементов после разбора?

Пройти по массиву циклом и применить к каждому элементу СокрЛП(). Альтернатива — изначально разбирать строку ручным циклом со СтрНайти, добавляя в массив уже обрезанные значения.

Можно ли разложить строку в список значений, а не в массив?

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

Как разбить многострочный текст на отдельные строки?

Используйте СтрРазделить(Текст, Символы.ПС) либо классический цикл: Для Н = 1 По СтрЧислоСтрок(Текст) Цикл ... СтрПолучитьСтроку(Текст, Н). Учтите, что если текст пришёл из Windows-файла, строки могут заканчиваться комбинацией ВК+ПС, и символ возврата каретки останется в конце элемента — его убирают через СокрЛП().