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

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

Как массив перевести в строку в 1С

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

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

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

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

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

Типичный вызов выглядит так:

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

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

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

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

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

// Результат: "Ноутбук, Мышь, Клавиатура"

Функция работает только со строковыми элементами. Если в массив попадёт число или ссылка, платформа в ряде случаев выполнит неявное преобразование, но полагаться на это не стоит: поведение зависит от контекста, а ссылочные типы могут дать представление вида «Документ 000001 от…», которое не всегда нужно пользователю.

Перевод массива в строку циклом

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

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

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

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

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

Результат = Результат + Разделитель;

КонецЕсли;

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

КонецЦикла;

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

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

Обратите внимание на приём: разделитель добавляется не после каждого элемента, а перед каждым, кроме первого. Это избавляет от необходимости обрезать хвост строки после цикла. Функция Строка() приводит элемент любого простого типа к строковому представлению, поэтому такой вариант универсален.

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

Порядок действий
  1. 1
    Определите тип элементов массива: строки или произвольные значения
  2. 2
    Для строкового массива вызовите СтрСоединить(Массив, Разделитель)
  3. 3
    Для смешанного массива сначала преобразуйте элементы через Строка() в новый массив
  4. 4
    Проверьте результат в отладчике или через Сообщить()
  5. 5
    Убедитесь, что в конце строки нет лишнего разделителя

Массив чисел, дат и ссылок

Когда в массиве лежат не строки, а, например, номера документов или даты, прямой вызов СтрСоединить может дать неожиданный результат. Число 1000 может вывестись как «1 000» с неразрывным пробелом, дата — в формате по умолчанию, а ссылка — как представление объекта. Чтобы управлять форматом, преобразуйте элементы явно.

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

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

МассивСтрок.Добавить(Формат(Элемент, "ЧГ="));

КонецЦикла;

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

Функция Формат() с параметром ЧГ= убирает группировку разрядов, что важно, если строка дальше пойдёт в запрос, файл обмена или HTTP-запрос. Для дат используйте Формат(Дата, "ДФ=yyyy-MM-dd"), чтобы получить предсказуемый вид независимо от региональных настроек сеанса.

Для ссылочных значений решите заранее, что должно попасть в строку: представление, наименование, код или номер. Представление удобно человеку, но может быть длинным и неуникальным; код и номер компактнее, но требуют обращения к данным объекта через точку, что для больших массивов ссылок порождает лишние запросы к базе.

Обратная задача: строку в массив

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

СтрокаДляХранения = СтрСоединить(МассивКодов, ";");

// ... позже:

ВосстановленныйМассив = СтрРазделить(СтрокаДляХранения, ";");

Если элементы могут содержать любые символы, простой разделитель не подходит — используйте сериализацию: ЗначениеВСтрокуВнутр() для внутреннего хранения или JSON через ЗаписьJSON для обмена с внешними системами. Это надёжнее, чем придумывать «редкий» разделитель.

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

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

Быстро и коротко, но только для массива строк и платформа 8.3.6+

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

Работает везде и с любыми типами, но медленнее на больших массивах

ЗначениеВСтрокуВнутр

Сохраняет типы и структуру, но результат нечитаем и годится только для внутреннего хранения

JSON

Подходит для обмена с внешними системами, требует больше кода

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

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

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

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

Если таблица содержит дубли, перед объединением имеет смысл свернуть её методом Свернуть("Номер") или удалить повторы вручную. Также проверьте, нет ли в колонке пустых значений: пустая строка среди элементов даст двойной разделитель вроде «А, , Б», что выглядит как ошибка.

Типичные ошибки
01
Разделитель в конце строки: добавление разделителя после каждого элемента без обрезки хвоста
02
Передача в СтрСоединить массива чисел или ссылок без предварительного преобразования
03
Группировка разрядов в числах: '1 000' вместо '1000' ломает дальнейший разбор строки
04
Выбор разделителя, который встречается в данных, из-за чего обратный разбор даёт лишние элементы
05
Обращение к реквизитам ссылок в цикле — лишние запросы к базе и падение производительности

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

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

По производительности: для массивов до нескольких сотен элементов разница между циклом и СтрСоединить незаметна. На десятках тысяч элементов конкатенация строк в цикле становится узким местом — в этом случае собирайте элементы в массив и один раз вызывайте СтрСоединить. Замерить время помогает функция ТекущаяУниверсальнаяДатаВМиллисекундах() до и после фрагмента кода.

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

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

Края строки
Норма

Нет разделителя в начале и в конце

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

Строка вида ', А, Б,' с висячими запятыми

Числа и даты
Норма

Ожидаемый формат без разделителей разрядов

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

Неразрывные пробелы в числах, дата в произвольном формате

Запись в реквизит
Норма

Вся строка сохранилась целиком

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

Хвост обрезан из-за ограничения длины реквизита

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

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

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

Чем СтрСоединить отличается от простого сложения строк?

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

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

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

Можно ли перевести в строку массив структур?

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

Что делать, если конфигурация работает на платформе ниже 8.3.6?

Используйте цикл с накоплением строки и проверкой на первый элемент, как показано в разделе про циклы. Такую функцию удобно вынести в общий модуль и вызывать из любого места конфигурации.

Как сохранить массив в реквизит и потом восстановить без потерь?

Если данные только строковые и разделитель контролируется — СтрСоединить и СтрРазделить. Для произвольных типов надёжнее ЗначениеВСтрокуВнутр с хранением результата в реквизите типа Строка неограниченной длины или в хранилище значения.

Итог

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

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