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

Вы узнаете, как правильно применять СтрРазделить(), РазложитьСтрокуВМассив(), работать с символами-разделителями разных типов, обрабатывать пустые элементы и оптимизировать код для больших объемов данных. Материал будет полезен как начинающим разработчикам , так и опытным программистам, которые хотят систематизировать знания по работе со строками.

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

1. Стандартная функция СтрРазделить(): синтаксис и базовые примеры

Функция СтрРазделить() — самый простой и распространенный способ разбить строку на подстроки. Она возвращает массив строк, полученных в результате разделения исходной строки по указанному разделителю. Основной синтаксис:

МассивПодстрок = СтрРазделить(ИсходнаяСтрока, Разделитель[, ВключатьПустые = Ложь[, НеЧувствительноКРегистру = Ложь]]);

Рассмотрим базовый пример. Допустим, у нас есть строка с ФИО через запятую, и мы хотим получить отдельно фамилию, имя и отчество:

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

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

// Результат: ["Иванов", "Иван", "Иванович"]

Обратите внимание на третий параметр ВключатьПустые. Если в строке встречаются подряд идущие разделители (например, "а,,б"), по умолчанию пустые элементы игнорируются. Чтобы их сохранить, передайте Истина:

СтрокаСПустыми = "яблоко,,груша,";

Результат = СтрРазделить(СтрокаСПустыми, ",", Истина);

// Результат: ["яблоко", "", "груша", ""]

⚠️ Внимание: При работе с большими строками (>10 000 символов) функция СтрРазделить() может замедлять выполнение кода. В таких случаях рассмотрите альтернативные методы из следующих разделов.
  • 🔹 Простой разделитель: Подходит для фиксированных символов (запятая, точка с запятой, пробел). Пример: СтрРазделить("1;2;3", ";")
  • 🔹 Множественные разделители: Можно передать строку из нескольких символов, но разделение будет происходить по каждому из них по отдельности. Пример: СтрРазделить("1,2;3", ",;") разобьет строку на ["1", "2", "3"]
  • 🔹 Регистрозависимость: По умолчанию учитывается регистр. Чтобы игнорировать, используйте 4-й параметр: СтрРазделить("А,а,А", ",", Ложь, Истина)

2. РазложитьСтрокуВМассив(): альтернатива с расширенными возможностями

Функция РазложитьСтрокуВМассив() появилась в 1С:Предприятие 8.3.10 и предлагает более гибкие настройки разделения. Ее ключевое отличие — возможность указывать несколько разделителей сразу как массив, а также управлять обработкой пустых элементов и регистром.

Синтаксис функции:

МассивПодстрок = РазложитьСтрокуВМассив(ИсходнаяСтрока, МассивРазделителей[, РежимПустых = РежимПустыхПодстрок.Игнорировать[, ЧувствительностьКРегистру = Ложь]]);

Перечисление РежимПустыхПодстрок может принимать значения:

  • Игнорировать — пропускать пустые элементы (по умолчанию)
  • Включать — сохранять пустые элементы в массиве
  • Объединять — заменять несколько подряд идущих разделителей на один

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

Текст = "яблоко, груша; слива | вишня";

Разделители = Новый Массив;

Разделители.Добавить(",");

Разделители.Добавить(";");

Разделители.Добавить("|");

Результат = РазложитьСтрокуВМассив(Текст, Разделители, РежимПустыхПодстрок.Включать);

// Результат: ["яблоко", " груша", " слива ", " вишня"]

⚠️ Внимание: Функция РазложитьСтрокуВМассив() обрабатывает пробелы как часть подстрок. Если вам нужны "чистые" элементы без пробелов, используйте СокрЛП() для каждого элемента массива:

Для Каждого Элемент Из Результат Цикл

Элемент = СокрЛП(Элемент);

КонецЦикла;

📊 Какой функцией вы чаще пользуетесь для разделения строк?
СтрРазделить()
РазложитьСтрокуВМассив()
Регулярные выражения
Собственные алгоритмы

3. Разделение строки по регулярным выражениям

Когда разделители имеют сложную структуру (например, несколько символов подряд или динамические паттерны), на помощь приходят регулярные выражения. В для этого используется объект РегулярноеВыражение с методом Разбить().

