Работа с массивами в 1С:Предприятие — одна из самых частых задач при разработке конфигураций, обработок и отчетов. Однако стандартный метод Сообщить() не всегда удобен для отображения структурированных данных: вместо ожидаемого списка элементов вы получаете лаконичное [Массив] или [Объект]. Эта проблема особенно актуальна при отладке сложных алгоритмов, где необходимо быстро оценить содержимое коллекций, таблиц значений или JSON-структур.

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

Особое внимание уделим выводу массивов с рекурсивными структурами (например, дерево каталогов) и большими объемами данных (10 000+ элементов), где стандартные методы приводят к зависанию интерфейса или обрезке результата. Также рассмотрим альтернативные подходы для серверных процедур, где прямой вывод в сообщение невозможен.

1. Стандартный метод Сообщить(): почему он не работает с массивами

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

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

Массив.Добавить("Элемент1");

Массив.Добавить("Элемент2");

Сообщить(Массив); // Результат: "[Массив]"

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

СтрокаМассива = "";

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

СтрокаМассива = СтрокаМассива + ?(СтрокаМассива = "", "", ", ") + Элемент;

КонецЦикла;

Сообщить("Массив: [" + СтрокаМассива + "]");

  • ✅ Простота реализации (2-3 строки кода)
  • ✅ Работает в любых контекстах (клиент, сервер, внешние обработки)
  • ❌ Не подходит для вложенных массивов или объектов
  • ❌ Требует ручной обработки типов данных (например, даты выводятся как числа)
⚠️ Внимание: При выводе больших массивов (>1000 элементов) такой подход может привести к переполнению строки (ограничение 1С на длину сообщения — 1024 символа в некоторых режимах). Используйте его только для отладки небольших коллекций.

2. Использование функции СтрокаСообщения(): форматирование с разделителями

Более гибкий способ — использование встроенной функции СтрокаСообщения(), которая позволяет задавать формат вывода. Этот метод особенно удобен для массивов с однотипными данными (например, списки строк или чисел):

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

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

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

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

Сообщить(СтрокаСообщения("Массив: %1", СтрСоединить(МассивЧисел, ", ")));

Для сложных структур (например, массивы структур или таблиц значений) можно комбинировать СтрокаСообщения() с циклами:

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

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

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

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

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

Сообщение = "";

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

Сообщение = Сообщение + СтрокаСообщения("Имя: %1, Возраст: %2; ", Структура.Имя, Структура.Возраст);

КонецЦикла;

Сообщить(Сообщение);

Тип данных в массиве Пример вывода Особенности
Простые типы (строка, число) [Элемент1, Элемент2, 100] Работает без дополнительных преобразований
Дата/Время [01.01.2023, 12:30:00] Требует явного форматирования через Формат()
Структура [{Ключ1=Значение1}, {Ключ2=Значение2}] Нужно обрабатывать каждый ключ отдельно
Таблица значений [ТаблицаЗначений] Выводится только тип, содержимое не отображается

Для автоматизации форматирования можно создать универсальную функцию:

Функция МассивВСтроку(Массив)

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

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

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

Результат = Результат + СтрокаСообщения("{%1}", МассивКлючейСтруктурыВСтроку(Элемент));

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

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

Иначе

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

КонецЕсли;

КонецЦикла;

Возврат "[" + Результат + "]";

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

Функция МассивКлючейСтруктурыВСтроку(Структура)

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

Для Каждого Ключ Из Структура Цикл

Результат = Результат + ?(Результат = "", "", ", ") + Ключ + "=" + Структура[Ключ];

КонецЦикла;

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

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

📊 Какой метод вывода массивов используете чаще?
Сообщить() с ручным форматированием
СтрокаСообщения()
JSON-сериализация
Внешние обработки
Свой велосипед

3. Сериализация в JSON: универсальный способ для сложных структур

Начиная с версии 8.3.4, в 1С:Предприятие появилась встроенная поддержка JSON, что значительно упростило работу с сложными данными. Для вывода массива достаточно использовать функцию ЗаписатьJSON():

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

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

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

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

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

