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

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

Как объединить массив в строку в 1С

Как объединить массив в строку в 1С: функция СтрСоединить, цикл по элементам, разделители, работа с разными типами данных и типичные ошибки разработчика.

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

Основной инструмент — встроенная функция СтрСоединить(), доступная в современных версиях платформы. Для старых конфигураций или нестандартных условий используют цикл с конкатенацией либо объект ЗаписьXML. Ниже разобраны все рабочие варианты, их ограничения и типичные ошибки.

Функция СтрСоединить — основной способ

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

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

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

МассивТоваров.Добавить("Хлеб");

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

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

// Результат: "Молоко, Хлеб, Сахар"

В качестве разделителя допустима любая строка: запятая с пробелом, точка с запятой, символ переноса строки Символы.ПС или даже пустая строка. Это удобно, когда нужно вывести список в многострочное поле или в сообщение пользователю.

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

Объединение массива в цикле для старых платформ

Если конфигурация работает на платформе ниже 8.3.6 или режим совместимости ограничивает использование новых функций, массив объединяют вручную. Классический приём — перебор элементов с добавлением разделителя перед каждым элементом, кроме первого.

Результат = "";

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

Если Результат <> "" Тогда

Результат = Результат + ", ";

КонецЕсли;

Результат = Результат + Элемент;

КонецЦикла;

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

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

Объединение массива с нестроковыми значениями

На практике массив часто содержит числа, ссылки на номенклатуру или даты. Перед объединением каждый элемент нужно привести к строке. Для чисел и дат достаточно функции Строка() или форматирования через Формат(), для ссылок платформа автоматически использует представление объекта.

МассивСтрок = Новый Массив;

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

МассивСтрок.Добавить(Строка(Элемент));

КонецЦикла;

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

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

Типичные ошибки
01
Передача в СтрСоединить массива с числами или ссылками без преобразования — возникает ошибка несоответствия типов
02
Лишний разделитель в конце строки при ручной сборке в цикле — результат выглядит как «Молоко, Хлеб, »
03
Использование конкатенации в цикле для десятков тысяч элементов — заметное падение производительности

Выбор разделителя под задачу

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

ЗадачаРекомендуемый разделительКомментарий
Сообщение пользователю", " или Символы.ПСЧитаемый вид списка
Список для печатной формы", " или ";"Компактная строка в ячейке
Обмен данными, служебная строка"|" или Символы.ТабРазделитель не должен встречаться в данных
Многострочное полеСимволы.ПСКаждый элемент с новой строки

Если строка потом будет разбираться обратно через СтрРазделить(), убедитесь, что разделитель не содержится внутри самих значений. Иначе при разборе получится больше элементов, чем было в исходном массиве.

Альтернативные подходы и смежные задачи

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

МассивНаименований = ТаблицаТоваров.ВыгрузитьКолонку("Наименование");

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

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

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

Проверка результата и граничные случаи

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

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

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

Пустой массив
Норма

Возвращается пустая строка без ошибок

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

Исключение или неопределённое значение

Массив из одного элемента
Норма

Строка равна самому элементу, разделителей нет

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

Лишний разделитель в начале или конце

Элементы-числа или ссылки
Норма

Все значения предварительно преобразованы в строки

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

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

Если в массиве могут встречаться значения Неопределено или NULL (например, после выгрузки из запроса), отфильтруйте их заранее или замените на осмысленную строку — иначе в результате появятся пустые фрагменты или неочевидные представления.

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

Чем СтрСоединить отличается от СтрШаблон?

СтрСоединить склеивает элементы массива через разделитель, а СтрШаблон подставляет параметры в шаблон вида «%1, %2». Это разные задачи: для объединения списка подходит только СтрСоединить, шаблон нужен для форматированных сообщений.

Можно ли объединить массив без разделителя?

Да. Вызовите СтрСоединить с одним параметром — массивом — или передайте пустую строку в качестве разделителя. Элементы будут склеены вплотную друг к другу.

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

Сначала выгрузите нужную колонку в массив методом ВыгрузитьКолонку("ИмяКолонки"), затем передайте полученный массив в СтрСоединить. Это короче и быстрее, чем перебор строк таблицы в цикле.

Что делать, если в массиве есть пустые элементы?

Перед объединением пройдите по массиву и удалите пустые значения или замените их. Если оставить как есть, в результирующей строке появятся двойные разделители вида «Молоко, , Хлеб».

Работает ли СтрСоединить на управляемых и обычных формах?

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

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

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

Итог

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

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