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

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

1С: как преобразовать строку в массив

Как в 1С преобразовать строку в массив: СтрРазделить, разбор по разделителям, примеры кода, обработка ошибок и проверка результата.

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

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

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

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

Функция СтрРазделить() принимает три параметра: исходную строку, разделитель и необязательный признак включения пустых строк в результат. Возвращает она объект типа «Массив», элементами которого являются строки.

СтрокаТоваров = "Молоко;Хлеб;Сахар;Соль";

Массив = СтрРазделить(СтрокаТоваров, ";");

// Массив[0] = "Молоко", Массив[1] = "Хлеб" и т.д.

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

Важная особенность: если разделитель не найден в строке, функция вернёт массив из одного элемента — исходной строки целиком. Если передана пустая строка, результат будет пустым массивом (при стандартных параметрах), поэтому перед обращением к элементам по индексу всегда проверяйте Массив.Количество().

Управление пустыми элементами

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

Строка = "Иванов;;Москва";

МассивСПустыми = СтрРазделить(Строка, ";", Истина);

// 3 элемента: "Иванов", "", "Москва"

МассивБезПустых = СтрРазделить(Строка, ";", Ложь);

// 2 элемента: "Иванов", "Москва"

Ошибка в выборе этого параметра — частая причина сдвига данных: если отбросить пустые элементы при разборе строки вида «Фамилия;Отчество;Город», то при отсутствии отчества город окажется на его месте. Для структурированных данных всегда оставляйте пустые элементы включёнными.

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

Маршрут решения

Как выбрать параметры

Разбираете формат с фиксированным набором полей (CSV, строка обмена)Третий параметр = Истина, позиции полей должны сохраняться
Разбираете список, введённый пользователем через запятуюТретий параметр = Ложь, плюс СокрЛП для каждого элемента
Разделитель внутри значений возможенСтрРазделить не подойдёт — нужен парсер с учётом кавычек или экранирования

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

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

Функция СтрокаВМассивСимволов(Строка)

Результат = Новый Массив;

Для Позиция = 1 По СтрДлина(Строка) Цикл

Результат.Добавить(Сред(Строка, Позиция, 1));

КонецЦикла;

Возврат Результат;

КонецФункции

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

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

Строка = "Яблоки, Груши;Сливы,Персики";

Строка = СтрЗаменить(Строка, ",", ";");

Массив = СтрРазделить(Строка, ";", Ложь);

Ручной разбор для старых версий платформы

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

Функция РазделитьСтроку(Строка, Разделитель)

Результат = Новый Массив;

Позиция = Найти(Строка, Разделитель);

Пока Позиция > 0 Цикл

Результат.Добавить(Лев(Строка, Позиция - 1));

Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));

Позиция = Найти(Строка, Разделитель);

КонецЦикла;

Результат.Добавить(Строка); // последний фрагмент

Возврат Результат;

КонецФункции

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

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

Порядок действий при разборе строки
  1. 1
    Определите точный разделитель и проверьте, не встречается ли он внутри значений
  2. 2
    Решите, нужны ли пустые элементы (фиксированный формат — да, пользовательский ввод — обычно нет)
  3. 3
    Вызовите СтрРазделить с выбранными параметрами
  4. 4
    Проверьте Массив.Количество() перед обращением к элементам по индексу
  5. 5
    При необходимости обработайте элементы: СокрЛП, преобразование типов

Обратная задача и смежные приёмы

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

Массив = СтрРазделить("а;б;в", ";");

Строка = СтрСоединить(Массив, ", "); // "а, б, в"

Если строка представляет собой многострочный текст, разбить её на строки можно через объект ТекстовыйДокумент: загрузить текст методом УстановитьТекст и перебрать строки через ПолучитьСтроку(). Это надёжнее, чем разбор по символу переноса, поскольку переносы бывают разных типов.

Для разбора значений, разделённых запятыми, в управляемых формах также применяют СписокЗначений с его методом загрузки, однако для простых задач массив от СтрРазделить легче и нагляднее.

Сравнение способов

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

Штатный и самый быстрый способ; ограничение — один разделитель за вызов и нет поддержки кавычек

СтрЗаменить + СтрРазделить

Несколько разделителей; требует уверенности, что замена не исказит данные

Ручной цикл с Найти()

Полный контроль и совместимость со старыми версиями; больше кода и риск ошибок

ТекстовыйДокумент

Разбор многострочного текста; избыточен для простых строк

Типичные ошибки и проверка результата

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

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

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

Типичные ошибки
01
Обращение к Массив[2] без проверки Количество() — ошибка исполнения на неполных данных
02
Отброшенные пустые элементы при фиксированном формате — сдвиг значений между полями
03
Отсутствие СокрЛП — значения с пробелами не находятся при поиске и сравнении
04
Разбор CSV с кавычками через СтрРазделить — значения с запятыми внутри разрезаются
05
Игнорирование того, что результат всегда строки — числа сравниваются как текст

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

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

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

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

Совпадает с ожидаемым числом полей формата

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

Меньше ожидаемого — данные неполные или разделитель неверен

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

Нет лишних пробелов, значения на своих позициях

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

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

Тип элементов
Норма

Строки, при необходимости преобразованы в числа или даты

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

Числа сравниваются как строки и дают неверный порядок

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

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

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

Что вернёт СтрРазделить, если разделителя нет в строке?

Массив из одного элемента — исходной строки без изменений. Это нормальное поведение, его нужно учитывать: если вы ожидали несколько полей, а получили одно, скорее всего, разделитель указан неверно или данные пришли в другом формате.

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

Надёжнее всего загрузить текст в объект ТекстовыйДокумент и перебрать строки методом ПолучитьСтроку(). Разбор через СтрРазделить по символу переноса возможен, но разные источники используют разные комбинации символов конца строки, что приводит к лишним пустым элементам или остаточным символам.

Почему после разбора числа сравниваются неправильно?

Все элементы результата — строки, поэтому «10» при строковом сравнении окажется меньше «2». Перед числовыми операциями преобразуйте элементы функцией Число(), предварительно убедившись, что строка содержит корректное числовое представление.

Как обработать CSV, где значения содержат запятые внутри кавычек?

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

Есть ли ограничение на длину строки или размер массива?

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

Итог

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

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