ЗаписатьJSON(ЗаписьJSON, Массив);

Сообщить(ЗаписьJSON.Закрыть());

Результат будет выглядеть как стандартная JSON-строка:

[

{"Наименование":"Товар1","Цена":100},

{"Наименование":"Товар2","Цена":200}

]

  • ✅ Поддерживает вложенные структуры любой глубины
  • ✅ Автоматически обрабатывает даты, числа, булевы значения
  • ✅ Совместим с внешними системами (можно скопировать вывод и использовать в API)
  • ❌ В старых версиях (до 8.3.4) требует подключения внешних библиотек
  • ❌ JSON-строка может быть слишком длинной для Сообщить()

Для версий ниже 8.3.4 можно использовать альтернативные библиотеки, например, JSONWriter от Infostart. Пример интеграции:

// Подключаем внешнюю обработку с JSONWriter

JSONWriter = ВнешниеОбработки.Создать("JSONWriter.epf").СоздатьJSONWriter();

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

Сообщить(JSONWriter.ПолучитьJSONСтроку());

ЗаписатьJSON(Новый ЗаписьJSON(Новый Файл("C:\temp\массив.json"))), Массив);

Это позволит анализировать большие структуры без ограничений на длину сообщения.-->

4. Вывод массивов через таблицу значений: визуализация для пользователя

Если задача — не только отладить код, но и показать данные пользователю в удобном виде, оптимальным решением станет преобразование массива в таблицу значений. Этот метод подходит для:

  • 📊 Отображения данных в отчетах или обработках
  • 🔍 Анализа больших массивов (тысячи элементов)
  • 📋 Экспорта данных в Excel через ЗаписатьТаблицу()

Пример преобразования массива структур в таблицу:

МассивТоваров = Новый Массив();

МассивТоваров.Добавить(Новый Структура("Артикул,Наименование,Цена", "ART001", "Товар1", 100));

МассивТоваров.Добавить(Новый Структура("Артикул,Наименование,Цена", "ART002", "Товар2", 200));

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

Таблица.Колонки.Добавить("Артикул");

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

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

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

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

Строка.Артикул = Товар.Артикул;

Строка.Наименование = Товар.Наименование;

Строка.Цена = Товар.Цена;

КонецЦикла;

// Вывод в сообщение (ограниченно) или открытие формы

Сообщить(Таблица.ВыгрузитьКолонку("Наименование")); // Покажет только одну колонку

// Альтернатива: открыть таблицу в новой форме

Форма = Таблица.ПолучитьФорму();

Форма.Открыть();

⚠️ Внимание: При работе с таблицами значений в серверных процедурах (например, в фоновых заданиях) прямой вывод через Сообщить() невозможен. Используйте ЗаписьЖурналаРегистрации() или сохраняйте данные во временное хранилище.

Для динамического создания колонок на основе структуры массива можно использовать следующий подход:

Функция МассивВТаблицу(МассивСтруктур)

Если МассивСтруктур.Количество() = 0 Тогда

Возврат Новый ТаблицаЗначений;

КонецЕсли;

// Определяем колонки по первой структуре

ПерваяСтруктура = МассивСтруктур[0];

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

Для Каждого Ключ Из ПерваяСтруктура Цикл

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

КонецЦикла;

// Заполняем данные

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

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

Для Каждого Ключ Из Структура Цикл

Строка[Ключ] = Структура[Ключ];

КонецЦикла;

КонецЦикла;

Возврат Таблица;

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

5. Рекурсивный вывод вложенных массивов: обработка деревьев и графов

При работе с рекурсивными структурами (например, дерево категорий товаров или иерархия организаций) стандартные методы вывода становятся бесполезны. Здесь требуется рекурсивная функция, которая будет обходить все уровни вложенности:

Процедура ВывестиВложенныйМассив(Массив, Уровень = 0)

Отступ = СтрПовтор(" ", Уровень);

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

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

