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

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

Как разделить строку в 1С: инструкция с примерами

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

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

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

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

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

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

СтрокаАдреса = "г. Москва, ул. Ленина, д. 10";

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

// Части[0] = "г. Москва"

// Части[1] = " ул. Ленина"

// Части[2] = " д. 10"

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

Если разделитель в строке не найден, функция вернёт массив из одного элемента — исходной строки целиком. Это нормальное поведение, но его нужно учитывать: код, ожидающий минимум два элемента, должен проверять Части.Количество() перед обращением к Части[1].

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

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

Первый подход — предварительная нормализация: заменить все варианты разделителей на один канонический символ, а затем разделить.

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

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

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

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

Третий параметр Ложь здесь важен: после замены пробелов на запятые могут появиться подряд идущие разделители, и без отбрасывания пустых подстрок массив будет засорён пустыми элементами. Второй подход — последовательное разделение: сначала по одному разделителю, затем каждый элемент по следующему, с накоплением результата в итоговый массив.

Разделение по нескольким разделителям
  1. 1
    Определите полный набор символов-разделителей в данных
  2. 2
    Замените все разделители на один канонический через СтрЗаменить
  3. 3
    Вызовите СтрРазделить с параметром ВключатьПустые = Ложь
  4. 4
    Пройдите по массиву и примените СокрЛП к каждому элементу
  5. 5
    Проверьте количество элементов перед использованием

Работа с пустыми подстроками и параметр ВключатьПустые

По умолчанию параметр «ВключатьПустые» равен Истина: если два разделителя идут подряд или строка начинается/заканчивается разделителем, в массив попадут пустые строки. Это полезно, когда позиция элемента имеет значение — например, при разборе строки CSV, где пустое поле между запятыми означает отсутствие значения в конкретной колонке.

Строка = "Иванов;;Москва";

// ВключатьПустые = Истина (по умолчанию):

// [0]="Иванов", [1]="", [2]="Москва" — позиции сохранены

// ВключатьПустые = Ложь:

// [0]="Иванов", [1]="Москва" — позиции сдвинулись

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

Маршрут решения

Как выбрать режим

Формат позиционный: каждая позиция между разделителями — отдельное поле (CSV, обменные файлы)ВключатьПустые = Истина, чтобы позиции полей не сдвигались
Произвольный список значений, введённый пользователем через запятуюВключатьПустые = Ложь, чтобы лишние запятые и пробелы не порождали пустые элементы
Разделитель может встречаться внутри данныхСтрРазделить не подходит — нужен парсер с учётом кавычек или экранирования

Разделение многострочного текста на строки

Многострочный текст из текстового файла или поля ввода разделяется по символу переноса строки Символы.ПС. Однако файлы, созданные в Windows, используют пару символов CR+LF (возврат каретки и перевод строки), и разделение только по Символы.ПС оставит в конце каждой строки невидимый символ Символы.ВК.

Текст = "Строка1" + Символы.ПС + "Строка2" + Символы.ПС + "Строка3";

Строки = СтрРазделить(Текст, Символы.ПС);

Для Каждого Стр Из Строки Цикл

ЧистаяСтрока = СтрЗаменить(Стр, Символы.ВК, "");

// дальнейшая обработка

КонецЦикла;

Альтернатива — объект ТекстовыйДокумент с методами КоличествоСтрок() и ПолучитьСтроку(): он сам корректно обрабатывает разные варианты переносов и удобен при построчном чтении больших файлов. Для небольших текстов в памяти СтрРазделить быстрее и проще.

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

Разбор CSV-строк с кавычками: ограничения СтрРазделить

Главное ограничение СтрРазделить() — функция не понимает кавычки и экранирование. В настоящем CSV поле "Иванов, Иван" заключено в кавычки, потому что запятая внутри — часть данных, а не разделитель. Наивное разделение по запятой разорвёт такое поле на два.

Если вы контролируете источник данных и гарантированно знаете, что разделитель внутри значений не встречается, СтрРазделить достаточно. Если данные приходят извне и могут содержать кавычки, нужен посимвольный разбор: идти по строке, отслеживать состояние «внутри кавычек» и разбивать только на разделителях вне кавычек. Такой парсер пишется в 20–30 строк кода.

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

Обратная операция и связанные приёмы

Для сборки строки из массива используется СтрСоединить(Массив, Разделитель). Пара функций «разделить — соединить» удобна для перестановки частей строки: например, преобразовать «Иванов Иван Иванович» в формат «Иван Иванович Иванов».

ФИО = "Иванов Иван Иванович";

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

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

Результат = Части[1] + " " + Части[2] + " " + Части[0];

КонецЕсли;

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

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

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

Проверка результата разделения

После разделения полезно проверить три вещи: количество элементов соответствует ожидаемому формату, ни один обязательный элемент не пуст, и элементы не содержат служебных символов (ВК, Таб, неразрывный пробел). Неразрывный пробел (код 160) — отдельная ловушка: СокрЛП() его удаляет, но внутри строки он мешает сравнению, а визуально неотличим от обычного пробела.

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

ВызватьИсключение "Неверный формат строки: " + ИсходнаяСтрока;

КонецЕсли;

Выбрасывать исключение с текстом исходной строки — хорошая практика: при пакетной обработке файла вы сразу увидите, на какой именно строке формат нарушен, вместо абстрактной ошибки индекса.

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

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

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

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

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

Меньше или больше — формат строки нарушен или неверно выбран режим пустых подстрок

Концы строк после разделения текста
Норма

Длина строки равна видимому числу символов

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

Длина на 1 больше — в конце остался символ ВК

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

СокрЛП(элемент) совпадает с ожидаемым значением

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

Визуально совпадает, но сравнение ложно — неразрывный пробел или ВК

Часто задаваемые вопросы

Чем разделить строку в 1С 7.7, где нет СтрРазделить?

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

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

Передайте в СтрРазделить пустую строку как разделитель — результатом будет массив отдельных символов. Альтернатива — цикл от 1 до СтрДлина(Строка) с функцией Сред(Строка, Н, 1).

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

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

Можно ли разделить строку прямо в запросе 1С?

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

Как разделить строку, если разделитель — несколько символов, например « - »?

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

Что быстрее: СтрРазделить или ТекстовыйДокумент для многострочного текста?

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

Итог

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

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