К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вывести массив в сообщение в 1С

Как вывести массив в сообщение в 1С: перебор в цикле, СтрСоединить, преобразование в строку. Примеры кода, типичные ошибки и советы по отладке.

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

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

Ниже разобраны рабочие варианты с готовым кодом, ограничения каждого подхода и типичные ошибки, из-за которых сообщение выводится пустым или платформа выдаёт исключение.

Почему массив нельзя вывести напрямую

Методы вывода сообщений в 1С ожидают строковое значение. Когда вы передаёте переменную другого типа, платформа пытается выполнить неявное преобразование. Для чисел, дат и булевых значений это работает, но массив — коллекция, и у него нет осмысленного строкового представления по умолчанию.

Если написать Сообщить(МойМассив), результат зависит от контекста: чаще всего платформа выдаст ошибку «Преобразование значения к типу Строка не может быть выполнено», либо выведет служебное описание объекта без содержимого. В любом случае содержимое массива вы не увидите.

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

Способ 1: перебор массива в цикле

Самый универсальный вариант — обойти массив циклом Для Каждого и вывести каждый элемент отдельным сообщением. Такой подход работает с любыми типами элементов, если каждый из них сам по себе преобразуется в строку.

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

МассивТоваров.Добавить("Номенклатура 1");

МассивТоваров.Добавить("Номенклатура 2");

МассивТоваров.Добавить("Номенклатура 3");

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

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

КонецЦикла;

Если нужен номер элемента, используйте цикл со счётчиком через Для ... Цикл и обращение по индексу, помня, что индексация начинается с нуля:

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

Сообщить(СтрШаблон("Элемент %1: %2", Инд, МассивТоваров[Инд]));

КонецЦикла;

Метод ВГраница() возвращает индекс последнего элемента (количество минус один). Использовать его безопаснее, чем Количество(), потому что при обращении по индексу, равному количеству, возникнет ошибка выхода за границы массива.

Способ 2: склейка массива одной строкой через СтрСоединить

Функция СтрСоединить() объединяет элементы массива в одну строку с заданным разделителем. Это самый короткий способ вывести весь массив одним сообщением:

ТекстСообщения = СтрСоединить(МассивТоваров, Символы.ПС);

Сообщить(ТекстСообщения);

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

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

bsl
ТекстСообщения = СтрСоединить(МассивТоваров, "; ");
Сообщить("Найдены позиции: " + ТекстСообщения);

Вывод массива через объект СообщениеПользователю

В управляемых формах и серверном коде вместо устаревшего Сообщить() рекомендуется объект СообщениеПользователю. Он позволяет привязать сообщение к полю формы, задать ключ данных и корректно отображает сообщения в интерфейсе.

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

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

Сообщение.Текст = Элемент;

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

КонецЦикла;

Логика та же: массив предварительно превращается в строки. Разница только в механизме доставки текста пользователю. В тонком клиенте и веб-клиенте Сообщить() тоже работает, но сообщения через объект выглядят аккуратнее и поддерживают навигацию к реквизиту.

Если сообщение формируется на сервере в контексте объекта (например, в модуле объекта документа), можно заполнить свойство КлючДанных ссылкой на объект — тогда пользователь сможет перейти к нему из панели сообщений.

Массив со сложными элементами: структуры и ссылки

На практике массивы часто содержат не строки, а структуры с несколькими полями — например, список ошибок проведения, где у каждой ошибки есть номер строки и описание. Такой массив нужно разворачивать вручную:

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

ТекстСообщения = СтрШаблон("Строка %1: %2",

Ошибка.НомерСтроки, Ошибка.Описание);

Сообщить(ТекстСообщения);

КонецЦикла;

Для отладки сложных данных удобна сериализация в JSON. Структуры и массивы примитивных значений преобразуются штатно через ЗаписьJSON, и результат можно вывести одним сообщением или записать в журнал регистрации:

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

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

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

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

Учтите: ЗаписатьJSON() не сериализует ссылки на объекты базы данных и многие типы платформы без дополнительной настройки. Для ссылок предварительно извлекайте строковое представление или уникальный идентификатор.

