Разработка и Конфигурация · 10 мин
Как из строки сделать массив в 1С
Как преобразовать строку в массив в 1С: СтрРазделить, СтрПолучитьСтроку, разбор CSV и многострочного текста. Примеры кода, ошибки и проверка результата.
Задача превратить строку в массив возникает в 1С постоянно: разбор CSV-файлов, обработка списков значений через запятую, парсинг ответов веб-сервисов, разделение ФИО на части. Встроенный язык предлагает несколько инструментов, и выбор зависит от версии платформы и структуры исходной строки.
Основной современный способ — функция СтрРазделить(), доступная начиная с платформы 8.3.6. Она разбивает строку по разделителю и возвращает массив подстрок. Для старых конфигураций и особых случаев существуют альтернативы: СтрПолучитьСтроку(), СтрЧислоСтрок(), объект ЧтениеТекста и ручной цикл поиска подстроки.
Важно понимать ограничения каждого метода заранее: СтрРазделить не умеет учитывать кавычки в CSV, а СтрПолучитьСтроку работает только с переносами строк. Ниже разобраны рабочие примеры кода, типичные ошибки и способы проверить результат.
Функция СтрРазделить — основной способ
Функция СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>) разбивает строку по указанному разделителю и возвращает массив. Первый параметр — исходная строка, второй — символ или строка-разделитель, третий (необязательный) — признак включения пустых подстрок в результат.
Типовой пример разбора списка через запятую:
СтрокаТоваров = "Молоко,Хлеб,Сахар,Соль";
МассивТоваров = СтрРазделить(СтрокаТоваров, ",");
// МассивТоваров[0] = "Молоко", МассивТоваров[1] = "Хлеб" и т.д.
По умолчанию пустые элементы включаются в результат. Если строка содержит две запятые подряд ("А,,Б"), массив будет содержать пустую строку между элементами. Передав третьим параметром Ложь, вы отфильтруете пустые значения: СтрРазделить(Строка, ",", Ложь).
Разделителем может быть не только один символ, но и строка из нескольких символов, например "; " или "::". Функция ищет точное совпадение подстроки-разделителя, поэтому пробелы вокруг запятой нужно учитывать отдельно — либо включать в разделитель, либо потом обрезать через СокрЛП().
Массив = СтрРазделить("Яблоко; Груша; Слива", ";");
Для Каждого Элемент Из Массив Цикл
Элемент = СокрЛП(Элемент);
КонецЦикла;Разбор многострочного текста через СтрЧислоСтрок и СтрПолучитьСтроку
Если данные разделены переносами строк (например, содержимое текстового файла или многострочного поля), удобнее классическая пара функций СтрЧислоСтрок() и СтрПолучитьСтроку(). Они работают во всех версиях платформы, включая самые старые.
Пример преобразования многострочной строки в массив:
Функция СтрокуВМассивПоСтрокам(Текст)
Массив = Новый Массив;
КоличествоСтрок = СтрЧислоСтрок(Текст);
Для Номер = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = СтрПолучитьСтроку(Текст, Номер);
Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
Массив.Добавить(ТекущаяСтрока);
КонецЕсли;
КонецЦикла;
Возврат Массив;
КонецФункции
Обратите внимание: СтрПолучитьСтроку считает строками фрагменты, разделённые символом переноса (ПС, LF). Если файл пришёл с Windows-переносами CRLF, платформа обычно корректно их обрабатывает, но при ручной сборке строк через Символы.ПС проблем не возникает.
Разбор CSV и строк с кавычками
Главное ограничение СтрРазделить — она не понимает кавычки. В настоящем CSV значение "Иванов, Иван" — это одно поле, хотя внутри есть запятая. Простое разделение по запятой разорвёт такое поле на два и сместит все последующие колонки.
Если вы точно знаете, что в данных нет разделителя внутри значений (например, это список артикулов или чисел), СтрРазделить достаточно. Если же файл приходит от внешней системы и может содержать кавычки, нужен посимвольный разбор с отслеживанием состояния «внутри кавычек».
Функция РазобратьСтрокуCSV(Строка, Разделитель = ",")
Результат = Новый Массив;
Текущее = "";
ВнутриКавычек = Ложь;
Длина = СтрДлина(Строка);
Для Поз = 1 По Длина Цикл
Символ = Сред(Строка, Поз, 1);
Если Символ = """" Тогда
ВнутриКавычек = Не ВнутриКавычек;
ИначеЕсли Символ = Разделитель И Не ВнутриКавычек Тогда
Результат.Добавить(Текущее);
Текущее = "";
Иначе
Текущее = Текущее + Символ;
КонецЕсли;
КонецЦикла;
Результат.Добавить(Текущее);
Возврат Результат;
КонецФункции
Старые платформы и универсальные варианты
На платформах ниже 8.3.6 функции СтрРазделить нет. Там разбор делают вручную через цикл с СтрНайти() (или устаревшей Найти()): ищут позицию разделителя, вырезают левую часть в массив, обрезают строку и повторяют.
Функция РазделитьВручную(Знач Строка, Разделитель)
Массив = Новый Массив;
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Массив.Добавить(Лев(Строка, Позиция - 1));
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Массив.Добавить(Строка);
Возврат Массив;
КонецФункции
Ещё один вариант — хитрость с СтрЗаменить(): заменить разделитель на символ переноса строки и дальше работать через СтрЧислоСтрок/СтрПолучитьСтроку. Способ рабочий, но опасный, если в данных сам разделитель или переносы могут встречаться внутри значений.
Для сложных шаблонов (несколько разных разделителей, нерегулярные пробелы) применяют регулярные выражения через COM-объект VBScript.RegExp на Windows-сервере. Учтите, что на Linux-сервере этот объект недоступен.
Сравнение вариантов
Простые строки с одним разделителем, платформа 8.3.6+. Не работает с кавычками CSV.
Многострочный текст, любые версии платформы. Только переносы строк как разделитель.
Старые платформы, нестандартная логика, кавычки. Больше кода и выше риск ошибки.
Сложные шаблоны разделителей. Только Windows, зависимость от внешнего компонента.
Проверка результата и типичные ошибки
После разбора всегда проверяйте количество элементов массива перед обращением по индексу. Обращение к Массив[5], когда в нём три элемента, вызовет ошибку исполнения и прервёт обработку. Безопасный шаблон: сначала Если Массив.Количество() >= ОжидаемоеКоличество Тогда ....
Отладить разбор удобно через цикл с выводом в сообщения:
Для Индекс = 0 По Массив.ВГраница() Цикл
Сообщить("[" + Индекс + "] = '" + Массив[Индекс] + "'");
КонецЦикла;
Одинарные кавычки вокруг значения в выводе помогают увидеть лишние пробелы и непечатаемые символы — самую частую причину «фантомных» расхождений при сравнении значений из массива с эталонами.
Практический сценарий: загрузка списка значений в таблицу
Частая прикладная задача — пользователь вставил в поле список значений через запятую, а нужно заполнить табличную часть или таблицу значений. Порядок действий: разбить строку, обрезать пробелы, отбросить пустые элементы, проверить дубли и только потом записать.
МассивЗначений = СтрРазделить(СтрокаВвода, ",", Ложь);
Для Каждого Элемент Из МассивЗначений Цикл
Значение = СокрЛП(Элемент);
Если ПустаяСтрока(Значение) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Наименование = Значение;
КонецЦикла;
Если значения должны ссылаться на справочник (например, номенклатуру), не ищите элемент по наименованию в тот же цикл без проверки результата: при опечатке запрос вернёт пустую ссылку, и в документ уйдут «битые» данные. Проверяйте РезультатЗапроса.Пустой() и собирайте список ненайденных позиций для сообщения пользователю.
Как проверить результат
Массив.Количество() совпадает с ожидаемым числом значений
Элементов больше или меньше — проверьте разделитель и пустые подстроки
Значения без пробелов по краям и лишних кавычек
Ведущие пробелы, остатки кавычек, склеенные фрагменты
Совпадают с началом и концом исходной строки
Потерян хвост строки — вероятно, строка заканчивалась разделителем
FAQ
Чем отличается СтрРазделить от СтрПолучитьСтроку?
СтрРазделить делит строку по произвольному разделителю (запятая, точка с запятой, любая подстрока) и сразу возвращает массив. СтрПолучитьСтроку работает только с переносами строк и возвращает одну строку по номеру — массив нужно собирать в цикле вместе со СтрЧислоСтрок.
Как разбить строку по нескольким разделителям сразу?
Штатной функции с несколькими разделителями нет. Простой приём — последовательно заменить все разделители на один через СтрЗаменить (например, запятую и точку с запятой привести к одному символу), затем вызвать СтрРазделить. Для сложных случаев используют регулярные выражения через VBScript.RegExp.
Почему СтрРазделить вернула массив из одного элемента?
Разделитель не найден в строке — функция возвращает массив с исходной строкой целиком. Проверьте, какой именно символ используется в данных: часто вместо запятой там точка с запятой, табуляция или неразрывный пробел. Посмотреть реальные символы помогает вывод строки в сообщение с явными маркерами.
Как убрать пустые элементы после разбора?
Передайте третьим параметром СтрРазделить значение Ложь — пустые подстроки не попадут в массив. Если нужно отфильтровать ещё и элементы из одних пробелов, пройдите по массиву циклом и проверяйте ПустаяСтрока(СокрЛП(Элемент)).
Можно ли сразу получить массив чисел из строки?
Нет, СтрРазделить всегда возвращает строки. Преобразуйте каждый элемент через Число() внутри Попытка/Исключение, потому что нечисловое значение вызовет ошибку. Альтернатива — ОписаниеТипов с типом «Число» и метод ПривестиЗначение(), который вместо ошибки вернёт 0.
Работает ли СтрРазделить в тонком и веб-клиенте?
Да, функция доступна во всех клиентах и на сервере начиная с платформы 8.3.6. Ограничение касается только решения с RegExp через COM-объект — оно работает лишь там, где доступна COM-технология, то есть в Windows-окружении.
Что важно запомнить
Стандартный способ превратить строку в массив в 1С — СтрРазделить(Строка, Разделитель). Для многострочного текста используйте СтрЧислоСтрок и СтрПолучитьСтроку, для CSV с кавычками — ручной посимвольный разбор. Всегда проверяйте количество элементов и очищайте значения от пробелов перед использованием.