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

Особенность задачи в том, что 1С не имеет встроенного метода вроде Array.Join(), как в других языках программирования. Поэтому разработчикам приходится использовать обходные пути. Мы рассмотрим как классические решения для 1С 8.2/8.3, так и современные подходы с использованием JSON или Запросов, которые могут быть полезны в интеграционных сценариях. Важно понимать, что выбор метода зависит не только от версии платформы, но и от структуры данных массива (простой список, массив структур, вложенные массивы) и требуемого формата выходной строки.

1. Стандартная функция СоединитьСтроки() — просто и быстро

Самый очевидный и рекомендуемый способ для большинства задач — использование встроенной функции СоединитьСтроки(). Она доступна во всех актуальных версиях платформы и позволяет гибко настраивать разделитель между элементами.

Основной синтаксис:

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

Пример использования для массива чисел:

МассивЧисел = Новый Массив;

МассивЧисел.Добавить(10);

МассивЧисел.Добавить(20);

МассивЧисел.Добавить(30);

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

// Результат: "10, 20, 30"

  • Плюсы: минимальный код, высокая скорость выполнения, поддерживает любой тип данных (автоматически преобразует в строку).
  • ⚠️ Ограничения: не работает с вложенными массивами (выдаст ошибку "Тип не поддерживается").
  • 🔄 Нюанс: в версиях ниже 8.3.10 может неправильно обрабатывать элементы типа Null (преобразует в пустую строку).
⚠️ Внимание: Если массив содержит объекты (например, СправочникСсылка), функция выведет их внутреннее представление (например, "Справочник.Номенклатура:0x1234"). Для корректного отображения сначала преобразуйте объекты в строки с помощью метода .Представление() или .Наименование.
📊 Какой способ вывода массива используете чаще?
СоединитьСтроки()
Цикл по элементам
Запрос
JSON.Строка()
Другой

2. Ручное объединение через цикл — полный контроль

Когда требуется максимальная гибкость (например, разные разделители для четных/нечетных элементов или обработка Null), лучше использовать явный перебор элементов через цикл Для каждого....

Базовый шаблон:

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

Разделитель = ", ";

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

Если Результат <> "" Тогда

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

КонецЕсли;

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

КонецЦикла;

Продвинутый вариант с обработкой вложенных массивов:

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

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

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

Если ТипЗнч(Элемент) = Тип("Массив") Тогда

Элемент = МассивВСтроку(Элемент, Разделитель); // Рекурсия

ИначеЕсли Элемент = Неопределено Тогда

Элемент = "NULL";

Иначе

Элемент = Строка(Элемент);

КонецЕсли;

Если Результат <> "" Тогда

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

КонецЕсли;

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

КонецЦикла;

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

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

СценарийПример кодаРезультат
Простой массивМассивВСтроку(Новый Массив(1, 2, 3))"1, 2, 3"
С обработкой NullМассивВСтроку(Новый Массив(1, Неопределено, 3))"1, NULL, 3"
Вложенный массивМассивВСтроку(Новый Массив(1, Новый Массив(2, 3)))"1, 2, 3"
Кастомный разделительМассивВСтроку(Новый Массив(1, 2), " | ")"1 | 2"

Этот метод универсален, но требует больше кода. Его стоит использовать, когда:

  • 🔹 Нужна специальная обработка определенных элементов (например, замена Null на "Н/Д").
  • 🔹 Требуется разный разделитель для разных частей массива.
  • 🔹 Массив содержит объекты, которые нужно преобразовать особым образом.

1. Проверьте массив на пустоту (Массив.Количество() = 0)

2. Определитесь с разделителем (запятая, точка с запятой, перенос строки)

3. Решите, как обрабатывать Null/Неопределено

4. При необходимости добавьте рекурсию для вложенных массивов

-->

3. Использование запроса — для больших массивов

Если массив содержит тысячи элементов, стандартные методы могут работать медленно. В таких случаях эффективнее использовать временную таблицу и Запрос:

Алгоритм:

  1. Создать временную таблицу значений.
  2. Заполнить её данными из массива.
  3. Выполнить запрос с функцией СТРСОЕДИНИТЬ().

Пример кода:

// 1. Создаем таблицу

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Значение");

// 2. Заполняем данными из массива

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

Строка = Таблица.Добавить();

Строка.Значение = Строка(Элемент);

КонецЦикла;

// 3. Выполняем запрос

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| СТРСОЕДИНИТЬ(Значение, ', ') КАК Результат

|ИЗ

| &Таблица КАК Т";

Запрос.УстановитьПараметр("Таблица", Таблица);

Результат = Запрос.Выполнить().Выгрузить()[0].Результат;

