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

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

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

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

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

Функция СтрРазделить доступна начиная с платформы 8.3.6. Она принимает строку, разделитель и возвращает массив подстрок. Если конфигурация работает на более старой платформе или в режиме совместимости, придётся использовать альтернативные приёмы — они тоже описаны ниже.

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

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

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

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

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

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

КонецЦикла;

В результате получим массив из трёх элементов: «Иванов», «Петр», «Сидорович». Дальше элементы можно использовать по индексу — например, МассивСлов[0] для фамилии. Помните, что индексация массивов в 1С начинается с нуля.

Разделителем может быть любой символ или даже последовательность символов. Например, для строки «Артикул;Наименование;Цена» достаточно вызвать СтрРазделить(Строка, ";").

bsl
МассивСлов = СтрРазделить("Яблоко,Груша,Апельсин", ",");
// МассивСлов[0] = "Яблоко"
// МассивСлов[1] = "Груша"
// МассивСлов[2] = "Апельсин"

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

Если слова в строке разделены разными символами — пробелами, запятыми, точками с запятой — вторым параметром можно передать строку, где каждый символ трактуется как отдельный разделитель. Это важная особенность: СтрРазделить воспринимает второй параметр как набор символов-разделителей, а не как единую подстроку.

Строка = "Яблоко, Груша;Апельсин  Слива";

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

Здесь разделителями выступают пробел, запятая и точка с запятой. Третий параметр Ложь убирает пустые элементы, которые возникли бы из-за двойных пробелов или сочетания «запятая + пробел». Без него в массив попали бы пустые строки.

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

Обработка пустых элементов и лишних пробелов

Третий параметр функции управляет тем, попадут ли в результат пустые строки. По умолчанию он равен Истина, и при двух подряд разделителях между ними появится пустой элемент. Это полезно при разборе CSV-подобных данных, где пустое поле имеет значение, но мешает при разделении на слова.

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

Строка = СокрЛП(ИсходнаяСтрока);

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

Строка = СтрЗаменить(Строка, " ", " ");

КонецЦикла;

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

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

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

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

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

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

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

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

МассивСлов.Добавить(Слово);

КонецЕсли;

КонецЦикла;

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

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

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

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

Оптимальный способ на платформе 8.3.6 и новее. Короткий код, контроль пустых элементов, несколько разделителей.

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

Подходит для старых платформ. Простой код, но учитывает существующие переносы строк как разделители.

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

Максимальный контроль, работает везде, но много ручного кода и риск ошибок в индексах.

Разбор ФИО, адресов и данных из файлов

Типовой прикладной сценарий — разбор ФИО, введённого одной строкой. После разделения по пробелу проверяйте количество элементов массива: если их меньше трёх, отчество или имя могут отсутствовать, и обращение по индексу вызовет ошибку «Индекс находится за границами массива».

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

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

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

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

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

Иначе

ВызватьИсключение "Некорректный формат ФИО";

КонецЕсли;

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

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

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

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

Типичные ошибки
01
Обращение к МассивСлов[2] без проверки Количество() — ошибка выхода за границы массива на неполных данных.
02
Разделение только по обычному пробелу — неразрывные пробелы и табуляции остаются внутри слов.
03
Передача Ложь третьим параметром при разборе CSV — пустые колонки исчезают, и поля смещаются.
04
Ожидание, что СтрРазделить(Строка, "::") разделит по паре символов — на деле разделение идёт по каждому двоеточию.
Контрольные точки

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

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

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

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

Элементов меньше или больше — проверьте разделители и лишние пробелы

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

Слова без пробелов, запятых и служебных символов по краям

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

В элементах остались разделители, табуляции или неразрывные пробелы

Пустые элементы
Норма

Отсутствуют при третьем параметре Ложь

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

Пустые строки в массиве — параметр не передан или равен Истина

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

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

Передайте все символы-разделители одной строкой во втором параметре: СтрРазделить(Строка, " ,;." + Символы.Таб, Ложь). Каждый символ будет работать как самостоятельный разделитель, а Ложь уберёт пустые элементы.

Функция СтрРазделить не найдена — что делать?

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

Как разделить строку по многосимвольному разделителю, например по " — "?

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

Почему после разделения в массиве пустые строки?

Потому что между двумя разделителями нет текста, а третий параметр по умолчанию равен Истина и включает пустые элементы. Передайте Ложь третьим параметром или предварительно сожмите повторные разделители через СтрЗаменить.

Как разбить строку на слова без учёта знаков препинания?

Включите знаки препинания в набор разделителей: СтрРазделить(Строка, " .,!?;:—-" + Символы.Таб + Символы.ПС, Ложь). Если нужно сохранить дефисы внутри слов (например, «северо-западный»), дефис в разделители не добавляйте.

Можно ли разделить строку сразу в список значений, а не в массив?

Напрямую СтрРазделить возвращает только массив. Чтобы получить список значений, создайте его и загрузите массив: СписокЗначений.ЗагрузитьЗначения(СтрРазделить(Строка, " ", Ложь)).

Итог

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

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