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

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

Основной инструмент, который предоставляет платформа для этих целей, — это функция СтрРазделить. Она позволяет быстро получить массив строк, разбив исходный текст по указанному разделителю. Однако, как и любой другой инструмент, она требует внимательного отношения к параметрам, особенно когда речь идет о пустых значениях или пробелах.

Использование встроенной функции СтрРазделить

Начиная с платформы 1С версии 8.3.10, разработчикам стала доступна универсальная функция СтрРазделить. Это наиболее эффективный способ преобразования строки в массив, так как он реализован на уровне ядра системы и работает быстрее любых пользовательских циклов. Функция принимает строку и разделитель, возвращая массив строк.

Важно отметить, что поведение функции зависит от второго параметра — режима разделения. Вы можете указать, нужно ли включать пустые подстроки в результат. Например, если у вас есть строка "А;Б;;Г", то при включении пустых строк вы получите массив из четырех элементов, где третий будет пустым. Если же этот флаг выключен, массив будет содержать только три элемента.

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

ИсходнаяСтрока = "Яблоко,Груша,Апельсин";

МассивЭлементов = СтрРазделить(ИсходнаяСтрока, ",", Ложь);

// Результат: Массив из 3 элементов без пустых строк

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

💡

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

Обработка пробелов и пустых значений

Одна из самых частых проблем при преобразовании строки в массив в — это наличие лишних пробелов вокруг разделителей. Пользователи часто вводят данные небрежно: "Москва , Санкт-Петербург , Казань". Прямое применение функции разделения приведет к тому, что элементы массива будут содержать лидирующие или замыкающие пробелы, что может вызвать ошибки при последующем поиске или сравнении.

Чтобы избежать этой ситуации, необходимо либо предварительно очищать строку, либо обрабатывать каждый элемент массива после разделения. В современных версиях платформы удобно использовать метод СокрЛП внутри цикла. Это позволяет привести данные к единому стандарту без потери производительности на больших объемах информации.

Также стоит обратить внимание на параметр ВключатьПустыеПодстроки в функции СтрРазделить. Если этот параметр установлен в Истина, то последовательные разделители будут порождать пустые элементы в массиве. Это полезно при импорте структурированных данных, где позиция элемента имеет значение, но вредно при обработке простых списков.

  • 🧹 Используйте СокрЛП() для каждого элемента сразу после создания массива.
  • 🚫 Избегайте двойных пробелов в исходных данных перед разбиением.
  • ✅ Проверяйте длину элемента массива перед обработкой, чтобы игнорировать пустые строки.
⚠️ Внимание: Если вы обрабатываете данные, введенные пользователем вручную, никогда не полагайтесь на то, что разделитель будет окружен пробелами одинаково. Всегда используйте алгоритмы "умной" очистки.
📊 Как вы обычно обрабатываете пробелы в списках?
Обрезаю всю строку заранее
Чищу каждый элемент в цикле
Игнорирую проблему
Использую регулярные выражения

Ручное преобразование через цикл (для старых версий)

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

Алгоритм ручного преобразования строки в массив выглядит следующим образом: мы ищем позицию первого разделителя, вырезаем часть строки до него и добавляем в массив. Затем сдвигаем указатель на строке и повторяем процесс до тех пор, пока разделители не закончатся. Оставшаяся часть строки добавляется как последний элемент.

Функция РазбитьСтрокуВМассив(Строка, Разделитель)

Массив = Новый Массив;

Пока Истина Цикл

Позиция = СтрНайти(Строка, Разделитель);

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

Массив.Добавить(Строка);

Прервать;

КонецЕсли;

Массив.Добавить(СтрЛев(Строка, Позиция - 1));

Строка = СтрСред(Строка, Позиция + СтрДлина(Разделитель));

КонецЦикла;

Возврат Массив;

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

Такой метод позволяет реализовать сложную логику, например, пропускать определенные комбинации символов или учитывать вложенность структур, что стандартная функция сделать не может. Однако стоит учитывать, что частые вызовы СтрЛев и СтрСред могут замедлить работу на очень длинных строках (более 100 тысяч символов).

Оптимизация ручного цикла

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

Работа со специальными разделителями

В реальных задачах данные редко разделяются только запятыми. Часто встречаются табуляции, переносы строк (Символы.ПС), многосимвольные разделители (например, "###") или даже регулярные выражения. Платформа позволяет использовать любые строковые последовательности в качестве разделителя в функции СтрРазделить.