Преимущества этого подхода:

  • Высокая производительность на больших объемах данных (от 10 000+ элементов).
  • 🛠️ Возможность дополнительной обработки данных прямо в запросе (фильтрация, сортировка).
  • 🔄 Поддерживает группировку — можно объединять строки по группам.
⚠️ Внимание: Функция СТРСОЕДИНИТЬ() в запросах имеет ограничение на длину результирующей строки (обычно ~8000 символов). Для очень больших массивов разбейте их на части или используйте цикл.
Как обойти ограничение на длину строки в запросе?

Если результирующая строка превышает лимит, можно:

1. Разбить исходный массив на части по 1000 элементов и обрабатывать каждую часть отдельным запросом.

2. Использовать временную таблицу с колонкой "Группа" и объединять строки по группам:

Запрос.Текст =

"ВЫБРАТЬ

| Группа,

| СТРСОЕДИНИТЬ(Значение, ', ') КАК Результат

|ИЗ

| &Таблица КАК Т

|ГРУППИРОВАТЬ ПО

| Группа";

3. Вернуть массив строк вместо одной большой строки и потом соединить их в коде.

4. JSON-сериализация — для сложных структур

Если массив содержит вложенные структуры, объекты или требуется сохранить типы данных, оптимальное решение — преобразование в JSON. В современных версиях 1С 8.3.10+ для этого есть встроенные методы:

Базовый пример:

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

Массив.Добавить(1);

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

Массив.Добавить(Истина);

Результат = JSON.Записать(Массив);

// Результат: "[1,"Текст",true]"

Для массива структур:

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

Структура1 = Новый Структура("Имя, Возраст", "Иван", 30);

Структура2 = Новый Структура("Имя, Возраст", "Мария", 25);

МассивСтруктур.Добавить(Структура1);

МассивСтруктур.Добавить(Структура2);

Результат = JSON.Записать(МассивСтруктур);

// Результат: '[{"Имя":"Иван","Возраст":30},{"Имя":"Мария","Возраст":25}]'

Когда использовать JSON:

  • 📦 Для передачи данных во внешние системы (REST API, веб-сервисы).
  • 🔄 Когда нужно сохранить структуру данных (вложенные массивы, объекты).
  • 💾 Для записи в файл с возможностью последующего восстановления.

Ограничения:

  • 🚫 В версиях ниже 8.3.10 нет встроенной поддержки JSON — потребуется подключать внешнюю библиотеку.
  • 📏 Результирующая строка будет содержать служебные символы ([, {, "), что не всегда удобно для отображения пользователю.

1. Сериализуйте массив в JSON.

2. Замените служебные символы с помощью СтрЗаменить():

СтрокаJSON = JSON.Записать(Массив);

ЧистаяСтрока = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаJSON, "[", ""), "]", ""), "\"", "");

-->

5. Метод СтрокаСоединения() — альтернатива для старых версий

В версиях 1С 8.2 и ранних 8.3 (до 8.3.6) отсутствует функция СоединитьСтроки(). Вместо неё можно использовать СтрокаСоединения() из библиотеки ПланОбмена:

Пример:

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

Массив.Добавить("А");

Массив.Добавить("Б");

Массив.Добавить("В");

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

// Результат: "А, Б, В"

Особенности метода:

  • 🔧 Требует подключения библиотеки ПланыОбмена (доступна в большинстве конфигураций на базе БСП).
  • 🐢 Работает медленнее, чем СоединитьСтроки(), но стабильно в старых версиях.
  • ❌ Не поддерживает вложенные массивы и объекты (выдаст ошибку).
⚠️ Внимание: В конфигурациях без БСП (например, "1С:Бухгалтерия 7.7" или самописных решениях) этот метод недоступен. В таких случаях используйте цикл или создайте собственную функцию-аналог.

6. Специфические случаи: массивы объектов и бинарные данные

При работе с массивами объектов (СправочникСсылка, ДокументОбъект) или бинарными данными (ДвоичныеДанные) стандартные методы не подходят. Рассмотрим решения для таких сценариев.

Массив ссылок на справочники:

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

МассивСсылок.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар1"));

МассивСсылок.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар2"));

Результат = СоединитьСтроки(

МассивСсылок.ВыгрузитьКолонку("Представление"),

"; "

);

// Результат: "Товар1; Товар2"

Массив двоичных данных:

МассивДвоичныхДанных = Новый Массив;

МассивДвоичныхДанных.Добавить(Новый ДвоичныеДанные("010203"));

МассивДвоичныхДанных.Добавить(Новый ДвоичныеДанные("040506"));