Типичные ошибки
01
Передача массива напрямую в Сообщить() — ошибка преобразования типа или пустой вывод
02
Обращение по индексу равному Количество() вместо ВГраница() — выход за границы массива
03
СтрСоединить() по массиву структур — исключение, так как структура не преобразуется в строку
04
Вывод сотен элементов отдельными сообщениями — переполнение панели сообщений и замедление клиента

Отладка больших массивов и альтернативы сообщениям

Если массив содержит сотни или тысячи элементов, вывод каждого элемента отдельным сообщением непрактичен: панель сообщений переполняется, а клиентское приложение может заметно замедлиться. В таких случаях выводите первые несколько элементов для проверки логики, а полный объём отправляйте в другое хранилище.

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

При отладке в конфигураторе часто вообще не нужны сообщения: поставьте точку останова и посмотрите содержимое массива в табло (Shift+F9) или окне выражений — там коллекция раскрывается с индексами и значениями всех элементов.

Маршрут решения

Как выбрать способ вывода

Нужно быстро проверить массив строк при разработкеИспользуйте СтрСоединить(Массив, Символы.ПС) и одно Сообщить()
Нужно сообщить пользователю об ошибках в управляемой формеПереберите массив циклом и выведите каждый элемент через СообщениеПользователю
Элементы массива — структуры или ссылкиФормируйте строку каждого элемента вручную через СтрШаблон()
Код выполняется в фоновом задании без интерфейсаПишите результат в журнал регистрации вместо сообщений
Массив очень большойОграничьте вывод первыми элементами или выгрузите данные в файл

Проверка результата и частые проблемы

После внедрения вывода проверьте три вещи: сообщение вообще появляется, содержимое соответствует ожидаемому числу элементов, порядок элементов совпадает с логикой заполнения массива. Если сообщение пустое — скорее всего, массив не заполнен: добавьте вывод Массив.Количество() перед основным выводом.

Если вместо значений видны служебные описания вида «Структура» — вы пытаетесь вывести сложный элемент без преобразования. Если платформа выдаёт исключение о преобразовании типа — проверьте тип каждого элемента через ТипЗнч(Элемент) в цикле.

На клиенте в мобильном приложении и веб-клиенте длинные многострочные сообщения могут обрезаться визуально — для диагностики в таких сценариях надёжнее журнал регистрации.

Контрольные точки

Как проверить результат

Появление сообщения
Норма

Сообщение видно в панели сообщений с ожидаемым текстом

Тревожный признак

Сообщения нет — проверьте, что массив заполнен и код вообще выполняется

Содержимое
Норма

Видны значения всех элементов в правильном порядке

Тревожный признак

Выводится служебное описание типа или ошибка преобразования

Количество строк
Норма

Число строк равно Массив.Количество()

Тревожный признак

Строк меньше — возможен выход за границы или пропуск элементов

Итог

Что важно запомнить

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

Частые вопросы

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

Да, если все элементы — строки или значения, преобразуемые к строке. Используйте СтрСоединить(Массив, Разделитель) и передайте результат в Сообщить(). Для массивов структур и ссылок этот способ не подойдёт.

Почему Сообщить() выдаёт ошибку «Преобразование значения к типу Строка не может быть выполнено»?

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

Как вывести массив в сообщение в фоновом задании?

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

Чем СтрСоединить отличается от конкатенации в цикле?

СтрСоединить короче и быстрее для массива строк, но не даёт контроля над форматом каждого элемента. Конкатенация в цикле позволяет добавлять номера, подписи и обрабатывать сложные элементы, но требует больше кода.

Как посмотреть содержимое массива без изменения кода?

В режиме отладки поставьте точку останова после заполнения массива, выделите переменную и нажмите Shift+F9 (табло) — массив раскроется с индексами и значениями всех элементов без какого-либо вывода в сообщения.

Почему выводится только часть элементов массива?

Чаще всего причина в неправильной границе цикла: при переборе по индексу используйте ВГраница(), а не Количество(). Также проверьте, не обрезает ли интерфейс слишком длинное многострочное сообщение.