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

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

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

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

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

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

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

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

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

Пример разбиения строки на слова по пробелу:

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

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

// Слова[0] = "Иванов"

// Слова[1] = "Иван"

// Слова[2] = "Иванович"

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

Обратите внимание: индексация массива начинается с нуля, а не с единицы, как у строк функции СтрПолучитьСтроку(). Это частый источник ошибок при переносе старого кода на новый метод.

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

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

Строка = "яблоки, груши;сливы  персики";

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

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

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

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

Разделение на слова в старых версиях платформы

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

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

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

Подготовленная = СтрЗаменить(Строка, " ", Символы.ПС);

Для Номер = 1 По СтрЧислоСтрок(Подготовленная) Цикл

Слово = СокрЛП(СтрПолучитьСтроку(Подготовленная, Номер));

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

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

КонецЕсли;

КонецЦикла;

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

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

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

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

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

Штатная функция платформы 8.3.6+. Быстрая, поддерживает несколько разделителей и управление пустыми элементами. Не работает в старых режимах совместимости.

СтрЗаменить + СтрПолучитьСтроку

Универсальный приём для любых версий. Требует больше кода и осторожности с переводами строк в исходных данных.

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

Полный контроль над логикой (например, учёт кавычек). Медленнее и сложнее, оправдан только при нестандартных правилах разбора.

Практический сценарий: разбор ФИО на части

Типовая прикладная задача — разделить полное ФИО, введённое одной строкой, на фамилию, имя и отчество для заполнения отдельных полей справочника. Прямое применение СтрРазделить() решает её, но с оговорками.

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

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

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

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

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

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

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

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

// Отчество отсутствует

КонецЕсли;

Ограничение подхода: двойные фамилии («Салтыков-Щедрин») обрабатываются корректно, а вот составные фамилии через пробел («фон дер Лейен») развалят структуру. Если такие данные возможны, потребуется дополнительная логика или ручная проверка пользователем.

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

Проверка результата и обработка крайних случаев

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

Типичные крайние случаи: пустая исходная строка (результат — пустой массив), строка из одних пробелов, строка без разделителя (массив из одного элемента — всей строки целиком). Все три ситуации корректно обрабатываются проверкой Количество().

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

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

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

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

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

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

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

Нет пустых строк и лишних пробелов

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

Пустые элементы — установите третий параметр в Ложь

Первая и последняя части
Норма

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

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

Обрезаны или содержат разделитель — проверьте исходные данные

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

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

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

Типичные ошибки
01
{'name': 'Обращение к элементу без проверки количества', 'text': 'Приводит к ошибке «Индекс за границами массива» на неполных данных. Всегда проверяйте Количество().'}
02
{'name': 'Индексация с единицы', 'text': 'Массивы в 1С индексируются с нуля. Слова[1] — это второе слово, а не первое.'}
03
{'name': 'Игнорирование параметра ВключатьПустые', 'text': 'По умолчанию Истина, поэтому двойные пробелы дают пустые элементы и сдвигают индексы слов.'}
04
{'name': 'Разделитель из нескольких символов', 'text': 'СтрРазделить трактует каждый символ второго параметра как отдельный разделитель. Разделить по слову «ИЛИ» этой функцией нельзя — нужен СтрЗаменить с предварительной заменой.'}

Отдельно отметим ситуацию, когда разделителем должна быть последовательность символов — например, « — » или «::». СтрРазделить() здесь не поможет: она разобьёт строку по каждому символу в отдельности. Решение — сначала заменить многосимвольный разделитель на редкий одиночный символ через СтрЗаменить(), а затем разделить по нему.

Итог

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

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

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

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

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

Как разделить строку, если разделитель — целое слово?

СтрРазделить воспринимает каждый символ второго параметра как отдельный разделитель, поэтому многосимвольный разделитель сначала замените через СтрЗаменить на редкий символ (например, Символ(1)), а затем разделите по нему.

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

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

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

СтрРазделить для этого не подходит — пустой разделитель не допускается. Используйте цикл по длине строки с функцией Сред(Строка, Номер, 1), извлекая символы по одному.

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

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

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

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