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

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

Как разбить строку на слова в 1С

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

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

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

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

Разбиение через СтрРазделить — основной способ

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

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

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

Для Каждого Слово Из МассивСлов Цикл

Сообщить(Слово);

КонецЦикла;

Третий параметр Ложь отбрасывает пустые элементы. Это критично, когда в строке встречаются двойные пробелы: без него между словами появятся пустые элементы массива, и логика обработки сломается. Если пустые значения нужны (например, при разборе CSV, где пустая колонка значима), параметр опускают или ставят Истина.

Разделителем может быть не один символ, а целая строка. Важная особенность: если передать " ;,", то каждый символ (пробел, точка с запятой, запятая) трактуется как отдельный разделитель, а не последовательность целиком. Это удобно для разбора текста со смешанной пунктуацией.

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

Разбор ФИО и фраз с несколькими пробелами

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

ФИО = СокрЛП(ФИО);

Пока СтрНайти(ФИО, " ") > 0 Цикл

ФИО = СтрЗаменить(ФИО, " ", " ");

КонецЦикла;

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

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

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

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

Отчество = Части[2];

КонецЕсли;

Обратите внимание на проверку количества элементов перед обращением по индексу. Если в данных встретится строка «Иванов Петр» без отчества, обращение к Части[2] вызовет ошибку «Индекс находится за границами массива». Такие проверки обязательны при обработке данных, введённых пользователями или загруженных из внешних источников.

Разбиение на старых платформах без СтрРазделить

На платформах до 8.3.6 штатной функции разбиения нет. Классический обходной приём — заменить разделитель на уникальную комбинацию символов и последовательно отрезать фрагменты через СтрНайти() и Лев()/Сред().

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

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

Строка = Строка + Разделитель;

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

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

Слово = Лев(Строка, Позиция - 1);

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

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

КонецЕсли;

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

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

КонецЦикла;

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

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

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

Посимвольный разбор для сложных случаев

Когда слова отделяются любыми небуквенными символами или внутри текста есть защищённые фрагменты (например, фразы в кавычках, которые разбивать нельзя), применяют посимвольный анализ. Идея проста: идём по строке, накапливаем символы в буфер, а при встрече разделителя сбрасываем буфер в массив.

Функция РазбитьНаСлова(Строка)

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

ТекущееСлово = "";

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

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

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

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

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

ТекущееСлово = "";

КонецЕсли;

Иначе

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

КонецЕсли;

КонецЦикла;

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

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

КонецЕсли;

Возврат Слова;

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

Распространённая ошибка в этом алгоритме — забыть добавить последнее слово после цикла: если строка не заканчивается разделителем, финальный фрагмент теряется. В примере выше это обработано отдельным блоком после цикла.

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

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

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

СпособКогда подходитОграничения
СтрРазделить()Платформа 8.3.6+, одиночные символы-разделителиНет многосимвольного разделителя как единой строки
Цикл со СтрНайти()Старые платформы, многосимвольный разделительБольше кода, нужна аккуратность с границами
Посимвольный разборСмешанные разделители, кавычки, особая логикаМедленнее на больших строках
ТекстовыйДокумент с разделителем строкРазделитель — перевод строкиТолько построчное разбиение

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

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

Самый короткий код; требует платформу 8.3.6 или новее

СтрНайти + Сред

Универсальный, работает везде; поддерживает многосимвольные разделители

Посимвольный цикл

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

Проверка результата и отладка

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

Для Инд = 0 По МассивСлов.Количество() - 1 Цикл

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

КонецЦикла;

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

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

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

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

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

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

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

Значения элементов
Норма

Слова без пробелов по краям

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

Лидирующие/хвостовые пробелы — добавьте СокрЛП

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

Содержат осмысленные слова

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

Пустые строки — включён параметр пустых значений

Часто задаваемые вопросы

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

В СтрРазделить передайте все символы-разделители одной строкой без пробелов между ними, например СтрРазделить(Текст, " ,;.", Ложь). Каждый символ будет работать как самостоятельный разделитель. Для многосимвольных разделителей используйте цикл со СтрНайти.

Почему в массиве появляются пустые элементы?

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

Как разбить строку, если слова разделены табуляцией?

Укажите символ табуляции как разделитель: СтрРазделить(Строка, Символы.Таб, Ложь). Либо предварительно замените табуляции на пробелы через СтрЗаменить и разбивайте по пробелу.

Что делать со строками из Excel, где разбиение не работает?

Проверьте наличие неразрывных пробелов (код символа 160) — визуально они неотличимы от обычных. Замените их: СтрЗаменить(Строка, Символ(160), " "), затем выполняйте разбиение.

Как собрать слова обратно в одну строку?

Используйте обратную функцию СтрСоединить(МассивСлов, " ") — она объединит элементы массива через указанный разделитель. Это удобно для нормализации строк после обработки.

Итог

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

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