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