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

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

Как получить данные из строки в 1С

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

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

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

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

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

Прежде чем писать код, ответьте на три вопроса. Первый: есть ли в строке явный разделитель (запятая, точка с запятой, табуляция, вертикальная черта)? Если да — задача решается функцией СтрРазделить. Второй: имеют ли поля фиксированную позицию и длину, как в банковских выписках старых форматов? Тогда подходят Сред и СтрДлина. Третий: соответствует ли строка известному формату (JSON, XML)? В этом случае ручной разбор вообще не нужен — используйте штатные объекты чтения.

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

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

Как выбрать метод разбора

В строке есть явный разделитель (запятая, ;, |, табуляция)Используйте СтрРазделить() и обрабатывайте полученный массив
Поля имеют фиксированную позицию и длинуПрименяйте Сред() с вычисленными смещениями
Строка соответствует JSON или XMLИспользуйте ЧтениеJSON или ЧтениеXML вместо ручного разбора
Данные описываются сложным шаблоном (дата, артикул, номер)Примените регулярное выражение через VBScript.RegExp
Разделитель встречается внутри самих данныхПереходите на формат с экранированием или разбор с учётом кавычек

Разбор строки с разделителем через СтрРазделить

Функция СтрРазделить — основной инструмент для строк вида «Иванов;Иван;Менеджер». Она возвращает массив подстрок, разбитых по указанному разделителю. Второй параметр — включать ли пустые строки: если между двумя разделителями ничего нет, по умолчанию пустой элемент в массив не попадает, что смещает позиции остальных полей.

СтрокаДанных = "Иванов;Иван;;Менеджер";

Части = СтрРазделить(СтрокаДанных, ";", Истина);

// Части[0] = "Иванов", Части[1] = "Иван",

// Части[2] = "" (пусто), Части[3] = "Менеджер"

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

ВызватьИсключение "Неверное число полей в строке";

КонецЕсли;

Третий параметр Истина критически важен при позиционном разборе: без него пустые поля пропускаются, и «Менеджер» оказался бы на месте отчества. Всегда проверяйте количество элементов массива перед обращением по индексу — обращение к несуществующему индексу вызывает ошибку выполнения.

Для многострочных данных разделителем может быть перевод строки: Символы.ПС или комбинация Символы.ВК + Символы.ПС (файлы Windows). Надёжнее сначала заменить ВК+ПС на ПС, а затем разбивать.

Извлечение подстроки по позиции: Сред, Лев, Прав и СтрНайти

Когда позиция данных известна или вычисляется, работают четыре базовые функции. Лев(Строка, N) берёт N символов с начала, Прав(Строка, N) — с конца, Сред(Строка, Начало, Длина) — произвольный фрагмент. СтрНайти(Строка, Подстрока) возвращает позицию первого вхождения подстроки или 0, если подстрока не найдена.

Типовой приём — извлечь значение после известного маркера. Например, из строки «Артикул: АБВ-12345» нужно получить сам артикул:

Строка = "Артикул: АБВ-12345";

Позиция = СтрНайти(Строка, "Артикул:");

Если Позиция > 0 Тогда

Артикул = СокрЛП(Сред(Строка, Позиция + СтрДлина("Артикул:")));

Иначе

Артикул = "";

КонецЕсли;

Обратите внимание на обязательную проверку «Позиция > 0». Если маркер не найден, Сред вернёт всю строку целиком или неверный фрагмент, и ошибка всплывёт далеко от места разбора. СокрЛП после извлечения убирает пробелы по краям — они почти всегда присутствуют в данных из внешних источников.

Разбор строки фиксированной длины

Банковские и казначейские форматы иногда используют поля фиксированной ширины: позиции 1–8 — дата, 9–28 — счёт, 29–50 — сумма. Здесь применяется последовательный Сред с накоплением смещения. Вынесите смещения и длины в переменные или структуру в начале функции — так проще адаптировать код при изменении формата.

Регулярные выражения для сложных шаблонов

Когда данные описываются шаблоном — «цифры, дефис, буквы», «дата в формате ДД.ММ.ГГГГ» — на Windows доступен COM-объект VBScript.RegExp. Он позволяет найти все вхождения шаблона и извлечь группы.

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.Global = Истина;

RegExp.Pattern = "\d{2}\.\d{2}\.\d{4}";

Строка = "Период с 01.03.2026 по 31.03.2026";

Найденные = RegExp.Execute(Строка);

