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