Разработка и Конфигурация · 9 мин
Как массив перевести в строку в 1С
Как перевести массив в строку в 1С: функция СтрСоединить, цикл со Строка(), разделители, работа с таблицей значений, типичные ошибки и примеры кода.
Перевод массива в строку — рутинная задача при разработке на встроенном языке 1С: список товаров нужно вывести в сообщение, набор номеров документов — записать в комментарий, а значения отбора — показать пользователю одной строкой. В зависимости от версии платформы и состава элементов массива применяются разные подходы: штатная функция СтрСоединить, ручной обход в цикле или промежуточная таблица значений.
Главный критерий выбора — тип элементов массива. Если все элементы уже являются строками, задача решается одной функцией. Если в массиве лежат числа, даты или ссылки, потребуется предварительное преобразование каждого элемента, иначе в итоговой строке появятся нечитаемые представления или ошибка исполнения.
Функция СтрСоединить — основной способ
В платформе 1С:Предприятие 8.3.6 и новее есть встроенная функция СтрСоединить(Строки, Разделитель). Первый параметр — массив строк, второй — необязательный разделитель, который будет вставлен между элементами. Если разделитель не указан, элементы склеиваются вплотную.
Типичный вызов выглядит так:
МассивТоваров = Новый Массив;
МассивТоваров.Добавить("Ноутбук");
МассивТоваров.Добавить("Мышь");
МассивТоваров.Добавить("Клавиатура");
Результат = СтрСоединить(МассивТоваров, ", ");
// Результат: "Ноутбук, Мышь, Клавиатура"
Функция работает только со строковыми элементами. Если в массив попадёт число или ссылка, платформа в ряде случаев выполнит неявное преобразование, но полагаться на это не стоит: поведение зависит от контекста, а ссылочные типы могут дать представление вида «Документ 000001 от…», которое не всегда нужно пользователю.
Перевод массива в строку циклом
Классический вариант, работающий на любой версии платформы, — обход массива в цикле с накоплением результата. Здесь важно правильно расставить разделители, чтобы в конце строки не остался лишний символ.
Функция МассивВСтроку(Массив, Разделитель = ", ") Экспорт
Результат = "";
Для Каждого Элемент Из Массив Цикл
Если Не ПустаяСтрока(Результат) Тогда
Результат = Результат + Разделитель;
КонецЕсли;
Результат = Результат + Строка(Элемент);
КонецЦикла;
Возврат Результат;
КонецФункции
Обратите внимание на приём: разделитель добавляется не после каждого элемента, а перед каждым, кроме первого. Это избавляет от необходимости обрезать хвост строки после цикла. Функция Строка() приводит элемент любого простого типа к строковому представлению, поэтому такой вариант универсален.
Альтернатива конкатенации — накопление через массив промежуточных строк с последующим вызовом СтрСоединить. На больших объёмах (десятки тысяч элементов) это заметно быстрее, потому что операция сложения строк в цикле каждый раз создаёт новую строку в памяти.
- 1Определите тип элементов массива: строки или произвольные значения
- 2Для строкового массива вызовите СтрСоединить(Массив, Разделитель)
- 3Для смешанного массива сначала преобразуйте элементы через Строка() в новый массив
- 4Проверьте результат в отладчике или через Сообщить()
- 5Убедитесь, что в конце строки нет лишнего разделителя
Массив чисел, дат и ссылок
Когда в массиве лежат не строки, а, например, номера документов или даты, прямой вызов СтрСоединить может дать неожиданный результат. Число 1000 может вывестись как «1 000» с неразрывным пробелом, дата — в формате по умолчанию, а ссылка — как представление объекта. Чтобы управлять форматом, преобразуйте элементы явно.
МассивСтрок = Новый Массив;
Для Каждого Элемент Из МассивЧисел Цикл
МассивСтрок.Добавить(Формат(Элемент, "ЧГ="));
КонецЦикла;
Результат = СтрСоединить(МассивСтрок, "; ");
Функция Формат() с параметром ЧГ= убирает группировку разрядов, что важно, если строка дальше пойдёт в запрос, файл обмена или HTTP-запрос. Для дат используйте Формат(Дата, "ДФ=yyyy-MM-dd"), чтобы получить предсказуемый вид независимо от региональных настроек сеанса.
Для ссылочных значений решите заранее, что должно попасть в строку: представление, наименование, код или номер. Представление удобно человеку, но может быть длинным и неуникальным; код и номер компактнее, но требуют обращения к данным объекта через точку, что для больших массивов ссылок порождает лишние запросы к базе.
Обратная задача: строку в массив
Часто перевод массива в строку нужен для последующего разбора — например, значение сохраняется в строковый реквизит, а потом восстанавливается. Парная функция СтрРазделить(Строка, Разделитель) возвращает массив подстрок. Чтобы связка работала корректно, выбирайте разделитель, который гарантированно не встречается в самих данных: точка с запятой, вертикальная черта или символ перевода строки.
СтрокаДляХранения = СтрСоединить(МассивКодов, ";");
// ... позже:
ВосстановленныйМассив = СтрРазделить(СтрокаДляХранения, ";");
Если элементы могут содержать любые символы, простой разделитель не подходит — используйте сериализацию: ЗначениеВСтрокуВнутр() для внутреннего хранения или JSON через ЗаписьJSON для обмена с внешними системами. Это надёжнее, чем придумывать «редкий» разделитель.
Сравнение вариантов
Быстро и коротко, но только для массива строк и платформа 8.3.6+
Работает везде и с любыми типами, но медленнее на больших массивах
Сохраняет типы и структуру, но результат нечитаем и годится только для внутреннего хранения
Подходит для обмена с внешними системами, требует больше кода
Колонка таблицы значений в строку
На практике массив часто получают из таблицы значений: нужно собрать все значения одной колонки в строку. Метод ВыгрузитьКолонку("ИмяКолонки") возвращает массив, после чего применяются те же приёмы.
МассивНомеров = ТаблицаДокументов.ВыгрузитьКолонку("Номер");
СтрокаНомеров = СтрСоединить(МассивНомеров, ", ");
Если таблица содержит дубли, перед объединением имеет смысл свернуть её методом Свернуть("Номер") или удалить повторы вручную. Также проверьте, нет ли в колонке пустых значений: пустая строка среди элементов даст двойной разделитель вроде «А, , Б», что выглядит как ошибка.
Проверка результата и производительность
После объединения проверьте три вещи: нет ли разделителя в начале и конце строки, корректно ли отображаются числа и даты, не обрезалась ли строка при записи в реквизит ограниченной длины. Реквизит типа Строка(150) молча отбросит всё лишнее — для длинных списков используйте неограниченную строку или хранилище значения.
По производительности: для массивов до нескольких сотен элементов разница между циклом и СтрСоединить незаметна. На десятках тысяч элементов конкатенация строк в цикле становится узким местом — в этом случае собирайте элементы в массив и один раз вызывайте СтрСоединить. Замерить время помогает функция ТекущаяУниверсальнаяДатаВМиллисекундах() до и после фрагмента кода.
Как проверить результат
Нет разделителя в начале и в конце
Строка вида ', А, Б,' с висячими запятыми
Ожидаемый формат без разделителей разрядов
Неразрывные пробелы в числах, дата в произвольном формате
Вся строка сохранилась целиком
Хвост обрезан из-за ограничения длины реквизита
Частые вопросы
Как перевести массив в строку с переносом строки между элементами?
Передайте в качестве разделителя символ переноса: СтрСоединить(Массив, Символы.ПС). Для Windows-переноса используйте Символы.ПС + Символы.ВК, что важно при записи в текстовый файл.
Чем СтрСоединить отличается от простого сложения строк?
СтрСоединить — одна встроенная операция, которая не создаёт промежуточных строк на каждой итерации. На больших массивах это даёт выигрыш по скорости и памяти, плюс код короче и читаемее.
Как убрать пустые элементы перед объединением?
Пройдите по массиву циклом и пропускайте элементы, для которых ПустаяСтрока(Строка(Элемент)) возвращает Истина, либо соберите новый массив только из непустых значений и передайте его в СтрСоединить.
Можно ли перевести в строку массив структур?
Напрямую нет — структура не имеет строкового представления. Решите, какие поля нужны, и сформируйте по каждой структуре строку вручную, либо сериализуйте массив в JSON, если нужна передача всей структуры данных.
Что делать, если конфигурация работает на платформе ниже 8.3.6?
Используйте цикл с накоплением строки и проверкой на первый элемент, как показано в разделе про циклы. Такую функцию удобно вынести в общий модуль и вызывать из любого места конфигурации.
Как сохранить массив в реквизит и потом восстановить без потерь?
Если данные только строковые и разделитель контролируется — СтрСоединить и СтрРазделить. Для произвольных типов надёжнее ЗначениеВСтрокуВнутр с хранением результата в реквизите типа Строка неограниченной длины или в хранилище значения.
Что важно запомнить
Для массива строк используйте СтрСоединить с явным разделителем. Нестроковые элементы предварительно приводите через Строка() или Формат(). Следите за разделителями по краям, форматом чисел и длиной целевого реквизита, а при работе со ссылками избегайте запросов к базе внутри цикла.