Основные преимущества этого подхода:

  • 🔹 Возможность использовать сложные шаблоны (например, [\s,;]+ для любого количества пробелов, запятых или точек с запятой)
  • 🔹 Гибкая обработка многобайтовых символов (кириллица, иероглифы)
  • 🔹 Поддержка групп захвата для извлечения частей строки по маске

Пример: разделение строки по одному или нескольким пробелам/табуляциям:

Текст = "   Москва    Санкт-Петербург  Казань";

РегВыр = Новый РегулярноеВыражение("\s+");

Результат = РегВыр.Разбить(Текст);

// Результат: ["Москва", "Санкт-Петербург", "Казань"]

Более сложный пример — извлечение чисел из строки с произвольными разделителями:

СтрокаСЧислами = "Артикул:12345, Цена:789.50 руб., Кол-во:3";

РегВыр = Новый РегулярноеВыражение("(\d+\.?\d*)");

Совпадения = РегВыр.НайтиВсе(СтрокаСЧислами);

МассивЧисел = Новый Массив;

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

МассивЧисел.Добавить(Совпадение.Значение);

КонецЦикла;

// Результат: ["12345", "789.50", "3"]

💡

Для ускорения работы с регулярными выражениями всегда компилируйте шаблон заранее (до цикла обработки данных), а не создавайте новый объект РегулярноеВыражение на каждой итерации.

4. Разделение строки по фиксированной длине подстрок

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

Функция РазбитьПоДлине(Строка, ДлинаЧасти)

Результат = Новый Массив;

ДлинаСтроки = СтрДлина(Строка);

КолвоЧастей = Цел(ДлинаСтроки / ДлинаЧасти) + ?(ДлинаСтроки % ДлинаЧасти > 0, 1, 0);

Для Инд = 0 По КолвоЧастей - 1 Цикл

Начало = Инд * ДлинаЧасти + 1;

Конец = Мин(Начало + ДлинаЧасти - 1, ДлинаСтроки);

Результат.Добавить(Сред(Строка, Начало, Конец - Начало + 1));

КонецЦикла;

Возврат Результат;

КонецФункции

Пример использования:

ИНН = "7707083893";

ЧастиИНН = РазбитьПоДлине(ИНН, 3);

// Результат: ["770", "708", "389", "3"]

Этот метод особенно полезен при работе с:

  • 🔢 Банковскими реквизитами: БИК (9 символов), корр.счет (20 символов)
  • 🔢 Идентификаторами: ИНН (10 или 12 символов), ОГРН (13 или 15 символов)
  • 🔢 Данными из фиксированных форматов: DBF, текстовые отчеты с колонками фиксированной ширины

Оптимизация для больших строк

Если строка очень длинная (>100 000 символов), вместо функции Сред() в цикле лучше использовать ПозицияПоНомеруСтроки() с предварительным расчетом позиций. Это уменьшает количество операций над строкой и ускоряет выполнение.

5. Обработка специальных случаев: пустые элементы, экранирование, многобайтовые символы

При разделении строк часто возникают неочевидные проблемы, которые приводят к ошибкам или некорректным результатам. Рассмотрим типичные случаи и способы их решения.

Проблема Причина Решение
Пропущены элементы в результате В строке есть подряд идущие разделители, а параметр ВключатьПустые=Ложь Использовать ВключатьПустые=Истина или РежимПустыхПодстрок.Включать
Некорректное разделение по точке Точка воспринимается как часть числа (например, "1.5") Использовать регулярные выражения с явным указанием разделителя: РегВыр = Новый РегулярноеВыражение("\.");
Разделитель содержит спецсимволы (\n, \t) Символы новой строки или табуляции не обрабатываются как разделители Заменить на явные символы: СтрЗаменить(Строка, Символы.ПС, "|"), затем разделить по "|"
Многобайтовые символы (кириллица, иероглифы) обрезаются Неправильная кодировка строки или использование Сред() по байтам Всегда работать со строками в Юникоде, использовать СтрДлина() вместо БайтДлина()

Особый случай — экранирование разделителей. Если разделитель может встречаться внутри элементов (например, запятая в кавычках: "Иванов, \"Иван, Петрович\""), стандартные функции не справятся. Здесь поможет парсинг с учетом контекста:

Функция РазделитьСЭкранированием(Строка, Разделитель)

Результат = Новый Массив;

ТекущаяПодстрока = "";

ВКавычках = Ложь;

Для Инд = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, Инд, 1);

