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

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

Особое внимание уделим практическим сценариям: формирование строк для логов, подготовка данных для HTTP-запросов, экспорт в JSON и XML. В конце статьи вы найдёте сравнительную таблицу методов и FAQ с ответами на типичные вопросы, которые возникают у разработчиков.

1. Базовый метод: функция СтрСоединить()

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

Функция принимает два обязательных параметра:

  1. Массив — любой индексируемый набор данных (включая списки значений, массивы, таблицы значений).
  2. Разделитель — строка, которая будет вставляться между элементами (например, запятая, точка с запятой или перевод строки).

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

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

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

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

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

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

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

Преимущества метода:

  • 🔹 Простота: одна строка кода решает задачу.
  • 🔹 Быстродействие: оптимизированная встроенная функция.
  • 🔹 Универсальность: работает с любыми типами данных (числа, строки, даты).

⚠️ Внимание: Если массив содержит Неопределён или NULL, функция СтрСоединить() преобразует их в пустые строки. Это может привести к неожиданным результатам при дальнейшей обработке. Например, строка "10,,30" после разделения по запятой даст массив из трёх элементов, где второй будет пустым.
💡

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

2. Преобразование с учётом типов данных: Формат() + цикл

Когда элементы массива имеют разные типы (например, числа, даты, булевы значения), простого объединения строк может быть недостаточно. В таких случаях требуется предварительное форматирование каждого элемента с учётом его типа. Для этого используют комбинацию цикла Для каждого и функции Формат().

Пример кода:

МассивРазныхТипов = Новый Массив;

МассивРазныхТипов.Добавить(100); // Число

МассивРазныхТипов.Добавить(Истина); // Булево

МассивРазныхТипов.Добавить('2026-05-15'); // Дата (строка)

МассивРазныхТипов.Добавить(Неопределён); // Неопределён

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

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

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

Результат = Результат + Формат(Элемент, "ЧДЦ=2; ЧГ=0") + "; ";

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

Результат = Результат + ?(Элемент, "Да", "Нет") + "; ";

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

Результат = Результат + Формат(Элемент, "ДФ=dd.MM.yyyy") + "; ";

Иначе

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

КонецЕсли;

КонецЦикла;

// Результат: "100,00; Да; 15.05.2026; NULL; "

Этот подход позволяет:

  • 🔹 Контролировать формат каждого типа данных (например, количество знаков после запятой для чисел).
  • 🔹 Заменять Неопределён на осмысленные значения (например, "NULL" или "Н/Д").
  • 🔹 Добавлять префиксы/суффиксы к элементам (например, кавычки для строк).

⚠️ Внимание: При работе с большими массивами (более 10 000 элементов) цикл Для каждого может замедлять выполнение. В таких случаях используйте Для с индексом или рассмотрите альтернативные методы (см. раздел 5).
Как ускорить обработку больших массивов?

Для массивов размером более 10 000 элементов замените цикл Для каждого на Для с индексом:

Для i = 0 По Массив.ВГраница() Цикл

Элемент = Массив[i];

// Обработка

КонецЦикла;

Это уменьшает накладные расходы на итерацию и ускоряет выполнение на 15-30%.

3. Работа с многомерными массивами: рекурсивный подход

Если ваш массив содержит вложенные массивы (например, Массив[1][2]), стандартные методы не сработают — они преобразуют вложенные структуры в строки вида "Массив". Для корректного вывода требуется рекурсивная функция, которая будет обходить все уровни вложенности.

Пример рекурсивной функции:

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

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

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

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

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

Иначе

Результат = Результат + ?(Результат = "", "", Разделитель) + Элемент;

КонецЕсли;

КонецЦикла;

Если Уровень > 0 Тогда

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

КонецЕсли;

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

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

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

МногомерныйМассив = Новый Массив;

МногомерныйМассив.Добавить(1);

МногомерныйМассив.Добавить(Новый Массив(2, 3, Новый Массив(4, 5)));

Сообщить(МассивВСтрокуРекурсивно(МногомерныйМассив));

// Результат: "1,[2,3,[4,5]]"

Особенности рекурсивного подхода:

  • 🔹 Гибкость: обрабатывает любое количество уровней вложенности.
  • 🔹 Настраиваемость: можно менять разделители для разных уровней (например, запятую для элементов, точку с запятой для вложенных массивов).
  • 🔹 Ограничения: при глубокой вложенности (более 100 уровней) возможен переполнение стека.

📊 Какой тип массивов вы чаще используете в 1С?
Одномерные
Многомерные (2-3 уровня)
Глубоко вложенные (4+ уровня)
Не использую массивы