Сообщить(Отступ + "[Массив:]");

ВывестиВложенныйМассив(Элемент, Уровень + 1);

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

Сообщить(Отступ + "[Структура:]");

Для Каждого Ключ Из Элемент Цикл

Сообщить(Отступ + " " + Ключ + ": " + Элемент[Ключ]);

КонецЦикла;

Иначе

Сообщить(Отступ + Элемент);

КонецЕсли;

КонецЦикла;

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

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

ДеревоКатегорий = Новый Массив();

ДеревоКатегорий.Добавить("Электроника");

ДеревоКатегорий.Добавить(Новый Массив());

ДеревоКатегорий[1].Добавить("Смартфоны");

ДеревоКатегорий[1].Добавить("Ноутбуки");

ВывестиВложенныйМассив(ДеревоКатегорий);

Для ограничения глубины рекурсии (во избежание зависания при циклических ссылках) добавьте проверку уровня:

Процедура ВывестиВложенныйМассив(Массив, Уровень = 0, МаксУровень = 10)

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

Сообщить(СтрПовтор(" ", Уровень) + "[Слишком глубокая вложенность]");

Возврат;

КонецЕсли;

// ... остальной код

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

Как обработать циклические ссылки в массивах?

Циклические ссылки (например, когда элемент массива ссылается сам на себя) приводят к зацикливанию рекурсивной функции.

Решение — вести журнал обработанных объектов:

Процедура ВывестиМассивБезЗацикливания(Массив, ОбработанныеОбъекты = Новый Соответствие, Уровень = 0)

Если ОбработанныеОбъекты.Содержит(Массив) Тогда

Сообщить(СтрПовтор(" ", Уровень) + "[Циклическая ссылка]");

Возврат;

КонецЕсли;

ОбработанныеОбъекты.Вставить(Массив, Истина);

// ... остальной код обработки

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

6. Альтернативные способы: логирование и внешние инструменты

Когда стандартные методы вывода не подходят (например, при работе с большими данными или в серверных процедурах), на помощь приходят альтернативные подходы:

6.1. Запись в журнал регистрации

Для серверных процедур или фоновых задач, где Сообщить() недоступен:

ЗаписьЖурналаРегистрации(

"ВыводМассива",

УровеньЖурналаРегистрации.Информация,

"",

СтрокаСообщения("Массив: %1", СтрСоединить(Массив, ", "))

);

6.2. Сохранение во временное хранилище

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

// На сервере

ВременноеХранилище = Новый ВременноеХранилищеДанных();

Адрес = ВременноеХранилище.Поместить(Массив);

// На клиенте

МассивИзХранилища = ВременноеХранилище.Получить(Адрес);

Сообщить(МассивВСтроку(МассивИзХранилища));

6.3. Внешние обработки для визуализации

Специализированные обработки, такие как:

  • 🔍 "Просмотрщик JSON" (для анализа JSON-структур)
  • 📊 "Universal Report" (для вывод таблиц и массивов)
  • 🛠️ "Debugger" от Infostart (расширенные инструменты отладки)
Метод Когда использовать Ограничения
Журнал регистрации Серверные процедуры, фоновые задачи Ограниченный объем данных, сложно читать структуры
Временное хранилище Передача данных между клиентом и сервером Требует ручной обработки на клиенте
Внешние обработки Сложные структуры, регулярная отладка Необходимо устанавливать дополнительные файлы

Проверить объем данных (более 1000 элементов требует альтернативных методов)

Определить цель вывода (отладка, логирование, демонстрация пользователю)

Выбрать подходящий метод (JSON для структур, таблица для визуализации)

Ограничить глубину рекурсии при вложенных массивах

Проверить доступность Сообщить() в текущем контексте (клиент/сервер)-->

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

Как вывести массив, если в нем больше 1000 элементов?

