Разработка и Конфигурация · 9 мин
Как разделить строку на массив в 1С
Как разделить строку на массив в 1С: функции СтрРазделить, СтрПолучитьСтроку, разбор CSV и многострочного текста, примеры кода, ошибки и проверка результата.
Задача разбить строку на части встречается в 1С постоянно: разбор CSV-файлов, обработка списка значений, введённых пользователем через запятую, парсинг ответов веб-сервисов, разделение ФИО на фамилию, имя и отчество. Во встроенном языке 1С для этого есть несколько инструментов, и выбор зависит от версии платформы и структуры исходных данных.
Основной современный способ — функция СтрРазделить(), которая возвращает массив подстрок по указанному разделителю. Для старых версий платформы, где этой функции нет, используются СтрПолучитьСтроку(), СтрЧислоСтрок() или самописный цикл с поиском позиции разделителя. Ниже разобраны все варианты с готовым кодом, ограничениями и типичными ошибками.
Функция СтрРазделить: основной способ
Функция СтрРазделить() доступна в платформе 1С:Предприятие начиная с версии 8.3.6. Она принимает исходную строку, разделитель и необязательный параметр, определяющий, включать ли пустые строки в результат. Результат — массив строк, готовый к обходу в цикле.
СтрокаТоваров = "Хлеб;Молоко;Сахар;Соль";
МассивТоваров = СтрРазделить(СтрокаТоваров, ";");
Для Каждого Элемент Из МассивТоваров Цикл
Сообщить(Элемент);
КонецЦикла;
Третий параметр функции управляет обработкой пустых частей. По умолчанию пустые подстроки включаются в результат: строка "А;;В" при разделителе «;» даст массив из трёх элементов, где второй — пустая строка. Если передать Ложь третьим параметром, пустые элементы будут пропущены, и массив будет содержать только «А» и «В».
МассивЧастей = СтрРазделить("А;;В;", ";", Ложь); // {"А", "В"} — пустые пропущеныРазделителем может быть строка любой длины, а не только один символ. Например, СтрРазделить(Текст, " || ") корректно разобьёт строку по составному разделителю. Это удобно при разборе логов и выгрузок, где поля отделены несколькими символами.
Разбор многострочного текста через СтрПолучитьСтроку
Когда данные представляют собой текст из нескольких строк (содержимое файла, многострочное поле ввода), удобнее использовать пару функций СтрЧислоСтрок() и СтрПолучитьСтроку(). Первая возвращает количество строк в тексте, вторая — строку по её номеру, начиная с единицы.
Текст = "Первая строка
|Вторая строка
|Третья строка";
КоличествоСтрок = СтрЧислоСтрок(Текст);
МассивСтрок = Новый Массив;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
МассивСтрок.Добавить(СтрПолучитьСтроку(Текст, НомерСтроки));
КонецЦикла;
Этот подход работает во всех версиях платформы и не требует знания символа переноса: 1С сама распознаёт переводы строк независимо от их типа (CR, LF или CRLF). Это важное преимущество перед СтрРазделить() с разделителем Символы.ПС, где смешанные переносы строк в файле могут дать лишние пустые элементы.
Разделение строки в старых версиях платформы
Если конфигурация работает на платформе ниже 8.3.6 или с отключенной совместимостью с новыми функциями, СтрРазделить() недоступна. В этом случае строку разбирают вручную: в цикле ищут позицию разделителя функцией Найти(), вырезают часть до него через Лев() и укорачивают исходную строку.
Функция РазделитьСтроку(Знач Строка, Разделитель)
Массив = Новый Массив;
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Массив.Добавить(Лев(Строка, Позиция - 1));
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Массив.Добавить(Строка); // последняя часть
Возврат Массив;
КонецФункции
Обратите внимание на последнюю строку перед возвратом: после завершения цикла в переменной остаётся хвост строки после последнего разделителя, и его обязательно нужно добавить в массив. Пропуск этого шага — самая частая ошибка в самописных функциях разбора.
Разбор CSV и строк с кавычками
Простое разделение по запятой ломается, если внутри полей CSV-файла есть запятые, заключённые в кавычки: "Иванов, Иван";35;"Москва". Функция СтрРазделить() не понимает кавычек и разрежет такое поле на две части. Для корректного разбора нужен посимвольный анализ с отслеживанием состояния «внутри кавычек».
Функция РазобратьСтрокуCSV(Строка)
Результат = Новый Массив;
ТекущееПоле = "";
ВКавычках = Ложь;
Для Поз = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Поз, 1);
Если Символ = """" Тогда
ВКавычках = Не ВКавычках;
ИначеЕсли Символ = ";" И Не ВКавычках Тогда
Результат.Добавить(ТекущееПоле);
ТекущееПоле = "";
Иначе
ТекущееПоле = ТекущееПоле + Символ;
КонецЕсли;
КонецЦикла;
Результат.Добавить(ТекущееПоле);
Возврат Результат;
КонецФункции
Перед разбором CSV убедитесь, какой разделитель реально используется в файле: в русской локали Excel по умолчанию сохраняет CSV с точкой с запятой, а не с запятой. Проверить это можно, открыв файл в текстовом редакторе и посмотрев первую строку.
Практические сценарии и выбор метода
Для разбиения ФИО на части достаточно СтрРазделить(ФИО, " "), но учитывайте, что двойные фамилии или лишние пробелы дадут больше трёх элементов. Перед использованием результата проверяйте Массив.Количество() и обрабатывайте нестандартные случаи.
Для списка значений, введённого пользователем через запятую, полезно после разделения обрезать пробелы у каждого элемента функцией СокрЛП() и отбросить пустые значения. Иначе строка "один, два , три" даст элементы с пробелами, которые потом не сравнятся с данными справочников.
Как выбрать действие
Проверка результата и типичные ошибки
После разделения всегда проверяйте результат перед использованием: количество элементов массива, отсутствие пустых строк там, где они не ожидаются, и корректность первого и последнего элементов. Ошибки разбора чаще всего проявляются именно на краях строки — когда разделитель стоит в начале или в конце.
Как проверить результат
Совпадает с ожидаемым числом частей
Элементов больше или меньше — проверьте разделитель и пустые части
Содержат ожидаемые значения без обрезков
Пустая строка или обрезанный текст — разделитель на краю строки
Сравнение после СокрЛП проходит
Не равны из-за пробелов или невидимых символов
Производительность при больших объёмах
При обработке файлов с десятками тысяч строк избегайте конкатенации строк в цикле (Текст = Текст + НоваяЧасть) — в 1С это создаёт новую строку на каждой итерации и сильно замедляет работу. Для накопления результата используйте массив с последующей СтрСоединить() или объект ЗаписьТекста.
Сама функция СтрРазделить() работает быстро даже на длинных строках, поэтому предпочитайте её посимвольному разбору везде, где структура данных это позволяет. Посимвольный анализ оправдан только для CSV с кавычками и экранированными символами.
Что важно запомнить
Основной инструмент — СтрРазделить(Строка, Разделитель, ВключатьПустые). Для многострочного текста — СтрЧислоСтрок и СтрПолучитьСтроку. Для старых платформ — цикл с Найти. Для CSV с кавычками — посимвольный разбор. Всегда проверяйте количество элементов и обрезайте пробелы.
Частые вопросы
Как разделить строку по нескольким разным разделителям сразу?
СтрРазделить принимает только один разделитель. Обходной путь: сначала заменить все альтернативные разделители на один через СтрЗаменить, затем разделить по нему. Например, заменить запятые и точки с запятой на «;» и вызвать СтрРазделить с этим разделителем.
Как превратить массив обратно в строку?
Используйте функцию СтрСоединить(Массив, Разделитель) — она выполняет обратную операцию. В старых версиях платформы вместо неё применяется цикл с накоплением строки или объект ЗаписьТекста.
Почему СтрРазделить возвращает пустые элементы?
Это происходит, когда два разделителя идут подряд или разделитель стоит в начале либо конце строки. Передайте Ложь третьим параметром функции, чтобы пустые элементы не попадали в результат, либо предварительно очистите строку от дублирующихся разделителей.
Как разбить строку на символы по одному?
СтрРазделить с пустым разделителем для этого не предназначена. Используйте цикл от 1 до СтрДлина(Строка) и извлекайте каждый символ функцией Сред(Строка, Позиция, 1), добавляя его в массив.
Можно ли разделить строку на части фиксированной длины?
Готовой функции нет, но задача решается циклом: пока строка не пуста, берите Лев(Строка, N) в массив и укорачивайте строку через Сред(Строка, N + 1). Такой приём используется при разборе файлов с фиксированной шириной полей.
Чем отличается СтрРазделить от СтрПолучитьСтроку?
СтрРазделить делит строку по произвольному разделителю и возвращает массив. СтрПолучитьСтроку работает только с переносами строк и возвращает одну строку по номеру. Для многострочного текста вторая надёжнее, так как корректно обрабатывает разные типы переносов.