4. Экспорт в форматы JSON и XML: специализированные методы

Если цель преобразования массива — передача данных в внешние системы (например, через REST API или сохранение в файл), удобнее использовать форматы JSON или XML. Платформа 1С:Предприятие 8.3 предоставляет для этого встроенные механизмы:

Для JSON:

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

МассивДанных.Добавить(Новый Структура("Код,Наименование", 1, "Товар 1"));

МассивДанных.Добавить(Новый Структура("Код,Наименование", 2, "Товар 2"));

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.Записать(МассивДанных);

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

// Результат: [{"Код":1,"Наименование":"Товар 1"},{"Код":2,"Наименование":"Товар 2"}]

Для XML:

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.УстановитьСтроку();

ЗаписьXML.ЗаписатьОбъект(МассивДанных);

РезультатXML = ЗаписьXML.Закрыть();

// Результат:

//

//

//

// <Код>1

// <Наименование>Товар 1

//

// ...

//

Преимущества специализированных методов:

  • 🔹 Совместимость: результаты сразу готовы для передачи в веб-сервисы.
  • 🔹 Поддержка сложных структур: автоматически обрабатываются вложенные массивы, структуры, таблицы значений.
  • 🔹 Безопасность: экранируются специальные символы (например, &, < в XML).

⚠️ Внимание: При экспорте в JSON учитывайте, что платформа по умолчанию преобразует даты в строки вида "yyyy-MM-dd". Если требуется другой формат, предварительно отформатируйте даты вручную.

☑️ Подготовка массива для JSON/XML

Выполнено: 0 / 5

5. Оптимизация для больших массивов: СтрокаТаблицы() и Поток

При работе с массивами размером более 50 000 элементов стандартные методы могут приводить к переполнению памяти или длительным задержкам. В таких случаях рекомендуется:

  1. Использовать СтрокаТаблицы:
  2. БольшойМассив = Новый Массив(100000);
    

    Для i = 0 По 99999 Цикл

    БольшойМассив[i] = "Элемент_" + i;

    КонецЦикла;

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

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

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

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

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

    КонецЦикла;

    Результат = СтрокаТаблицы(Таблица, ";");

  3. Применять Поток для записи в файл:
  4. Файл = Новый ЗаписьТекста("C:\temp\большой_массив.txt", КодировкаТекста.UTF8);
    

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

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

    КонецЦикла;

    Файл.Закрыть();

Критическое замечание: метод СтрокаТаблицы() не подходит для массивов с вложенными структурами — он преобразует их в строки вида "[Объект: Структура]". В таких случаях комбинируйте этот метод с рекурсивной обработкой (см. раздел 3).

Метод Макс. размер массива Поддержка вложенности Быстродействие Применимость
СтрСоединить() ~10 000 элементов Нет ⭐⭐⭐⭐⭐ Простые одномерные массивы
Цикл + Формат() ~50 000 элементов Нет ⭐⭐⭐⭐ Массивы с разными типами данных
Рекурсивная функция ~1 000 элементов Да (любая) ⭐⭐⭐ Многомерные массивы
ЗаписьJSON ~100 000 элементов Да ⭐⭐⭐⭐ Экспорт во внешние системы
СтрокаТаблицы() + Поток 1 000 000+ элементов Нет ⭐⭐⭐⭐⭐ Обработка больших объёмов данных
💡

Для массивов более 50 000 элементов всегда используйте потоковую запись (ЗаписьТекста или ЗаписьJSON), чтобы избежать переполнения памяти и зависания системы.

6. Практические сценарии: логи, HTTP-запросы, отладка

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

Сценарий 1: Вывод массива в журнал регистрации

Для отладки часто нужно записать содержимое массива в лог. Здесь важно:

  • 🔹 Разделить элементы переводом строки (Символы.ПС).
  • 🔹 Добавить нумерацию элементов.
  • 🔹 Обработать Неопределён.
Процедура ЗаписатьМассивВЛог(Массив, Префикс = "")

Результат = Префикс + " [" + Массив.Количество() + " элементов]:" + Символы.ПС;

Индекс = 0;

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

Индекс = Индекс + 1;

Значение = ?(Элемент = Неопределён, "NULL", Элемент);

Результат = Результат + Префикс + " [" + Индекс + "] = " + Значение + Символы.ПС;

КонецЦикла;

ЗаписьЖурналаРегистрации(Результат, УровеньЖурнала.Информация);

КонецПроцедуры

Сценарий 2: Формирование параметров для HTTP-запроса

При отправке данных через HTTPСервис массив параметров нужно преобразовать в строку вида param1=value1¶m2=value2. Используйте:

