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

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

СтрРазделить в 1С: как работает и чем заменить

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

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

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

Как работает СтрРазделить и в чём её ограничения

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

Пример: СтрРазделить("Иванов;;Петров", ";") вернёт массив из трёх элементов — «Иванов», пустая строка, «Петров». Если передать Ложь третьим параметром, пустой элемент будет пропущен. Это важно при разборе данных, где двойной разделитель означает пропущенное значение, а не ошибку.

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

Чем заменить СтрРазделить на платформе ниже 8.3.6

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

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

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

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

ДлинаРазделителя = СтрДлина(Разделитель);

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

Результат.Добавить(Лев(Строка, Позиция - 1));

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

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

КонецЦикла;

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

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

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

Обратите внимание: функция Найти() — это старое имя современной СтрНайти(). Если код пишется для платформы 8.3.6 и новее, но должен оставаться совместимым со старым режимом, используйте имена в зависимости от режима совместимости конфигурации. В режиме совместимости с 8.2 доступны только старые имена.

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

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

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

Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл

ТекущаяСтрока = СтрПолучитьСтроку(Текст, НомерСтроки);

// обработка строки

КонецЦикла;

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

Когда нужны регулярные выражения

Стандартная СтрРазделить() не умеет разбивать строку по нескольким разным разделителям одновременно — например, когда данные разделены запятыми, точками с запятой и пробелами вперемешку. Обходной путь без внешних средств — последовательно заменить все варианты разделителей на один через СтрЗаменить(), а затем вызвать СтрРазделить().

Нормализованная = СтрЗаменить(ИсходнаяСтрока, ";", ",");

Нормализованная = СтрЗаменить(Нормализованная, " ", ",");

Части = СтрРазделить(Нормализованная, ",", Ложь);

Для сложных шаблонов (разделитель — любая цифра, разбор с учётом кавычек, вложенные структуры) используют регулярные выражения через COM-объект VBScript.RegExp на Windows-сервере или через внешние компоненты. Это оправдано только при действительно сложном разборе: COM-объекты не работают на Linux-сервере и в веб-клиенте, что ограничивает переносимость решения.

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

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

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

Штатный способ для платформы 8.3.6 и новее. Быстро, лаконично, но один разделитель и нет шаблонов.

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

Работает на любой версии платформы. Больше кода, нужна аккуратность с длиной разделителя и пустыми частями.

СтрЧислоСтрок/СтрПолучитьСтроку

Идеально для многострочного текста. Не подходит для других разделителей.

СтрЗаменить + СтрРазделить

Несколько разных разделителей приводятся к одному. Ограничение: заменяемый символ не должен встречаться в данных.

Регулярные выражения (COM/компоненты)

Сложные шаблоны и условия разбора. Теряется кроссплатформенность и усложняется поддержка.

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

Обратная задача: склейка строк через СтрСоединить

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

Конкатенация строк в цикле (Результат = Результат + Элемент + Разделитель) на больших массивах работает медленно из-за особенностей работы со строками. Для больших объёмов эффективнее собирать строки в ЗаписьXML или использовать промежуточный массив с последующей обработкой. На малых объёмах (десятки элементов) разница незаметна, и простой цикл вполне допустим.

Типичные ошибки при разборе строк

Типичные ошибки
01
Обращение к элементу массива без проверки количества элементов — если разделителя нет в строке, массив содержит один элемент, и обращение ко второму вызывает ошибку
02
Игнорирование третьего параметра ВключатьПустые — двойные разделители в данных дают пустые элементы и смещают логику разбора
03
Использование СтрРазделить в коде, который запускается на старой платформе, — вызов неизвестной функции приводит к ошибке компиляции
04
Разбор CSV через СтрРазделить без учёта кавычек — значения, содержащие запятую внутри кавычек, разбиваются некорректно
05
Забытый СокрЛП над элементами — пробелы вокруг разделителя остаются в значениях и ломают сравнения и поиск

Отдельно стоит тема CSV-файлов. Настоящий CSV с экранированием кавычками корректно разобрать простой СтрРазделить() нельзя: запятая внутри кавычек не является разделителем. Для таких файлов нужен посимвольный разбор с отслеживанием состояния «внутри кавычек» или загрузка через ТекстовыйДокумент с последующей построчной обработкой по упрощённым правилам, если формат гарантированно простой.

Как проверить корректность разбора

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

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

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

Совпадает с ожидаемым числом частей (например, 3 для ФИО)

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

Меньше ожидаемого — разделитель не найден или отличается (например, русская «с» вместо латинской)

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

Нет лишних пробелов и пустых значений там, где их быть не должно

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

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

Исходная строка без разделителя
Норма

Массив из одного элемента с исходной строкой — код это обрабатывает

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

Код падает при обращении к несуществующим элементам

Пустая исходная строка
Норма

Корректно обрабатывается без ошибки

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

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

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

Итог

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

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

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

В какой версии платформы появилась СтрРазделить?

Функция появилась в платформе 1С:Предприятие 8.3.6. Если конфигурация работает в режиме совместимости с более ранними версиями, функция может быть недоступна даже на новой платформе — проверяйте свойство «Режим совместимости» в свойствах конфигурации.

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

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

Почему СтрРазделить возвращает пустые элементы?

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

Чем разобрать CSV-файл с кавычками?

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

Что быстрее: СтрРазделить или ручной цикл со СтрНайти?

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

Как склеить массив строк обратно на старой платформе?

Используйте цикл с добавлением разделителя между элементами: добавляйте разделитель только если текущий элемент не первый. Это исключает лишний разделитель в начале или конце результирующей строки.