Если Символ = """" Тогда

ВКавычках = Не ВКавычках;

ИначеЕсли Символ = Разделитель И Не ВКавычках Тогда

Результат.Добавить(ТекущаяПодстрока);

ТекущаяПодстрока = "";

Продолжить;

КонецЕсли;

ТекущаяПодстрока = ТекущаяПодстрока + Символ;

КонецЦикла;

Если Не ПустаяСтрока(ТекущаяПодстрока) Тогда

Результат.Добавить(ТекущаяПодстрока);

КонецЕсли;

Возврат Результат;

КонецФункции

6. Практическое применение: примеры из реальных задач

Рассмотрим типичные сценарии, где требуется разделение строк, и оптимальные способы их решения.

6.1. Парсинг CSV-файлов

При импорте данных из CSV часто встречаются строки вида:

"Иванов";"Иван Иванович";"1980-05-15";"Москва, ул. Ленина, д.1"

Для корректного разделения с учетом кавычек и запятых внутри полей:

ТекстCSV = '"Иванов";"Иван Иванович";"1980-05-15";"Москва, ул. Ленина, д.1"';

РегВыр = Новый РегулярноеВыражение('"(?:[^"]|"")*"');

Совпадения = РегВыр.НайтиВсе(ТекстCSV);

Данные = Новый Массив;

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

Поле = Сред(Совпадение.Значение, 2, СтрДлина(Совпадение.Значение) - 2);

Поле = СтрЗаменить(Поле, '""', '"');

Данные.Добавить(Поле);

КонецЦикла;

6.2. Разбор адреса на компоненты

Адрес вида "г. Москва, ул. Тверская, д. 10, стр. 1, кв. 12" можно разбить на части по запятым, но требуется дополнительная обработка:

Адрес = "г. Москва, ул. Тверская, д. 10, стр. 1, кв. 12";

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

Для Инд = 0 По ЧастиАдреса.ВГраница() Цикл

ЧастиАдреса[Инд] = СокрЛП(ЧастиАдреса[Инд]);

КонецЦикла;

6.3. Обработка логов

Строки логов часто имеют фиксированный формат:

[2026-01-15 14:30:45] [ERROR] Не удалось подключиться к базе: timeout

Для извлечения даты, уровня и сообщения:

СтрокаЛога = "[2026-01-15 14:30:45] [ERROR] Не удалось подключиться к базе: timeout";

РегВыр = Новый РегулярноеВыражение("\[([^\]]+)\] \[([^\]]+)\] (.+)");

Найдено = РегВыр.Найти(СтрокаЛога);

Если Найдено Тогда

ДатаВремя = Найдено.Группа(1);

Уровень = Найдено.Группа(2);

Сообщение = Найдено.Группа(3);

КонецЕсли;

💡

Для обработки больших файлов логов (>100 МБ) используйте потоковое чтение с построчной обработкой, а не загружайте весь файл в память. Это предотвратит ошибки нехватки памяти.

7. Оптимизация производительности при работе с большими строками

При обработке больших объемов данных (например, текстовые файлы размером >10 МБ) стандартные функции могут работать медленно. Вот ключевые рекомендации по оптимизации:

  • 🚀 Избегайте вложенных циклов: Если вам нужно разделить строки в цикле, вынесите подготовку регулярных выражений или других объектов за пределы цикла.
  • 🚀 Используйте буферизацию: При чтении больших файлов считывайте данные блоками по 4096–8192 байта, а не построчно.
  • 🚀 Минимизируйте операции со строками: Замена Строка = Строка + Подстрока на МассивСтрок.Добавить(Подстрока) с последующим СтрСокр(МассивСтрок.Склеить("")) ускоряет работу в 2–3 раза.
  • 🚀 Кэшируйте регулярные выражения: Создавайте объект РегулярноеВыражение один раз и используйте его повторно.

Пример оптимизированного кода для разделения большого текста:

// Подготовка (выполняется один раз!)

РегВырРазделитель = Новый РегулярноеВыражение("\r?\n");

// Основной цикл обработки

Текст = ПолучитьБольшойТекст(); // Например, из файла

Строки = РегВырРазделитель.Разбить(Текст);

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

// Обработка каждой строки

Если Не ПустаяСтрока(СокрЛП(Строка)) Тогда

// Ваша логика

КонецЕсли;

КонецЦикла;

Критическая информация: При работе с строками длиной более 1 000 000 символов в 1С:Предприятие 8.3 возможно возникновение ошибки "Превышен максимальный размер строки". В этом случае разбейте исходную строку на части по 500 000–800 000 символов и обрабатывайте их отдельно.

8. Типичные ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при разделении строк. Вот самые распространенные из них:

  1. Игнорирование кодировки: При чтении строк из файлов или внешних источников не учитывается кодировка (например, UTF-8 vs Windows-1251). Это приводит к "кракозябрам" или некорректному разделению.
    ⚠️ Внимание: Всегда явно указывайте кодировку при чтении файлов: Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8).Прочитать();
  2. Неучет регистра: По умолчанию функции чувствительны к регистру. Если разделитель может быть в разных регистрах (например, "Key" и "KEY"), используйте параметр НеЧувствительноКРегистру=Истина.
  3. Пустые элементы в начале/конце: Если строка начинается или заканчивается разделителем, стандартные функции могут пропустить пустые элементы. Проверяйте результат на соответствие ожидаемому количеству подстрок.
  4. Неэкранированные разделители: В строках вида "1, \"2, 3\", 4" запятая внутри кавычек воспринимается как разделитель. Используйте специализированные парсеры для таких случаев.

Для отладки сложных случаев рекомендуем использовать пошаговое выполнение кода в отладчике с выводом промежуточных значений в отладочное окно:

// Пример отладочного вывода

Для Каждого Элемент Из МассивПодстрок Цикл

Сообщить(СтрШаблон("Элемент %1: '%2'", Инд, Элемент));

КонецЦикла;

Как отладить регулярное выражение?

Используйте онлайн-сервисы вроде regex101.com для тестирования шаблонов. В выводите группы совпадений в отладочное окно:

Найдено = РегВыр.Найти(Строка);

Если Найдено Тогда

Для НомГруппы = 0 По Найдено.КоличествоГрупп() - 1 Цикл

Сообщить(СтрШаблон("Группа %1: '%2'", НомГруппы, Найдено.Группа(НомГруппы)));

КонецЦикла;

КонецЕсли;

FAQ: Ответы на частые вопросы

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

Используйте функцию РазложитьСтрокуВМассив() с массивом разделителей:

Разделители = Новый Массив;

Разделители.Добавить(",");

Разделители.Добавить(";");

Результат = РазложитьСтрокуВМассив("а,б;в", Разделители);

Или регулярное выражение:

РегВыр = Новый РегулярноеВыражение("[,;]");

Результат = РегВыр.Разбить("а,б;в");

Почему функция СтрРазделить() пропускает элементы в результате?

Скорее всего, в строке есть подряд идущие разделители (например, "а,,б"), а параметр ВключатьПустые установлен в Ложь (значение по умолчанию). Чтобы сохранить пустые элементы, передайте Истина:

СтрРазделить("а,,б", ",", Истина); // Результат: ["а", "", "б"]
Как разделить строку на слова (по пробелам, табуляциям и переносам строк)?

Используйте регулярное выражение для всех видов пробелов:

РегВыр = Новый РегулярноеВыражение("\s+");

Слова = РегВыр.Разбить(" привет мир\n1С ");

Результат: ["привет", "мир", "1С"] (без пустых элементов).

Можно ли разделить строку по шаблону, а не по фиксированному разделителю?

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

РегВыр = Новый РегулярноеВыражение("[,\s]+");

Результат = РегВыр.Разбить("а, б в,,г"); // ["а", "б", "в", "", "г"]

Или по датам в формате ГГГГ-ММ-ДД:

РегВыр = Новый РегулярноеВыражение("\d{4}-\d{2}-\d{2}");

Текст = "Событие1 2026-01-15 Событие2 2026-01-16";

Части = РегВыр.Разбить(Текст); // ["Событие1 ", " Событие2 "]

Как разделить строку на части фиксированной длины, если длина не кратна длине строки?

В этом случае последняя часть будет короче остальных. Пример для длины части = 3:

Функция РазбитьПоДлине(Строка, ДлинаЧасти)

Результат = Новый Массив;

Остаток = Строка;

Пока СтрДлина(Остаток) > 0 Цикл

Результат.Добавить(Лев(Остаток, Мин(ДлинаЧасти, СтрДлина(Остаток))));

Остаток = Сред(Остаток, ДлинаЧасти + 1);

КонецЦикла;

Возврат Результат;

КонецФункции

Результат = РазбитьПоДлине("1234567", 3); // ["123", "456", "7"]