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

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

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

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

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

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

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

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

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

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

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

Фамилия = МассивЧастей[0]; // "Иванов"

Имя = МассивЧастей[1]; // "Иван"

Отчество = МассивЧастей[2]; // "Иванович"

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

Обработка строк с двойными пробелами и лишними символами

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

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

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

Строка = СокрЛП(Строка);

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

// Результат: ["Иванов", "Иван", "Иванович"] — без пустых элементов

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

Типичные ошибки
01
Не передавать третий параметр — при двойных пробелах в массиве появятся пустые строки и сместятся индексы
02
Обращаться к МассивЧастей[2] без проверки Количество() — если слов меньше трёх, получите ошибку индекса
03
Забыть СокрЛП() — лишние пробелы по краям дадут пустые первый и последний элементы

Как безопасно обращаться к элементам массива

Разделение строки не гарантирует фиксированное число частей. Пользователь мог ввести только фамилию, а мог добавить лишнее слово. Прямое обращение по индексу без проверки — самая частая причина ошибок «Индекс находится за границами массива».

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

Фамилия = ?(МассивЧастей.Количество() > 0, МассивЧастей[0], "");

Имя = ?(МассивЧастей.Количество() > 1, МассивЧастей[1], "");

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

Такой подход безопасен: при любом количестве слов код отработает без исключений, а отсутствующие части получат пустое значение, которое легко проверить дальше.

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

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

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

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

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

Больше ожидаемого — вероятно, пустые элементы от двойных пробелов

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

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

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

Пустые строки — не сработал СокрЛП или ВключатьПустые = Истина

Обращение по индексу
Норма

Перед доступом проверено Количество()

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

Ошибка «Индекс за границами массива»

Разделение по нескольким разделителям и многосимвольный разделитель

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

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

Строка = "Товар А - Товар Б - Товар В";

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

МассивЧастей = СтрРазделить(Подготовленная, Символ(1), Ложь);

Альтернативы для старых версий платформы

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

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

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

Остаток = СокрЛП(Строка);

Пока СтрДлина(Остаток) > 0 Цикл

Позиция = Найти(Остаток, " ");

Если Позиция = 0 Тогда

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

Прервать;

Иначе

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

Если Слово <> "" Тогда

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

КонецЕсли;

Остаток = СокрЛ(Сред(Остаток, Позиция + 1));

КонецЕсли;

КонецЦикла;

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

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

Ещё один старый приём — заменить пробелы на переносы строк через СтрЗаменить(Строка, " ", Символы.ПС) и затем читать строки через СтрПолучитьСтроку(Строка, НомерСтроки) и СтрЧислоСтрок(). Способ рабочий, но медленнее массива и менее читаем, поэтому применять его стоит только при отсутствии альтернатив.

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

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

Основной способ в современных конфигурациях. Быстро, одна строка кода, гибкие параметры. Не работает в очень старых версиях платформы.

Цикл с Найти() и Лев()

Универсальный вариант для любых версий. Больше кода, легко ошибиться в вычислении позиций.

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

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

Практический пример: разбор ФИО из одного поля

Типовая задача — из поля «ФИО» одной строкой получить отдельно фамилию, имя и отчество для заполнения карточки контрагента или сотрудника.

Функция РазобратьФИО(ФИОСтрокой)

Результат = Новый Структура("Фамилия, Имя, Отчество", "", "", "");

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

Если Части.Количество() > 0 Тогда Результат.Фамилия = Части[0]; КонецЕсли;

Если Части.Количество() > 1 Тогда Результат.Имя = Части[1]; КонецЕсли;

Если Части.Количество() > 2 Тогда Результат.Отчество = Части[2]; КонецЕсли;

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

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

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

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

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

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

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

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

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

Как разделить строку и сразу собрать её обратно с другим разделителем?

Используйте пару функций: СтрРазделить для разбиения и СтрСоединить для сборки массива в строку с нужным разделителем. Например, заменить пробелы на запятые: СтрСоединить(СтрРазделить(СокрЛП(Строка), " ", Ложь), ", ").

Можно ли разделить строку по пробелу только один раз, а не полностью?

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

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

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

Что делать, если внутри слов встречаются неразрывные пробелы?

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

Итог

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

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