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

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

Как разбить строку в 1С: функции и примеры

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

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

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

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

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

Функция возвращает массив строк. Если разделитель не найден, массив будет содержать один элемент — исходную строку целиком. Это важно учитывать при проверке результата: отсутствие разделителя не является ошибкой.

СтрокаФИО = "Иванов Петр Сергеевич";

Части = СтрРазделить(СтрокаФИО, " ");

// Части[0] = "Иванов", Части[1] = "Петр", Части[2] = "Сергеевич"

СтрокаCSV = "001;Товар;;150,50";

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

// Поля[2] = "" — пустое поле сохранено, т.к. ВключатьПустые по умолчанию Истина

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

Части = СтрРазделить("слово1   слово2    слово3", " ", Ложь);

// Части.Количество() = 3, пустые элементы отброшены

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

Параметр «Разделитель» в СтрРазделить — это набор символов, а не одна строка-разделитель. Поэтому, чтобы разбить строку, где части отделены запятой, точкой с запятой или пробелом, достаточно перечислить все символы:

Части = СтрРазделить("яблоко;груша,слива персик", ";, ", Ложь);

// Части: "яблоко", "груша", "слива", "персик"

Если разделителем является многосимвольная подстрока (например, «::» или « -- »), СтрРазделить не подходит: она разобьёт строку по каждому символу из набора отдельно. В этом случае используйте цикл с СтрНайти():

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

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

ДлинаРазделителя = СтрДлина(Разделитель);

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

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

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

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

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

КонецЦикла;

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

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

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

Разбиение многострочного текста на строки

Для разбора текста, содержащего переводы строк (многострочные поля, содержимое текстовых файлов, ответы HTTP-запросов), разделителем служит символ переноса Символы.ПС. Поскольку текст из внешних источников часто содержит комбинацию CR+LF (возврат каретки и перевод строки), надёжнее указать оба символа:

Текст = "Строка 1

|Строка 2

|Строка 3";

Строки = СтрРазделить(Текст, Символы.ПС + Символы.ВК, Ложь);

Для Каждого Стр Из Строки Цикл

// обработка отдельной строки

КонецЦикла;

Альтернатива — обход строк через СтрЧислоСтрок() и СтрПолучитьСтроку(). Этот способ удобен, когда нужен номер строки или когда текст очень большой и создавать массив всех строк нежелательно:

Для Номер = 1 По СтрЧислоСтрок(Текст) Цикл

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

// обработка

КонецЦикла;

Учтите, что СтрПолучитьСтроку разделяет текст только по символу ПС; комбинация ВК+ПС обрабатывается корректно, но одиночный ВК внутри текста строкой не считается.

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

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

Части = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(

"001;Товар;150", ";");

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

Если БСП нет, а платформа старая, остаётся универсальный цикл со СтрНайти, приведённый выше в разделе про многосимвольный разделитель, — с длиной разделителя 1 он подходит и для одиночных символов.

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

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

Основной способ на платформе 8.3.6+. Быстро, коротко, но разделитель — только набор одиночных символов.

Цикл со СтрНайти и Сред

Подходит для многосимвольного разделителя и старых платформ. Больше кода, требуется аккуратность с границами.

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

Для многострочного текста, когда нужны номера строк или экономия памяти на больших текстах.

БСП: РазложитьСтрокуВМассивПодстрок

Универсально для конфигураций на БСП, работает на любой поддерживаемой платформе; требует наличия библиотеки.

Практические сценарии: ФИО, CSV, список в строке

Разбор ФИО на фамилию, имя и отчество

Строка с ФИО может содержать лишние пробелы, двойные фамилии и отсутствующее отчество. Безопасный вариант — разбить с отбрасыванием пустых элементов и проверить количество частей:

Части = СтрРазделить(СокрЛП(СтрокаФИО), " ", Ложь);

Если Части.Количество() >= 2 Тогда

Фамилия = Части[0];

Имя = Части[1];

