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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Результат: "Стол, Стул, Шкаф"

Функция работает быстро и не требует ручного контроля последнего разделителя — это её главное преимущество перед циклом. Возвращаемое значение всегда имеет тип «Строка», даже если массив пуст: в этом случае результатом будет пустая строка.

Соединение массива с нестроковыми элементами

На практике массив редко содержит готовые строки. Чаще это ссылки на справочники, числа из табличной части или даты. Перед соединением пройдите по массиву и приведите каждый элемент к нужному строковому виду.

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

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

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

КонецЦикла;

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

Для чисел вместо Строка() лучше использовать Формат(Число, "ЧГ=0") — это уберёт неразрывные пробелы-разделители групп разрядов, которые Строка() добавляет автоматически. Такой пробел внутри числа часто ломает последующий разбор строки или выгрузку в файл.

Для дат применяйте Формат(Дата, "ДЛФ=D") или другой нужный формат. Если элементы массива — строки табличной части, собирайте нужные реквизиты вручную: например, СтрокаТЧ.Номенклатура + " x " + Формат(СтрокаТЧ.Количество, "ЧГ=0").

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

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

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

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

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

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

КонецЕсли;

Результат = Результат + СокрЛП(Элемент);

КонецЦикла;

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

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

Разделители, переносы строк и специальные случаи

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

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

Производительность и большие массивы

При соединении десятков тысяч элементов конкатенация строк в цикле оператором «+» может работать заметно медленно, так как каждая операция создаёт новую строку в памяти. Функция СтрСоединить внутри платформы оптимизирована и предпочтительна для больших массивов.

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

Типичные ошибки
01
Передача в СтрСоединить массива чисел или ссылок без преобразования — ошибка выполнения
02
Лишний разделитель в конце строки при ручной склейке в цикле
03
Использование Строка() для чисел — в результат попадают неразрывные пробелы групп разрядов
04
Склейка данных с разделителем, который встречается внутри самих элементов
05
Игнорирование пустых элементов массива — в строке появляются двойные разделители

Проверка результата и обработка крайних случаев

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

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

Строка без разделителей

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

Разделитель в начале или конце строки

Числовые элементы
Норма

Числа без пробелов между разрядами

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

Пробелы внутри чисел

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

Пустая строка, код продолжает работать

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

Ошибка или неожиданное значение по умолчанию

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

Чем соединить массив в строку на платформе 8.2?

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

Как соединить массив с переносом строки?

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

Почему СтрСоединить выдаёт ошибку на массиве чисел?

Функция принимает только массив строк. Преобразуйте каждый элемент: Формат(Число, "ЧГ=0") для чисел без разделителей групп или Строка(Элемент) для ссылок.

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

Либо добавляйте разделитель только если накопленная строка непустая, либо после цикла отрежьте его: Результат = Лев(Результат, СтрДлина(Результат) - СтрДлина(Разделитель)).

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

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

Итог

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

Основной инструмент — СтрСоединить(Массив, Разделитель) на платформе 8.3.6 и новее. Нестроковые элементы заранее приводите к строке через Формат() или Строка(), пустые значения фильтруйте. На старых платформах соединяйте в цикле с контролем последнего разделителя и проверяйте крайние случаи: пустой массив и один элемент.