Разработка и Конфигурация · 9 мин
Как записать массив в строку в 1С
Как преобразовать массив в строку в 1С: функция СтрСоединить, цикл со Строка(), разделители, типовые ошибки и примеры кода для управляемых и обычных форм.
Задача записать массив в строку в 1С возникает постоянно: нужно вывести список товаров в сообщение пользователю, сформировать значение для поля документа, собрать строку для поиска или передать перечень значений в запрос. Встроенный язык 1С предлагает для этого штатную функцию СтрСоединить, а также несколько ручных способов через цикл — каждый со своими ограничениями.
Ключевой момент, который часто упускают: массив в 1С может содержать значения любых типов — числа, даты, ссылки, булево. Перед соединением их нужно привести к строковому представлению, иначе получите ошибку преобразования или нечитаемый результат вроде «Объект.Ссылка». Поэтому корректная схема всегда состоит из двух шагов: подготовка элементов и соединение с разделителем.
Ниже разобраны основные способы: штатная функция СтрСоединить, соединение через цикл, работа с массивом ссылок и чисел, переносы строк в качестве разделителя и типичные ошибки, из-за которых код падает или выдаёт мусор.
Функция СтрСоединить — штатный способ
Функция СтрСоединить(Строки, Разделитель) принимает массив строк и возвращает одну строку, где элементы склеены через указанный разделитель. Если разделитель не задан, элементы соединяются вплотную, без промежуточных символов — это частая причина «слипшегося» результата.
Пример базового использования:
МассивГородов = Новый Массив;
МассивГородов.Добавить("Москва");
МассивГородов.Добавить("Казань");
МассивГородов.Добавить("Новосибирск");
Результат = СтрСоединить(МассивГородов, ", ");
// Результат: "Москва, Казань, Новосибирск"
Функция доступна в тонком, толстом и веб-клиенте, работает на сервере и на клиенте, не требует дополнительных настроек. Это предпочтительный способ для всех современных конфигураций — он короче и быстрее ручного цикла.
Соединение массива через цикл
До появления СтрСоединить массивы соединяли вручную, и такой код до сих пор встречается в старых конфигурациях. Ручной способ оправдан, когда нужна нестандартная логика: пропускать пустые элементы, добавлять нумерацию, по-разному оформлять первый и последний элемент.
Результат = "";
Для Каждого Элемент Из МассивГородов Цикл
Если Не ПустаяСтрока(Результат) Тогда
Результат = Результат + ", ";
КонецЕсли;
Результат = Результат + Элемент;
КонецЦикла;
Обратите внимание на проверку ПустаяСтрока(Результат) — именно она убирает лишний разделитель в начале строки. Распространённая ошибка новичков — ставить разделитель после каждого элемента, а затем «откусывать» последние символы через Лев(), что ломается на пустом массиве.
Для больших массивов ручная конкатенация в цикле заметно медленнее СтрСоединить, потому что строки в 1С неизменяемы и каждая операция сложения создаёт новую строку. Если элементов тысячи — используйте штатную функцию.
Как соединить массив чисел, дат и ссылок
Самый частый практический случай — массив ссылок на документы или элементы справочника, которые нужно вывести пользователю одной строкой. Ссылки нельзя передать в СтрСоединить напрямую: сначала каждый элемент преобразуется в строку.
МассивСтрок = Новый Массив;
Для Каждого Документ Из МассивДокументов Цикл
МассивСтрок.Добавить(Строка(Документ));
КонецЦикла;
ТекстСообщения = "Не проведены документы: "
+ СтрСоединить(МассивСтрок, "; ");
Для чисел и дат вместо Строка() лучше использовать Формат() — она даёт контроль над представлением. Например, Формат(Дата, "ДЛФ=D") выведет дату без времени, а Формат(Число, "ЧГ=0") уберёт разделители групп разрядов, которые иначе попадут в строку как неразрывные пробелы.
МассивСтрок = Новый Массив;
Для Каждого Эл Из ИсходныйМассив Цикл
МассивСтрок.Добавить(Формат(Эл, "ЧГ=0"));
КонецЦикла;
Результат = СтрСоединить(МассивСтрок, ", ");Разделители: запятая, перенос строки, табуляция
Выбор разделителя зависит от того, куда пойдёт строка. Для сообщения пользователю обычно достаточно ", " или "; ". Для многострочного вывода — например, списка ошибок в форме — используйте символ переноса строки.
// Список с переносами строк
Результат = СтрСоединить(МассивОшибок, Символы.ПС);
// Список для CSV-подобного файла
Результат = СтрСоединить(МассивЗначений, ";");
Объект Символы содержит готовые константы: Символы.ПС (перевод строки), Символы.ВК (возврат каретки), Символы.Таб (табуляция), Символы.НПП (неразрывный пробел). Для Windows-совместимых текстовых файлов часто нужна комбинация Символы.ВК + Символы.ПС.
Если строка предназначена для выгрузки в файл, убедитесь, что сами элементы не содержат символ разделителя — иначе при обратном разборе через СтрРазделить структура «поедет». В таких случаях выбирайте редкий разделитель или экранируйте значения.
Обратная операция и проверка результата
Парная функция СтрРазделить(Строка, Разделитель) превращает строку обратно в массив. Связка «соединить — разделить» часто используется для хранения списка значений в строковом реквизите или передачи через параметры, где нельзя передать массив.
Проверить корректность соединения просто: разделите результат обратно и сравните количество элементов с исходным массивом. Если числа не совпали — в элементах встречался символ разделителя либо часть значений потерялась при преобразовании типов.
Как проверить результат
Совпадает с размером исходного массива
Элементов больше — разделитель встречался внутри значений
Нет висячих разделителей в начале и конце
Строка начинается или заканчивается запятой/точкой с запятой
Читаемый формат без разделителей групп и времени
Неразрывные пробелы в числах, лишнее время у дат
Типичные ошибки и ограничения
Первая ошибка — передача в СтрСоединить массива нестроковых значений. Платформа выдаёт ошибку несоответствия типов, и код падает. Всегда проверяйте состав массива или преобразуйте элементы заранее.
Вторая — забытый разделитель. Вызов СтрСоединить(Массив) без второго параметра склеит элементы вплотную: «МоскваКазаньНовосибирск». Третья — соединение массива, содержащего неопределённые или пустые значения: в строке появятся двойные разделители вида «Москва, , Казань». Отфильтруйте пустые элементы перед соединением.
Отдельно стоит упомянуть массивы в запросах: если строка собирается для условия В (&Список), строка не подойдёт — в запрос нужно передавать сам массив или таблицу значений как параметр, соединение в строку здесь не работает и является частой причиной неверных выборок.
Выбор подхода под задачу
Для стандартного соединения строк однозначно выбирайте СтрСоединить — это штатно, быстро и читаемо. Ручной цикл оставьте для случаев с нестандартной логикой форматирования. Для выгрузки в файлы отдавайте предпочтение ЗаписьТекста с явным разделителем и контролем кодировки.
Как выбрать действие
При работе в управляемых формах помните о контексте: тяжёлые соединения больших массивов выполняйте на сервере, чтобы не гонять данные между клиентом и сервером. Для массивов из сотен тысяч элементов любой способ будет медленным — здесь правильнее пересмотреть саму архитектуру решения.
Частые вопросы
Можно ли соединить массив без разделителя?
Да, вызовите СтрСоединить с одним параметром — СтрСоединить(Массив). Элементы будут склеены вплотную. Но делайте это осознанно: чаще всего отсутствие разделителя — это ошибка, и результат становится нечитаемым.
Как вывести массив в многострочное поле формы?
Соедините массив с разделителем Символы.ПС и присвойте результат строковому реквизиту формы, у которого в свойствах поля ввода включён многострочный режим. Каждый элемент массива займёт отдельную строку.
СтрСоединить выдаёт ошибку «Несоответствие типов» — что делать?
В массиве есть элементы не типа Строка: числа, даты, ссылки или Неопределено. Пройдите по массиву циклом и соберите новый массив, добавляя Строка(Элемент) или Формат(Элемент, ФорматнаяСтрока) для каждого значения.
Как убрать пустые элементы перед соединением?
Перед вызовом СтрСоединить пройдите по массиву и перенесите в новый массив только непустые значения, проверяя их через ПустаяСтрока() для строк или сравнивая с Неопределено. Так в результате не появятся двойные разделители.
Чем отличается СтрСоединить от обращения к свойствам массива в цикле?
СтрСоединить — атомарная операция платформы: она быстрее, короче в записи и не создаёт промежуточных строк на каждой итерации. Цикл даёт гибкость в форматировании, но на больших массивах работает медленнее из-за неизменяемости строк в 1С.
Можно ли сохранить массив в строку и восстановить его потом?
Для простых строковых значений — да: соедините с редким разделителем и восстановите через СтрРазделить. Для ссылок и составных типов такой способ не подходит — используйте ЗначениеВСтрокуВнутр, который сериализует значение с сохранением типа.
Что важно запомнить
Штатный способ записать массив в строку — СтрСоединить(Массив, Разделитель). Все элементы должны быть строками: числа, даты и ссылки преобразуйте через Формат() или Строка(). Следите за пустыми элементами и разделителем внутри значений, а для запросов передавайте массив параметром, а не строкой.