Отчество = ?(Части.Количество() > 2, Части[2], "");

Иначе

// ФИО неполное — зафиксировать ошибку данных

КонецЕсли;

Разбор строки CSV

Простой CSV без кавычек разбирается напрямую. Но если значения могут содержать разделитель внутри кавычек («Наименование; "Товар, импортный"; Цена»), СтрРазделить разорвёт значение внутри кавычек. В этом случае нужен посимвольный разбор с отслеживанием состояния «внутри кавычек» либо использование форматированного документа / готовых процедур обмена.

Разбор списка значений из настроек

Списки кодов или идентификаторов, хранящиеся одной строкой через запятую, удобно разбивать с последующей очисткой каждого элемента от пробелов:

Коды = СтрРазделить(СтрокаНастройки, ",", Ложь);

Для Н = 0 По Коды.ВГраница() Цикл

Коды[Н] = СокрЛП(Коды[Н]);

КонецЦикла;

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

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

Главная ошибка при разбиении — обращение к элементу массива без проверки его существования. Если входная строка пришла извне (файл, пользователь, обмен), нет гарантии, что разделителей столько, сколько ожидается. Всегда проверяйте Части.Количество() или используйте ВГраница() перед доступом по индексу — иначе получите ошибку «Индекс находится за границами массива».

Вторая частая проблема — непечатаемые и похожие символы. Неразрывный пробел (Символ(160)) визуально неотличим от обычного пробела, но СтрРазделить(Строка, " ") по нему не разобьёт. Аналогично табуляция и разные виды дефисов. Если строка «не разбивается», проверьте коды символов-разделителей через КодСимвола().

Типичные ошибки
01
Обращение к Части[1] без проверки количества элементов — ошибка «Индекс за границами массива» на неполных данных.
02
Передача многосимвольного разделителя в СтрРазделить — строка разбивается по каждому символу отдельно, результат искажён.
03
Игнорирование неразрывного пробела (Символ(160)) — строка визуально содержит пробелы, но не разбивается.
04
Потеря пустых полей при ВключатьПустые = Ложь — смещение колонок при разборе CSV с пропущенными значениями.
05
Разбор CSV с кавычками простым СтрРазделить — значения с разделителем внутри кавычек разрываются.
Контрольные точки

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

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

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

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

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

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

Нет лишних пробелов и пустых значений там, где их быть не должно

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

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

Работа на пустой входной строке
Норма

Код отрабатывает без исключения

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

Ошибка при пустой строке или строке без разделителей

Для отладки удобно вывести результат в цикле: Для Каждого Элемент Из Части Цикл Сообщить("[" + Элемент + "]"); КонецЦикла; — квадратные скобки визуально обнажат пробелы и пустые элементы.

Итог

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

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

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

Как разбить строку на символы (по одной букве)?

Функция СтрРазделить с пустым разделителем для этого не предназначена. Используйте цикл: Для Н = 1 По СтрДлина(Строка) Цикл Символ = Сред(Строка, Н, 1); КонецЦикла; — так вы получаете каждый символ по позиции.

СтрРазделить возвращает один элемент, хотя разделитель в строке есть. Почему?

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

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

В СтрРазделить это поведение по умолчанию: третий параметр ВключатьПустые равен Истина. Не передавайте Ложь, если позиция поля важна — например, при разборе CSV пропущенное значение должно занимать свою колонку, иначе поля сместятся.

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

Да, функция доступна на сервере, в толстом, тонком и веб-клиенте начиная с платформы 8.3.6. Ограничений по контексту выполнения у неё нет, она не обращается к базе данных.

Как собрать строку обратно из массива?

Используйте функцию СтрСоединить(Массив, Разделитель) — она выполняет обратную операцию и склеивает элементы массива в одну строку с указанным разделителем. В БСП для старых версий есть аналог в модуле СтроковыеФункцииКлиентСервер.

Что быстрее: СтрРазделить или цикл со СтрНайти?

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