// Преобразуем каждый элемент в Base64

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

Для Каждого Данные Из МассивДвоичныхДанных Цикл

Если Результат <> "" Тогда

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

КонецЕсли;

Результат = Результат + Base64Строка(Данные);

КонецЦикла;

// Результат: "AQI=|BAUG"

Для бинарных данных также можно использовать:

  • 🔹 ПотокВПамяти + ЗаписатьДвоичныеДанные() для объединения в один поток.
  • 🔹 Хэширование каждого элемента (если нужна контрольная сумма).
💡

При работе с объектами 1С всегда явно указывайте, какое свойство выводить (Наименование, Код, Представление). Никогда не полагайтесь на неявное преобразование в строку — это приведет к внутренним идентификаторам вроде "Справочник.Номенклатура:0x12345".

7. Оптимизация производительности для больших массивов

При обработке массивов с десятками тысяч элементов стандартные методы могут тормозить. Рассмотрим приемы оптимизации:

МетодВремя выполнения (100к элементов)Потребление памятиКогда использовать
СоединитьСтроки()~1.2 секВысокоеМассивы до 50к элементов
Цикл с Строка()~2.5 секСреднееГибкая обработка элементов
Запрос с СТРСОЕДИНИТЬ()~0.8 секНизкоеМассивы 50к+ элементов
ПотокВПамяти + ЗаписатьСтроку()~0.5 секОчень низкоеКритически большие данные

Рекомендации по оптимизации:

  1. Для массивов >50к элементов используйте Запрос или ПотокВПамяти.
  2. Избегайте рекурсии при обработке вложенных массивов — заменяйте её на итеративные алгоритмы.
  3. Если возможны Null, обрабатывайте их на этапе заполнения массива, а не при объединении.
  4. Для частых операций кэшируйте результаты в Соответствие.

Пример оптимизированного кода для 100к+ элементов:

Функция БыстроеОбъединение(Массив, Разделитель)

Поток = Новый ПотокВПамяти();

Запись = Новый ЗаписьТекста(Поток,, "UTF-8");

ПервыйЭлемент = Истина;

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

Если Не ПервыйЭлемент Тогда

Запись.ЗаписатьСтроку(Разделитель);

КонецЕсли;

Запись.ЗаписатьСтроку(Строка(Элемент));

ПервыйЭлемент = Ложь;

КонецЦикла;

Запись.Закрыть();

Возврат Поток.ЗакрытьИПолучитьТекст();

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

FAQ: Частые вопросы по выводу массивов в строку

Как вывести массив структур в строку с разделителями?

Используйте комбинацию цикла и JSON.Записать() для каждой структуры:

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

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

Если Результат <> "" Тогда

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

КонецЕсли;

Результат = Результат + JSON.Записать(Структура);

КонецЦикла;

Или формируйте строку вручную:

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

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

Если Результат <> "" Тогда

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

КонецЕсли;

Результат = Результат + Структура.Имя + " (" + Структура.Возраст + ")";

КонецЦикла;

Почему СоединитьСтроки() выдает ошибку "Тип не поддерживается"?

Ошибка возникает, если в массиве есть:

  • Вложенные массивы (ТипЗнч(Элемент) = Тип("Массив")).
  • Объекты, которые нельзя преобразовать в строку (например, ДокументОбъект без явного указания свойства).
  • Неопределенные значения (Неопределено) в версиях ниже 8.3.10.

Решение: предварительно обработайте массив циклом, преобразуя каждый элемент в строку.

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

Используйте символ переноса строки (Символы.ПС) в качестве разделителя:

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

// Или для Windows-переносов:

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

Для отображения в поле формы установите свойство МногострочныйРежим = Истина.

Можно ли вывести массив в строку без разделителей?

Да, передайте пустую строку в качестве разделителя:

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

// Для массива ["А", "Б", "В"] результат будет "АБВ"

Остерегайтесь конкатенации чисел — они преобразуются в строки без разделителей:

СоединитьСтроки(Новый Массив(1, 2, 3), "") // Вернет "123"
Как обработать массив с Null-значениями?

Варианты решения:

  1. Замените Null на пустую строку или "NULL" перед объединением:
  2. Для Каждого Элемент Из Массив Цикл
    

    Если Элемент = Неопределено Тогда

    Элемент = "NULL";

    КонецЕсли;

    КонецЦикла;

  3. Используйте тернарный оператор в цикле:
  4. Результат = "";
    

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

    Результат = Результат + (Элемент = Неопределено ? "NULL" : Строка(Элемент)) + ", ";

    КонецЦикла;

    Результат = Левое(Результат, СтрДлина(Результат) - 2);