Для больших массивов используйте:

  1. Запись в файл через ЗаписьТекста:
  2. Запись = Новый ЗаписьТекста("C:\temp\массив.txt");
    

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

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

    КонецЦикла;

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

  3. Постраничный вывод с паузой (для интерактивной отладки):
  4. Шаг = 100;
    

    Для Инд = 0 По БольшойМассив.ВГраница() Шаг 100 Цикл

    Сообщить(СтрСоединить(БольшойМассив.Получить(Инд, Мин(Инд+Шаг-1, БольшойМассив.ВГраница())), ", "));

    Пауза = Новый СообщениеПользователю;

    Пауза.Текст = "Продолжить вывод?";

    Пауза.Кнопки = СообщениеПользователю.ДаНет;

    Если Пауза.Показать() = КодВозвратаДиалога.Нет Тогда

    Прервать;

    КонецЕсли;

    КонецЦикла;

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

Да, для этого:

  1. Создайте табличный документ: ТабДок = Новый ТабличныйДокумент;
  2. Заполните его данными из массива (например, через цикл по строкам).
  3. Откройте для просмотра: ТабДок.Показать();

Пример для массива структур:

ТабДок = Новый ТабличныйДокумент;

Область = ТабДок.Область();

ТабДок.НачатьАвтогруппировкуСтрок();

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

Строка = ТабДок.ВывестиСтроку();

Для Каждого Ключ Из Элемент Цикл

Строка.Текст = Ключ + ": " + Элемент[Ключ];

КонецЦикла;

КонецЦикла;

ТабДок.Показать();

Как вывести массив в отладочном режиме (F5)?

В режиме отладки (F5) можно:

  • Навести курсор на переменную массива — появится всплывающая подсказка с содержимым (ограничено 20 элементами).
  • Добавить массив в окно выражений (панель "Выражения" в отладчике).
  • Использовать точку останова с выводом через Сообщить() или ЗаписьЖурналаРегистрации().

Для расширенного просмотра установите надстройку "1С:Отладчик" из каталога 1С-ИТС.

Почему при выводе массива с датами показываются числа вместо форматированных дат?

Платформа хранит даты как числа (количество дней с 01.01.0001). Чтобы вывести дату в читаемом формате, используйте функцию Формат():

МассивСДатами = Новый Массив();

МассивСДатами.Добавить(ТекущаяДата());

Сообщение = "";

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

Сообщение = Сообщение + Формат(Дата, "ДФ=dd.MM.yyyy HH:mm:ss") + "; ";

КонецЦикла;

Сообщить(Сообщение);

Для автоматической обработки всех дат в массиве используйте рекурсивную функцию с проверкой типа:

Функция ФорматироватьЭлемент(Элемент)

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

Возврат Формат(Элемент, "ДФ=dd.MM.yyyy");

Иначе

Возврат Элемент;

КонецЕсли;

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

Как вывести массив на сервере, где Сообщить() не работает?

На сервере доступны альтернативные методы:

  1. Журнал регистрации (основной способ):
  2. ЗаписьЖурналаРегистрации("МойМассив", УровеньЖурналаРегистрации.Информация, "", МассивВСтроку(Массив));
  3. Временное хранилище (для передачи клиенту):
  4. Хранилище = Новый ВременноеХранилищеДанных();
    

    Адрес = Хранилище.Поместить(Массив);

    // На клиенте: Массив = Хранилище.Получить(Адрес);

  5. Файл (для больших данных):
  6. Текст = Новый ЗаписьТекста("C:\Temp\server_log.txt", КодировкаТекста.UTF8);
    

    Текст.ЗаписатьСтроку(МассивВСтроку(Массив));

    Текст.Закрыть();

⚠️ Внимание: При записи в файл на сервере убедитесь, что:
  • Путь доступен для записи (права 1С:Предприятия).
  • Используется кодировка UTF8 для корректного отображения кириллицы.
  • Файл не блокируется другими процессами.
Клиент → Сообщить() + форматирование или JSON; Сервер → Журнал регистрации или временное хранилище; Большие данные → Запись в файл или постраничный вывод; Сложные структуры → Рекурсивные функции или внешние обработки.-->