Разработка и Конфигурация · 12 мин
1С: как вывести массив в одну строку
Как в 1С вывести массив в одну строку: функция СтрСоединить, цикл со склейкой, разделители, работа с таблицей значений, типичные ошибки и примеры кода.
Задача объединить элементы массива в одну строку через разделитель возникает в 1С постоянно: при формировании списка номенклатуры для печатной формы, сборке строки для файла обмена, выводе списка ошибок пользователю или подготовке параметров запроса. Во встроенном языке 1С для этого есть штатная функция СтрСоединить(), а также несколько ручных способов, которые нужны, когда требуется нестандартная логика.
Выбор способа зависит от трёх условий: какой разделитель нужен между элементами, требуется ли пропускать пустые значения и достаточно ли простой склейки или каждый элемент нужно предварительно обработать (например, обернуть в кавычки или отформатировать число). Ниже разобраны все рабочие варианты с готовым кодом, который можно переносить в конфигурацию без доработки.
Материал актуален для платформы 1С:Предприятие 8.3 и подходит как для управляемых, так и для обычных форм — функции работы со строками в обоих режимах одинаковы.
Функция СтрСоединить — стандартный способ
Функция СтрСоединить() — штатный механизм платформы, который принимает массив строк и возвращает одну строку, где элементы разделены указанным разделителем. Это самый короткий и читаемый вариант, и его следует использовать по умолчанию, если не нужна дополнительная обработка элементов.
МассивТоваров = Новый Массив;
МассивТоваров.Добавить("Мука");
МассивТоваров.Добавить("Сахар");
МассивТоваров.Добавить("Соль");
Результат = СтрСоединить(МассивТоваров, ", ");
// Результат: "Мука, Сахар, Соль"
Второй параметр — разделитель — может быть любой строкой: запятая с пробелом, точка с запятой, перевод строки (Символы.ПС), вертикальная черта или вообще пустая строка, если элементы нужно просто склеить вплотную. Если разделитель не указать, элементы соединятся без пробелов и символов между собой.
Важное ограничение: СтрСоединить() ожидает массив именно строк. Если в массиве лежат числа, даты или ссылки, платформа попытается привести их к строке автоматически, но результат может отличаться от ожидаемого — например, дата выведется в формате по умолчанию, а ссылка — как представление объекта. Для контролируемого результата приводите значения к строке явно через Строка() или Формат() до помещения в массив.
Склейка массива через цикл — когда нужен контроль
Ручной цикл оправдан, когда простой склейки недостаточно: нужно пропустить пустые элементы, обернуть каждый элемент в кавычки, ограничить количество выводимых значений или добавить перед последним элементом союз «и». Универсальный шаблон выглядит так:
Результат = "";
Для Каждого Элемент Из МассивТоваров Цикл
Значение = СокрЛП(Строка(Элемент));
Если ПустаяСтрока(Значение) Тогда
Продолжить; // пропускаем пустые
КонецЕсли;
Если Не ПустаяСтрока(Результат) Тогда
Результат = Результат + ", ";
КонецЕсли;
Результат = Результат + Значение;
КонецЦикла;
Ключевой приём — проверка Если Не ПустаяСтрока(Результат) перед добавлением разделителя. Она избавляет от висячей запятой в начале или конце строки, что является самой частой ошибкой при ручной склейке. Альтернатива — добавлять разделитель всегда, а в конце обрезать лишние символы через Лев(), но проверка внутри цикла читается лучше.
Если массив большой (тысячи элементов), конкатенация строк оператором + начинает замедлять выполнение, потому что при каждом сложении создаётся новая строка. В этом случае надёжнее собирать куски в новый массив и в конце один раз вызвать СтрСоединить() — гибридный подход даёт и контроль над элементами, и скорость.
- 1Объявите переменную Результат с пустой строкой
- 2Пройдите циклом по массиву, приводя каждый элемент к строке через Строка() и СокрЛП()
- 3Пропустите пустые элементы через Продолжить
- 4Добавляйте разделитель только если Результат уже не пустой
- 5После цикла проверьте итоговую строку в отладчике или через Сообщить()
Вывод колонки таблицы значений или списка в строку
На практике чаще всего исходные данные лежат не в массиве, а в таблице значений — например, в табличной части документа. Здесь есть короткий путь: метод ВыгрузитьКолонку() возвращает массив значений колонки, который сразу можно передать в СтрСоединить().
// Товары — табличная часть документа
МассивНаименований = Товары.ВыгрузитьКолонку("Номенклатура");
СтрокаТоваров = СтрСоединить(МассивНаименований, "; ");
Учтите, что в колонке окажутся ссылки на справочник, и в строку попадёт их представление. Если в таблице есть дубли (один товар в нескольких строках), они продублируются и в итоговой строке. Чтобы получить только уникальные значения, сначала сверните таблицу или соберите значения через соответствие:
Уникальные = Новый Соответствие;
Для Каждого СтрокаТовара Из Товары Цикл
Уникальные.Вставить(Строка(СтрокаТовара.Номенклатура), Истина);
КонецЦикла;
МассивУникальных = Новый Массив;
Для Каждого КлючИЗначение Из Уникальные Цикл
МассивУникальных.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
Результат = СтрСоединить(МассивУникальных, ", ");
Для СписокЗначений прямой передачи в СтрСоединить() нет — сначала получите массив методом ВыгрузитьЗначения(), а дальше действуйте стандартно.
Если итоговая строка нужна для печатной формы, собирайте её один раз и кладите в параметр макета, а не вычисляйте внутри цикла обхода областей. Так код макета остаётся простым, а логика склейки тестируется отдельно.
Разделители: перенос строки, запятая, произвольный символ
Выбор разделителя влияет не только на внешний вид, но и на дальнейшую обработку строки. Если результат пойдёт в многострочное поле или текстовый документ, используйте Символы.ПС — каждый элемент окажется на своей строке. Для CSV-подобных выгрузок применяйте точку с запятой, но помните: если внутри самих элементов может встречаться тот же символ, при обратном разборе через СтрРазделить() строка развалится неправильно.
| Разделитель | Когда использовать | Ограничение |
|---|---|---|
", " | Списки для пользователя, печатные формы | Запятые внутри элементов мешают обратному разбору |
Символы.ПС | Многострочные поля, текстовые файлы, сообщения | Не отображается в однострочных полях ввода |
";" | Выгрузки в файлы, обмен с Excel | Требует экранирования, если символ есть в данных |
"|" | Технические строки обмена | Редко встречается в данных, но не читаем для пользователя |
Обратная операция — разбор строки обратно в массив — выполняется функцией СтрРазделить(Строка, Разделитель). Пара этих функций образует удобный механизм сериализации простых списков, например для хранения набора значений в одном строковом реквизите.
Типичные ошибки и как их избежать
Первая и самая распространённая ошибка — висячий разделитель: строка вида «Мука, Сахар, » с запятой и пробелом на конце. Она возникает, когда разделитель добавляется после каждого элемента без проверки. Лечится либо проверкой непустоты результата внутри цикла, либо обрезкой хвоста после цикла, либо переходом на СтрСоединить().
Вторая группа ошибок связана с типами данных. Попытка склеить массив с нестроковыми значениями через конкатенацию без явного приведения может дать неожиданные представления: число 1000,5 выведется с учётом региональных настроек, а дата — в формате по умолчанию. Для чисел и дат всегда применяйте Формат() с явной форматной строкой, чтобы результат был предсказуемым на любом компьютере.
Третья ошибка — игнорирование пустых элементов. Если массив собирался из разных источников, в нём легко оказываются пустые строки, и итоговый текст получает двойные разделители: «Мука, , Соль». Фильтруйте через ПустаяСтрока() до склейки или внутри цикла.
Проверка результата и границы применимости
Проверить корректность склейки проще всего в отладчике: поставьте точку останова после формирования строки и посмотрите значение в табло. Для быстрой проверки без отладчика подойдёт Сообщить(Результат) — строка выведется в окно сообщений. Если строка длинная, дополнительно проверьте количество элементов через СтрЧислоСтрок() (при разделителе-переводе строки) или разберите её обратно через СтрРазделить() и сравните размер массива с исходным.
Как проверить результат
Строка начинается и заканчивается значением элемента
Разделитель стоит в начале или в конце строки
Между элементами ровно один разделитель
Встречаются ", ," или пустые промежутки — в массиве были пустые значения
Значения в ожидаемом формате
Дробные числа с неожиданным разделителем, даты в чужом формате
Есть и границы применимости. Если элементы сами содержат разделитель, простая склейка теряет структуру — для таких данных используйте форматы с экранированием (JSON через ЗаписьJSON, XML) вместо самодельных строк с разделителями. А если строка собирается для запроса к базе (например, список значений для конструкции В), не склеивайте её в текст запроса вручную — передавайте массив параметром, это безопаснее и защищает от ошибок с кавычками.
Краткий итог
Для подавляющего большинства задач достаточно одной строки кода: СтрСоединить(Массив, ", "). Ручной цикл оправдан только тогда, когда элементы нужно фильтровать, форматировать или оборачивать дополнительными символами. Для табличных частей документов используйте связку ВыгрузитьКолонку() + СтрСоединить(), а для уникальности значений — предварительную сборку через соответствие.
Что важно запомнить
Стандартный способ — СтрСоединить(Массив, Разделитель). Цикл нужен только для фильтрации и форматирования элементов. Всегда приводите нестроковые значения через Строка() или Формат(), фильтруйте пустые элементы и проверяйте края итоговой строки на висячие разделители.
Частые вопросы
Чем СтрСоединить отличается от СтрРазделить?
Это зеркальные функции. СтрСоединить собирает массив строк в одну строку через разделитель, а СтрРазделить выполняет обратную операцию — разбивает строку на массив по указанному разделителю. Вместе они позволяют упаковать простой список в строку для хранения и потом восстановить его без потерь, если элементы не содержат сам разделитель.
Как вывести массив в строку с переносом каждого элемента на новую строку?
Передайте в качестве разделителя символ перевода строки: СтрСоединить(Массив, Символы.ПС). Результат корректно отобразится в многострочном поле ввода, текстовом документе и сообщении пользователю, но в однострочном поле переносы будут невидимы.
Почему после склейки в конце строки осталась лишняя запятая?
Разделитель добавлялся после каждого элемента без проверки. Исправьте цикл: добавляйте разделитель только если результирующая строка уже не пустая, либо обрежьте хвост после цикла через Лев(Результат, СтрДлина(Результат) - 2). Проще всего заменить ручную склейку на СтрСоединить — там этой проблемы нет.
Можно ли передать в СтрСоединить массив чисел или ссылок?
Функция ожидает массив строк. Нестроковые значения приводятся автоматически, но формат может отличаться от ожидаемого: числа зависят от региональных настроек, даты выводятся в формате по умолчанию. Надёжнее заранее пройти по массиву циклом и привести каждый элемент через Формат() или Строка().
Как вывести в одну строку только уникальные значения из табличной части?
Соберите значения в соответствие, где ключом служит строковое представление значения — дубли автоматически перезапишутся. Затем перенесите ключи соответствия в массив и склейте через СтрСоединить. Альтернатива — скопировать таблицу, свернуть её по нужной колонке и выгрузить колонку в массив.
Что делать, если элементы сами содержат символ разделителя?
Простая склейка в этом случае теряет структуру: обратный разбор через СтрРазделить даст неверный результат. Выберите разделитель, который гарантированно не встречается в данных (например, вертикальную черту), либо откажитесь от самодельного формата и сериализуйте данные через ЗаписьJSON — это надёжно и стандартно.