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