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