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

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

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

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

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

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

СтрСоединить — штатный способ объединения массива

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

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

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

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

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

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

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

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

Объединение массива в строку через цикл

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

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

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

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

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

КонецЕсли;

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

КонецЦикла;

Цикл даёт полный контроль: можно пропускать пустые элементы, обрамлять значения кавычками, нумеровать позиции или применять разные разделители для разных частей массива. Например, для списка в сообщении об ошибке часто добавляют номер строки через индекс массива.

У цикла есть особенность производительности: строки в 1С неизменяемы, и каждая конкатенация создаёт новую строку в памяти. На массивах из десятков и сотен элементов это незаметно, но при сборке очень длинных строк (десятки тысяч элементов) накопление через + начинает тормозить. В таких случаях элементы выгоднее сначала собрать в массив фрагментов и один раз вызвать СтрСоединить.

Порядок действий при объединении циклом
  1. 1
    Объявите переменную-результат как пустую строку
  2. 2
    Переберите массив циклом «Для Каждого»
  3. 3
    Перед каждым элементом, кроме первого, добавьте разделитель
  4. 4
    Добавьте сам элемент к результату
  5. 5
    После цикла проверьте итоговую строку в отладчике или выведите в сообщение

Массив со ссылками, числами и другими типами

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

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

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

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

МассивСтрок.Добавить(СокрЛП(Ссылка.Код) + " — " + Строка(Ссылка));

КонецЦикла;

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

Отдельный подводный камень — значение Неопределено или NULL в массиве. Их строковое представление — пустая строка, поэтому в итоге появятся двойные разделители вида «Стул, , Шкаф». Перед объединением такие элементы стоит отфильтровать или заменить осмысленным текстом.

Типичные ошибки
01
Передача в СтрСоединить списка значений вместо массива — функция принимает только массив, список нужно сначала выгрузить через ВыгрузитьЗначения()
02
Разделитель в конце строки при ручном цикле — результат вида «Стул, Стол, » ломает дальнейший разбор строки
03
Игнорирование NULL и Неопределено — в строке появляются пустые позиции и двойные разделители
04
Использование представления ссылки без проверки — для документов оно включает дату и может не совпасть с ожиданиями пользователя

Обратная задача: строка в массив через СтрРазделить

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

Исходная = "Стул, Стол, Шкаф";

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

// Массив из трёх элементов

Третий параметр управляет включением пустых подстрок. По умолчанию он равен Истина, и строка «А,,Б» даст три элемента, средний из которых пустой. Если пустые значения не нужны, передайте Ложь. Учтите: если сам разделитель встречается внутри данных (например, запятая в наименовании товара), обратное разделение будет некорректным — выбирайте разделитель, который гарантированно не встречается в значениях, либо используйте сериализацию.

Альтернативы: запрос, JSON и список значений

Когда массив состоит из ссылок и нужна строка с представлениями, иногда выгоднее не перебирать элементы в коде, а передать массив параметром в запрос и собрать строку на стороне СУБД. Однако стандартный язык запросов 1С не имеет функции агрегации строк — придётся выбрать представления и соединить их уже в коде, поэтому выигрыш лишь в том, что не нужно отдельно получать реквизиты каждой ссылки.

Для обмена данными с внешними системами массив часто преобразуют не в «плоскую» строку, а в JSON через ЗаписьJSON. Такой формат сохраняет типы и структуру, не боится разделителей внутри данных и легко читается на принимающей стороне. Для внутренних задач конфигурации это избыточно, но для HTTP-запросов и файлов обмена — предпочтительный вариант.

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

Сравнение вариантов

СтрСоединить

Основной способ на платформе 8.3.6+. Короткий и быстрый, но требует массив и не управляет форматированием элементов

Цикл с конкатенацией

Работает на любой версии, позволяет фильтровать и форматировать элементы. Медленнее на очень больших объёмах

JSON-сериализация

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

Запрос с параметром-массивом

Удобен, когда нужны реквизиты ссылок из базы. Строку всё равно придётся собирать в коде после выборки

Проверка результата и отладка

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

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

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

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

Начало и конец строки
Норма

Строка начинается и заканчивается значением элемента

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

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

Разделители между элементами
Норма

Между элементами ровно один разделитель

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

Встречаются двойные разделители — в массиве были пустые элементы

Длина при записи в реквизит
Норма

Строка помещается в реквизит целиком

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

Конец строки обрезан — превышена длина реквизита

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

СтрСоединить выдаёт ошибку «функция не определена». В чём причина?

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

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

Сначала преобразуйте каждое число функцией Формат с параметром "ЧГ=0", который отключает группировку разрядов, и соберите результаты в новый массив строк. Затем примените СтрСоединить к этому массиву. Если передать числа напрямую, платформа вставит неразрывные пробелы между разрядами.

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

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

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

Используйте символ, который гарантированно отсутствует в данных: вертикальную черту, точку с запятой или служебные символы вроде Символ(31). Если строка будет разбираться обратно и полностью исключить совпадения нельзя, откажитесь от плоской строки в пользу JSON — он надёжно сохраняет любые значения.

Как вывести каждый элемент массива с новой строки?

Передайте в качестве разделителя Символы.ПС: СтрСоединить(Массив, Символы.ПС). Для вывода в макет Word или HTML может потребоваться другой перенос — Символы.ВК + Символы.ПС или тег перевода строки соответственно.

Что вернёт СтрСоединить для пустого массива?

Пустую строку, без ошибки. Это удобно: не нужна отдельная проверка перед вызовом. Но учтите, что пустая строка-результат неотличима от случая, когда массив содержал только пустые элементы, — при необходимости проверяйте количество элементов отдельно.

Итог

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

На платформе 8.3.6 и новее массив преобразуется в строку функцией СтрСоединить с указанием разделителя. На старых версиях и при необходимости форматирования элементов используют цикл. Перед объединением приводите элементы к строкам явно, отфильтровывайте NULL и Неопределено, а для обмена с внешними системами предпочитайте JSON вместо плоской строки.