Разработка и Конфигурация · 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 и новее. Быстро, лаконично, но один разделитель и нет шаблонов.
Работает на любой версии платформы. Больше кода, нужна аккуратность с длиной разделителя и пустыми частями.
Идеально для многострочного текста. Не подходит для других разделителей.
Несколько разных разделителей приводятся к одному. Ограничение: заменяемый символ не должен встречаться в данных.
Сложные шаблоны и условия разбора. Теряется кроссплатформенность и усложняется поддержка.
Для подавляющего большинства прикладных задач достаточно первых двух вариантов. Регулярные выражения оправданы при разборе неструктурированных данных из внешних источников — например, выгрузок из сторонних систем с непредсказуемым форматированием.
Обратная задача: склейка строк через СтрСоединить
Парная функция СтрСоединить(Массив, Разделитель) собирает массив строк обратно в одну строку. Она также появилась в 8.3.6. На старых платформах её заменяют циклом с накоплением строки, но здесь есть подводный камень производительности.
Конкатенация строк в цикле (Результат = Результат + Элемент + Разделитель) на больших массивах работает медленно из-за особенностей работы со строками. Для больших объёмов эффективнее собирать строки в ЗаписьXML или использовать промежуточный массив с последующей обработкой. На малых объёмах (десятки элементов) разница незаметна, и простой цикл вполне допустим.
Типичные ошибки при разборе строк
Отдельно стоит тема CSV-файлов. Настоящий CSV с экранированием кавычками корректно разобрать простой СтрРазделить() нельзя: запятая внутри кавычек не является разделителем. Для таких файлов нужен посимвольный разбор с отслеживанием состояния «внутри кавычек» или загрузка через ТекстовыйДокумент с последующей построчной обработкой по упрощённым правилам, если формат гарантированно простой.
Как проверить корректность разбора
Как проверить результат
Совпадает с ожидаемым числом частей (например, 3 для ФИО)
Меньше ожидаемого — разделитель не найден или отличается (например, русская «с» вместо латинской)
Нет лишних пробелов и пустых значений там, где их быть не должно
Пробелы по краям, пустые строки от двойных разделителей
Массив из одного элемента с исходной строкой — код это обрабатывает
Код падает при обращении к несуществующим элементам
Корректно обрабатывается без ошибки
Ошибка или неожиданный массив с пустыми элементами
Практическая рекомендация — при разборе данных из внешних источников всегда проверять Количество() у полученного массива перед обращением к элементам по индексу и оборачивать разбор в попытку/исключение с понятным сообщением об ошибке, указывающим номер строки или значение, которое не удалось разобрать.
Что важно запомнить
СтрРазделить() — штатная функция с платформы 8.3.6. На старых версиях её заменяет цикл со СтрНайти() и Сред(), для многострочного текста — СтрЧислоСтрок/СтрПолучитьСтроку, для нескольких разделителей — предварительная нормализация через СтрЗаменить. Всегда проверяйте количество элементов результата и обрабатывайте пустые части.
Частые вопросы
В какой версии платформы появилась СтрРазделить?
Функция появилась в платформе 1С:Предприятие 8.3.6. Если конфигурация работает в режиме совместимости с более ранними версиями, функция может быть недоступна даже на новой платформе — проверяйте свойство «Режим совместимости» в свойствах конфигурации.
Как разбить строку сразу по нескольким разделителям?
Штатной возможности нет. Практичный приём — последовательно заменить все разделители на один через СтрЗаменить(), затем вызвать СтрРазделить(). Убедитесь, что выбранный единый разделитель не встречается в самих данных.
Почему СтрРазделить возвращает пустые элементы?
Если в строке встречаются два разделителя подряд или строка начинается/заканчивается разделителем, между ними образуются пустые подстроки. По умолчанию они включаются в результат. Передайте Ложь третьим параметром, чтобы исключить их.
Чем разобрать CSV-файл с кавычками?
СтрРазделить() не подходит: запятые внутри кавычек будут ошибочно считаться разделителями. Нужен посимвольный разбор с отслеживанием состояния кавычек или использование специализированных библиотек и обработок для загрузки табличных данных.
Что быстрее: СтрРазделить или ручной цикл со СтрНайти?
Встроенная функция реализована на уровне платформы и работает быстрее кода на встроенном языке, особенно на длинных строках. На современной платформе предпочтительна СтрРазделить(); ручной цикл оправдан только для совместимости со старыми версиями.
Как склеить массив строк обратно на старой платформе?
Используйте цикл с добавлением разделителя между элементами: добавляйте разделитель только если текущий элемент не первый. Это исключает лишний разделитель в начале или конце результирующей строки.