Особое внимание следует уделить разделителям, которые могут встречаться внутри самих данных. Классический пример — CSV-файл, где поля разделены запятыми, но внутри текстового поля тоже может быть запятая. В таких случаях простое преобразование строки в массив приведет к разрушению структуры данных. Необходимо использовать специализированные парсеры или предварительно экранировать данные.

Если вы работаете с переносами строк, помните о различиях между операционными системами. В Windows перенос строки — это два символа (Символы.ПС + Символы.ВК), а в Linux — один. При импорте данных из внешних систем жесткое указание разделителя может не сработать, если кодировка или стиль строк отличаются.

Тип разделителя Пример кода 1С Особенности использования
Запятая "," Стандарт для CSV, требует обработки кавычек
Точка с запятой ";" Часто используется в Excel-экспорте в РФ
Перенос строки Символы.ПС Зависит от ОС, может быть парным символом
Табуляция Символы.ТАБ Удобно для TSV файлов, редко встречается в тексте
Многосимвольный "||" Безопасен для текста, но увеличивает объем данных
⚠️ Внимание: При использовании символа табуляции убедитесь, что редактор кода 1С отображает его корректно, иначе вы можете случайно использовать пробел вместо табуляции.

Преобразование массива обратно в строку

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

Функция принимает массив строк и разделитель, который будет вставлен между элементами. Важно соблюдать симметрию: если вы разбивали строку по запятой, то и соединять лучше по запятой, чтобы сохранить формат данных. Однако при необходимости форматирование можно изменить, добавив пробелы или красивые отступы.

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

МассивГородов = Новый Массив;

МассивГородов.Добавить("Москва");

МассивГородов.Добавить("Казань");

Результат = СтрСоединить(МассивГородов, ", ");

// Результат: "Москва, Казань"

💡

Пара функций СтрРазделить и СтрСоединить является основным инструментом для работы со списками значений в текстовом виде в экосистеме 1С.

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

При работе с большими объемами текстовых данных неопытные разработчики часто совершают ошибки, связанные с производительностью. Создание нового массива внутри цикла или многократная конкатенация строк без использования буферов может привести к существенному замедлению работы конфигурации .

Еще одной распространенной ошибкой является игнорирование кодировки. Если строка пришла из внешнего источника в кодировке UTF-8, а система работает с Win-1251, символы разделителей могут быть искажены. Перед преобразованием строки в массив всегда выполняйте проверку или конвертацию кодировки, если источник данных внешний.

Также стоит избегать использования функции СтрЗаменить для удаления разделителей перед разбиением, если в этом нет острой необходимости. Лишние проходы по строке увеличивают время обработки. Лучше настроить параметры функции СтрРазделить так, чтобы она сразу выдавала чистый результат.

  • 🚀 Не создавайте массивы в цикле, если можно использовать один заранее объявленный.
  • 💾 Проверяйте кодировку входящих данных перед парсингом.
  • ⚡ Используйте встроенные функции вместо самописных циклов там, где это возможно.
⚠️ Внимание: Интерфейс и доступные функции могут незначительно отличаться в разных релизах платформы 1С:Предприятие. Всегда сверяйтесь с синтакс-помощником вашей конкретной версии.

☑️ Проверка перед запуском кода

Выполнено: 0 / 5

FAQ: Часто задаваемые вопросы

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

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

Что вернет функция, если разделитель не найден в строке?

Если указанный разделитель отсутствует в исходной строке, функция СтрРазделить вернет массив, состоящий из одного элемента — самой исходной строки. Ошибки при этом не возникнет.

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

Встроенными средствами платформы 1С регулярные выражения для разделения строк не поддерживаются напрямую. Для этого необходимо использовать внешние библиотеки .NET (класс Regex) или писать сложный парсер вручную, если функционал .NET недоступен.

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

Самый быстрый способ — использовать фильтр при создании массива, если вы пишете свой код. Если используете СтрРазделить, передайте параметр ВключатьПустыеПодстроки равным Ложь. Если пустые строки уже есть, пройдитесь по массиву в цикле и удалите элементы, где СтрДлина равна 0.

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

Ограничение на длину строки в 1С составляет около 2 миллиардов символов, но на практике производительность начинает падать на строках длиной более 10-50 мегабайт. Для обработки огромных текстовых файлов рекомендуется использовать потоковое чтение, а не загрузку всей строки в память.