Для Каждого Совпадение Из Найденные Цикл

Сообщить(Совпадение.Value);

КонецЦикла;

Регулярные выражения оправданы, когда шаблон действительно сложный. Для простого «взять всё после двоеточия» они избыточны и замедляют выполнение при массовой обработке — в цикле на десятки тысяч строк разница со СтрНайти заметна.

Разбор форматированных строк: JSON, XML и CSV

Если строка — это JSON, не разбирайте её вручную никогда. Штатный объект ЧтениеJSON корректно обрабатывает вложенность, экранирование и типы данных:

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(СтрокаJSON);

Данные = ПрочитатьJSON(Чтение, Истина); // Соответствие

Чтение.Закрыть();

Значение = Данные.Получить("ИмяПоля");

Аналогично для XML используйте ЧтениеXML с последовательным обходом узлов. Ручной разбор XML строковыми функциями — частая причина сбоев: атрибуты могут идти в другом порядке, а значения содержать экранированные символы.

Особенности CSV

CSV обманчиво прост. Пока поля не содержат запятых и кавычек, достаточно СтрРазделить. Но стандарт допускает значения в кавычках с запятыми и переводами строк внутри: «Иванов, Иван»;"Менеджер". Простой разбор по запятой развалит такую строку. Если вы контролируете источник — договоритесь о разделителе, которого нет в данных (например, табуляция или |). Если источник внешний, пишите посимвольный разбор с учётом состояния «внутри кавычек» или используйте готовые функции из типовых конфигураций и библиотеки стандартных подсистем.

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

Преобразование извлечённых данных и проверка результата

Из строки всегда извлекается строка. Перед использованием преобразуйте значение к нужному типу: Число(), Дата() или собственная функция разбора даты. Помните, что Число("1 234,56") с неразрывным пробелом вызовет ошибку — сначала удалите разделители разрядов через СтрЗаменить.

СтрокаСуммы = "1 234,56";

СтрокаСуммы = СтрЗаменить(СтрокаСуммы, Символ(160), ""); // неразрывный пробел

СтрокаСуммы = СтрЗаменить(СтрокаСуммы, " ", "");

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

Для дат надёжнее разобрать части (день, месяц, год) через СтрРазделить и собрать значение конструктором Дата(Год, Месяц, День), чем полагаться на автоматическое преобразование — оно зависит от региональных настроек сеанса.

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

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

Количество элементов после СтрРазделить
Норма

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

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

Меньше или больше — проверяйте разделитель и пустые поля

Результат СтрНайти
Норма

Позиция больше 0

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

0 — маркер не найден, извлекать нельзя

Преобразование в число или дату
Норма

Значение корректного типа без исключения

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

Ошибка преобразования — в строке лишние символы

Поиск извлечённого значения в справочнике
Норма

Элемент найден

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

Не найден — проверьте пробелы, регистр и невидимые символы

Производительность при массовой обработке строк

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

Если обработка идёт на сервере, выносите разбор в серверную процедуру целиком: передача каждой строки с клиента на сервер по сети обойдётся дороже, чем весь парсинг. Для очень больших файлов читайте данные порциями через ЧтениеТекста, а не загружайте файл в память целиком.

Итог

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

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

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

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

Приведите все разделители к одному через последовательные вызовы СтрЗаменить (например, замените запятые и табуляции на точку с запятой), а затем примените СтрРазделить по единому разделителю. Это проще и быстрее, чем посимвольный анализ.

СтрРазделить возвращает меньше полей, чем ожидалось. В чём причина?

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

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

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

Можно ли использовать регулярные выражения на сервере Linux?

VBScript.RegExp недоступен вне Windows. Варианты: реализовать разбор строковыми функциями, вынести обработку на Windows-клиент или использовать внешние компоненты. Проверяйте доступность объекта через Попытка/Исключение с осмысленным сообщением об ошибке.

Как получить отдельную строку из многострочного текста?

Используйте СтрПолучитьСтроку(Текст, НомерСтроки) — она возвращает строку по номеру, а СтрЧислоСтрок даёт общее количество. Для массовой обработки эффективнее один раз разбить текст через СтрРазделить по Символы.ПС и работать с массивом.

Почему найденное значение не сравнивается со строкой-эталоном?

Почти всегда виноваты пробелы по краям, неразрывные пробелы (код 160) или разный регистр. Примените СокрЛП, удалите неразрывные пробелы через СтрЗаменить и сравнивайте через ВРег или НРег обеих сторон.