Разработка и Конфигурация · 9 мин
Как разделить строку по пробелам в 1С
Разбираем, как разделить строку по пробелам в 1С: функция СтрРазделить, СтрПолучитьСтроку, работа с несколькими пробелами и типичные ошибки разработчика.
Разделение строки по пробелам — одна из самых частых задач при обработке пользовательского ввода, разборе ФИО, артикулов, адресов и данных из файлов. В языке 1С нет отдельной функции «разделить по пробелу», но есть универсальный механизм, который решает задачу в одну строку кода.
Основной инструмент — функция СтрРазделить(), доступная в управляемых приложениях и тонком клиенте. Она принимает строку, разделитель и возвращает массив подстрок. Для обычных форм и старых версий платформы придётся использовать альтернативные подходы, которые тоже разберём.
Важный нюанс: реальные строки часто содержат двойные пробелы, табуляции и переносы строк. Наивное разделение даст массив с пустыми элементами, и дальнейшая логика сломается. Поэтому помимо базового вызова нужно понимать параметры функции и способы предварительной очистки строки.
Базовый способ: функция СтрРазделить
Функция СтрРазделить(Строка, Разделитель, ВключатьПустые) разбивает строку и возвращает массив. Разделителем может быть один символ или строка из нескольких символов — тогда разбиение идёт по любому из них.
Строка = "Иванов Иван Иванович";
МассивЧастей = СтрРазделить(Строка, " ", Ложь);
Фамилия = МассивЧастей[0]; // "Иванов"
Имя = МассивЧастей[1]; // "Иван"
Отчество = МассивЧастей[2]; // "Иванович"
Третий параметр отвечает за включение пустых подстрок в результат. По умолчанию он равен Истина, то есть два пробела подряд дадут пустой элемент между ними. Для разбора по пробелам почти всегда правильнее передать Ложь.
Обработка строк с двойными пробелами и лишними символами
Пользовательский ввод редко бывает чистым: в начале и конце строки встречаются пробелы, между словами — по два-три пробела, иногда табуляции. Если не подготовить строку, результат разбиения будет непредсказуемым.
Два приёма решают большинство проблем. Первый — СокрЛП() убирает незначащие пробелы по краям. Второй — параметр ВключатьПустые = Ложь игнорирует повторные разделители внутри строки.
Строка = " Иванов Иван Иванович ";
Строка = СокрЛП(Строка);
МассивЧастей = СтрРазделить(Строка, " ", Ложь);
// Результат: ["Иванов", "Иван", "Иванович"] — без пустых элементов
Если в строке могут быть табуляции и переносы строк, укажите их все в разделителе: СтрРазделить(Строка, " " + Символы.Таб + Символы.ПС, Ложь). Каждый символ из строки-разделителя будет считаться отдельным разделителем.
Как безопасно обращаться к элементам массива
Разделение строки не гарантирует фиксированное число частей. Пользователь мог ввести только фамилию, а мог добавить лишнее слово. Прямое обращение по индексу без проверки — самая частая причина ошибок «Индекс находится за границами массива».
МассивЧастей = СтрРазделить(СокрЛП(Строка), " ", Ложь);
Фамилия = ?(МассивЧастей.Количество() > 0, МассивЧастей[0], "");
Имя = ?(МассивЧастей.Количество() > 1, МассивЧастей[1], "");
Отчество = ?(МассивЧастей.Количество() > 2, МассивЧастей[2], "");
Такой подход безопасен: при любом количестве слов код отработает без исключений, а отсутствующие части получат пустое значение, которое легко проверить дальше.
Как проверить результат
Совпадает с ожидаемым числом слов
Больше ожидаемого — вероятно, пустые элементы от двойных пробелов
Содержат реальные слова
Пустые строки — не сработал СокрЛП или ВключатьПустые = Истина
Перед доступом проверено Количество()
Ошибка «Индекс за границами массива»
Разделение по нескольким разделителям и многосимвольный разделитель
Если слова разделены не только пробелами, но и запятыми или точками с запятой, перечислите все символы во втором параметре: СтрРазделить(Строка, " ,;.", Ложь). Разбиение произойдёт по любому из указанных символов.
Ограничение: СтрРазделить воспринимает разделитель как набор отдельных символов, а не как единую подстроку. Если нужно разделить по последовательности, например по " - " (пробел-дефис-пробел), функция разобьёт и по пробелам, и по дефисам отдельно. Для многосимвольного разделителя сначала замените его на один уникальный символ через СтрЗаменить(), затем разделяйте.
Строка = "Товар А - Товар Б - Товар В";
Подготовленная = СтрЗаменить(Строка, " - ", Символ(1));
МассивЧастей = СтрРазделить(Подготовленная, Символ(1), Ложь);
Альтернативы для старых версий платформы
В обычных формах и на платформах, где СтрРазделить недоступна, используются другие подходы. Наиболее практичный — обход строки в цикле с поиском позиции пробела через Найти() и вырезанием частей через Лев() и Сред().
Функция РазделитьПоПробелам(Строка)
Результат = Новый Массив;
Остаток = СокрЛП(Строка);
Пока СтрДлина(Остаток) > 0 Цикл
Позиция = Найти(Остаток, " ");
Если Позиция = 0 Тогда
Результат.Добавить(Остаток);
Прервать;
Иначе
Слово = Лев(Остаток, Позиция - 1);
Если Слово <> "" Тогда
Результат.Добавить(Слово);
КонецЕсли;
Остаток = СокрЛ(Сред(Остаток, Позиция + 1));
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Ещё один старый приём — заменить пробелы на переносы строк через СтрЗаменить(Строка, " ", Символы.ПС) и затем читать строки через СтрПолучитьСтроку(Строка, НомерСтроки) и СтрЧислоСтрок(). Способ рабочий, но медленнее массива и менее читаем, поэтому применять его стоит только при отсутствии альтернатив.
Сравнение вариантов
Основной способ в современных конфигурациях. Быстро, одна строка кода, гибкие параметры. Не работает в очень старых версиях платформы.
Универсальный вариант для любых версий. Больше кода, легко ошибиться в вычислении позиций.
Простой трюк для старых версий. Медленнее, неудобен при дальнейшей обработке, ломается если в исходной строке уже есть переносы.
Практический пример: разбор ФИО из одного поля
Типовая задача — из поля «ФИО» одной строкой получить отдельно фамилию, имя и отчество для заполнения карточки контрагента или сотрудника.
Функция РазобратьФИО(ФИОСтрокой)
Результат = Новый Структура("Фамилия, Имя, Отчество", "", "", "");
Части = СтрРазделить(СокрЛП(ФИОСтрокой), " ", Ложь);
Если Части.Количество() > 0 Тогда Результат.Фамилия = Части[0]; КонецЕсли;
Если Части.Количество() > 1 Тогда Результат.Имя = Части[1]; КонецЕсли;
Если Части.Количество() > 2 Тогда Результат.Отчество = Части[2]; КонецЕсли;
Возврат Результат;
КонецФункции
- 1Очистите строку функцией СокрЛП от краевых пробелов
- 2Вызовите СтрРазделить с разделителем " " и третьим параметром Ложь
- 3Проверьте Количество() элементов массива перед обращением по индексам
- 4Извлеките нужные части и проверьте их на пустоту перед записью в данные
- 5Протестируйте на строках с одним словом, двойными пробелами и пустой строкой
Обратите внимание на границу применимости: составные фамилии с дефисом, двойные имена и частицы («ван», «де», «ибн») при простом разделении по пробелам развалятся. Если в данных встречаются такие случаи, простого разбиения недостаточно — нужна логика сопоставления со справочником или ручная проверка оператором.
Частые вопросы
Чем отличается СтрРазделить от СтрПолучитьСтроку?
СтрРазделить разбивает строку по произвольному разделителю и возвращает массив. СтрПолучитьСтроку работает только с многострочным текстом и возвращает строку по её номеру — разделителем фактически является перенос строки. Для разбора по пробелам подходит только СтрРазделить.
Почему в массиве появляются пустые элементы?
Потому что третий параметр ВключатьПустые по умолчанию равен Истина: каждый повторный пробел создаёт пустую подстроку. Передайте Ложь, и пустые элементы будут исключены из результата.
Как разделить строку и сразу собрать её обратно с другим разделителем?
Используйте пару функций: СтрРазделить для разбиения и СтрСоединить для сборки массива в строку с нужным разделителем. Например, заменить пробелы на запятые: СтрСоединить(СтрРазделить(СокрЛП(Строка), " ", Ложь), ", ").
Можно ли разделить строку по пробелу только один раз, а не полностью?
СтрРазделить такой режим не поддерживает. Используйте Найти(Строка, " "): всё левее позиции — первая часть, всё правее через Сред() — вторая, включая оставшиеся пробелы.
Работает ли СтрРазделить на сервере и в мобильном клиенте?
Да, функция доступна на сервере, в толстом, тонком, веб- и мобильном клиенте в современных версиях платформы. Это делает её универсальным выбором для общих модулей с разными контекстами исполнения.
Что делать, если внутри слов встречаются неразрывные пробелы?
Неразрывный пробел (Символ(160)) обычным разделителем " " не ловится. Замените его заранее: СтрЗаменить(Строка, Символ(160), " "), а затем выполняйте разделение.
Что важно запомнить
Разделение строки по пробелам в 1С делается функцией СтрРазделить(Строка, " ", Ложь) с предварительной очисткой СокрЛП. Всегда проверяйте Количество() элементов перед обращением по индексу — это защищает код от ошибок на непредсказуемом вводе.