Функция МассивВПараметрыHTTP(МассивПараметров)

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

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

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

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

КонецЕсли;

Результат = Результат + ?

(ТипЗнч(Параметр.Ключ) = Тип("Строка"),

URLКодироватьСтроку(Параметр.Ключ),

Параметр.Ключ) + "=" + ?

(ТипЗнч(Параметр.Значение) = Тип("Строка"),

URLКодироватьСтроку(Параметр.Значение),

Параметр.Значение);

КонецЦикла;

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

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

Сценарий 3: Экспорт в CSV

Для сохранения массива в CSV-файл используйте комбинацию СтрСоединить() с экранированием кавычек:

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

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

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

СтроковоеЗначение = "" + Элемент; // Приведение к строке

СтроковоеЗначение = СтрЗаменить(СтроковоеЗначение, """", """""");

Если СтрНайти(СтроковоеЗначение, Разделитель) > 0 ИЛИ СтрНайти(СтроковоеЗначение, Символы.ПС) > 0 Тогда

СтроковоеЗначение = """" + СтроковоеЗначение + """";

КонецЕсли;

Результат = Результат + СтроковоеЗначение + Разделитель;

КонецЦикла;

Возврат ЛеваяСтрока(Результат, СтрДлина(Результат) - СтрДлина(Разделитель));

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

FAQ: Ответы на частые вопросы

Как вывести массив в строку, если он содержит объекты (например, СправочникСсылка)?

Для объектов 1С (справочники, документы) сначала извлеките нужные свойства в новый массив, затем преобразуйте его в строку. Пример:

МассивОбъектов = Новый Массив;

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

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

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

Для Каждого Объект Из МассивОбъектов Цикл

МассивСтрок.Добавить(Объект.Наименование + " (" + Объект.Код + ")");

КонецЦикла;

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

Почему СтрСоединить() игнорирует пустые элементы?

Функция СтрСоединить() не игнорирует пустые элементы, а преобразует их в пустые строки. Если в результате вы видите две запятые подряд (например, "1,,3"), это означает, что между ними был пустой элемент. Чтобы его удалить, предварительно отфильтруйте массив:

ОтфильтрованныйМассив = Массив.Найти(Функция(Элемент) Возврат Элемент <> Неопределён И Элемент <> "" КонецФункции);

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

Как вывести массив в строку с переносами и отступами для удобства чтения?

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

Функция КрасивыйВыводМассива(Массив, Уровень = 0)

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

Отступ = СтрПовтор(Символы.Таб, Уровень);

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

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

Результат = Результат + Отступ + "[" + Символы.ПС +

КрасивыйВыводМассива(Элемент, Уровень + 1) + Символы.ПС +

Отступ + "]" + Символы.ПС;

Иначе

Результат = Результат + Отступ + Элемент + Символы.ПС;

КонецЕсли;

КонецЦикла;

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

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

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

Нет, при преобразовании в строку информация о типах данных теряется. Если требуется сохранить типы, используйте:

  • 🔹 Сериализацию в JSON (сохраняет структуру и частично типы).
  • 🔹 Хранение метаданных: создайте структуру с описанием типов и отдельно сохраните её.
  • 🔹 Специализированные форматы (например, Base64 для двоичных данных).

Пример с метаданными:

Данные = Новый Структура;

Данные.Вставить("Массив", Массив);

Данные.Вставить("Типы", Новый Массив);

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

Данные.Типы.Добавить(ТипЗнч(Элемент));

КонецЦикла;

Как ускорить обработку массива из 1 миллиона элементов?

Для массивов такого размера:

  1. Используйте Поток для записи в файл (не храните всю строку в памяти).
  2. Разбейте массив на части (например, по 10 000 элементов) и обрабатывайте их параллельно.
  3. Отключите проверку типов, если уверены в данных (например, замените ТипЗнч() на прямую обработку).
  4. Используйте небезопасные методы (например, работу с указателями через NativeAPI, но это требует глубоких знаний).

Пример параллельной обработки:

Процедура ОбработатьБольшойМассив(Массив, ИмяФайла)

РазмерЧасти = 10000;

КолвоЧастей = Цел(Массив.Количество() / РазмерЧасти) + 1;

Файл = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

Для НомерЧасти = 0 По КолвоЧастей - 1 Цикл

Начало = НомерЧасти * РазмерЧасти;

Конец = Мин(Начало + РазмерЧасти - 1, Массив.ВГраница());

ЧастьМассива = Массив.Получить(Начало, Конец - Начало + 1);

Файл.ЗаписатьСтроку(СтрСоединить(ЧастьМассива, ","));

КонецЦикла;

Файл.Закрыть();

КонецПроцедуры