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

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

Как из строки сделать массив в 1С

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

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

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

Важно понимать ограничения каждого метода заранее: СтрРазделить не умеет учитывать кавычки в CSV, а СтрПолучитьСтроку работает только с переносами строк. Ниже разобраны рабочие примеры кода, типичные ошибки и способы проверить результат.

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

Функция СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>) разбивает строку по указанному разделителю и возвращает массив. Первый параметр — исходная строка, второй — символ или строка-разделитель, третий (необязательный) — признак включения пустых подстрок в результат.

Типовой пример разбора списка через запятую:

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

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

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

По умолчанию пустые элементы включаются в результат. Если строка содержит две запятые подряд ("А,,Б"), массив будет содержать пустую строку между элементами. Передав третьим параметром Ложь, вы отфильтруете пустые значения: СтрРазделить(Строка, ",", Ложь).

Разделителем может быть не только один символ, но и строка из нескольких символов, например "; " или "::". Функция ищет точное совпадение подстроки-разделителя, поэтому пробелы вокруг запятой нужно учитывать отдельно — либо включать в разделитель, либо потом обрезать через СокрЛП().

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

Разбор многострочного текста через СтрЧислоСтрок и СтрПолучитьСтроку

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

Пример преобразования многострочной строки в массив:

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

Массив = Новый Массив;

КоличествоСтрок = СтрЧислоСтрок(Текст);

Для Номер = 1 По КоличествоСтрок Цикл

ТекущаяСтрока = СтрПолучитьСтроку(Текст, Номер);

Если Не ПустаяСтрока(ТекущаяСтрока) Тогда

Массив.Добавить(ТекущаяСтрока);

КонецЕсли;

КонецЦикла;

Возврат Массив;

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

Обратите внимание: СтрПолучитьСтроку считает строками фрагменты, разделённые символом переноса (ПС, LF). Если файл пришёл с Windows-переносами CRLF, платформа обычно корректно их обрабатывает, но при ручной сборке строк через Символы.ПС проблем не возникает.

Разбор CSV и строк с кавычками

Главное ограничение СтрРазделить — она не понимает кавычки. В настоящем CSV значение "Иванов, Иван" — это одно поле, хотя внутри есть запятая. Простое разделение по запятой разорвёт такое поле на два и сместит все последующие колонки.

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

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

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

Текущее = "";

ВнутриКавычек = Ложь;

Длина = СтрДлина(Строка);

Для Поз = 1 По Длина Цикл

Символ = Сред(Строка, Поз, 1);

Если Символ = """" Тогда

ВнутриКавычек = Не ВнутриКавычек;

ИначеЕсли Символ = Разделитель И Не ВнутриКавычек Тогда

Результат.Добавить(Текущее);

Текущее = "";

Иначе

Текущее = Текущее + Символ;

КонецЕсли;

КонецЦикла;

Результат.Добавить(Текущее);

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

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

Старые платформы и универсальные варианты

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

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

Массив = Новый Массив;

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

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

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

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

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

КонецЦикла;

Массив.Добавить(Строка);

Возврат Массив;

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

Ещё один вариант — хитрость с СтрЗаменить(): заменить разделитель на символ переноса строки и дальше работать через СтрЧислоСтрок/СтрПолучитьСтроку. Способ рабочий, но опасный, если в данных сам разделитель или переносы могут встречаться внутри значений.

Для сложных шаблонов (несколько разных разделителей, нерегулярные пробелы) применяют регулярные выражения через COM-объект VBScript.RegExp на Windows-сервере. Учтите, что на Linux-сервере этот объект недоступен.

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

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

Простые строки с одним разделителем, платформа 8.3.6+. Не работает с кавычками CSV.

СтрЧислоСтрок + СтрПолучитьСтроку

Многострочный текст, любые версии платформы. Только переносы строк как разделитель.

Ручной цикл с Найти/Сред

Старые платформы, нестандартная логика, кавычки. Больше кода и выше риск ошибки.

RegExp через COM

Сложные шаблоны разделителей. Только Windows, зависимость от внешнего компонента.

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

После разбора всегда проверяйте количество элементов массива перед обращением по индексу. Обращение к Массив[5], когда в нём три элемента, вызовет ошибку исполнения и прервёт обработку. Безопасный шаблон: сначала Если Массив.Количество() >= ОжидаемоеКоличество Тогда ....

Отладить разбор удобно через цикл с выводом в сообщения:

Для Индекс = 0 По Массив.ВГраница() Цикл

Сообщить("[" + Индекс + "] = '" + Массив[Индекс] + "'");

КонецЦикла;

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

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

Практический сценарий: загрузка списка значений в таблицу

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

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

Для Каждого Элемент Из МассивЗначений Цикл

Значение = СокрЛП(Элемент);

Если ПустаяСтрока(Значение) Тогда

Продолжить;

КонецЕсли;

НоваяСтрока = ТаблицаЗначений.Добавить();

НоваяСтрока.Наименование = Значение;

КонецЦикла;

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

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

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

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

Массив.Количество() совпадает с ожидаемым числом значений

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

Элементов больше или меньше — проверьте разделитель и пустые подстроки

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

Значения без пробелов по краям и лишних кавычек

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

Ведущие пробелы, остатки кавычек, склеенные фрагменты

Первый и последний элемент
Норма

Совпадают с началом и концом исходной строки

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

Потерян хвост строки — вероятно, строка заканчивалась разделителем

FAQ

Чем отличается СтрРазделить от СтрПолучитьСтроку?

СтрРазделить делит строку по произвольному разделителю (запятая, точка с запятой, любая подстрока) и сразу возвращает массив. СтрПолучитьСтроку работает только с переносами строк и возвращает одну строку по номеру — массив нужно собирать в цикле вместе со СтрЧислоСтрок.

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

Штатной функции с несколькими разделителями нет. Простой приём — последовательно заменить все разделители на один через СтрЗаменить (например, запятую и точку с запятой привести к одному символу), затем вызвать СтрРазделить. Для сложных случаев используют регулярные выражения через VBScript.RegExp.

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

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

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

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

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

Нет, СтрРазделить всегда возвращает строки. Преобразуйте каждый элемент через Число() внутри Попытка/Исключение, потому что нечисловое значение вызовет ошибку. Альтернатива — ОписаниеТипов с типом «Число» и метод ПривестиЗначение(), который вместо ошибки вернёт 0.

Работает ли СтрРазделить в тонком и веб-клиенте?

Да, функция доступна во всех клиентах и на сервере начиная с платформы 8.3.6. Ограничение касается только решения с RegExp через COM-объект — оно работает лишь там, где доступна COM-технология, то есть в Windows-окружении.

Итог

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

Стандартный способ превратить строку в массив в 1С — СтрРазделить(Строка, Разделитель). Для многострочного текста используйте СтрЧислоСтрок и СтрПолучитьСтроку, для CSV с кавычками — ручной посимвольный разбор. Всегда проверяйте количество элементов и очищайте значения от пробелов перед использованием.