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

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

Как вывести массив на экран в 1С

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

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

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

Вывод массива через Сообщить() в цикле

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

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

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

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

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

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

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

КонецЦикла;

Если нужны порядковые номера элементов, используйте цикл со счётчиком и обращение по индексу — индексация массива в 1С начинается с нуля:

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

Сообщить("Элемент [" + Индекс + "] = " + МассивТоваров[Индекс]);

КонецЦикла;

Учтите ограничение: Сообщить() ожидает строку. Если элемент массива — число, дата или ссылка, платформа выполнит неявное преобразование, но для сложных типов (структура, другой массив, COM-объект) вы получите ошибку или бесполезный вывод. В таких случаях формируйте строку явно, извлекая нужные свойства объекта.

Вывод массива одной строкой через СтрСоединить()

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

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

МассивСкладов.Добавить("Основной");

МассивСкладов.Добавить("Розничный");

МассивСкладов.Добавить("Транзитный");

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

Сообщить(СтрокаРезультат); // Основной, Розничный, Транзитный

Разделитель можно опустить — тогда элементы склеятся вплотную. В качестве разделителя допустим любой текст, включая перевод строки Символы.ПС, что даёт вывод «столбиком» одним вызовом.

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

1c
// Совместимость со старыми платформами
Результат = "";
Для Каждого Элемент Из Массив Цикл
    Результат = Результат + ?(Результат = "", "", ", ") + Строка(Элемент);
КонецЦикла;
Сообщить(Результат);

Вывод массива в табличное поле формы

Для показа массива пользователю в интерфейсе стандартный подход — перенести данные в таблицу значений и привязать её к табличному полю управляемой формы. Напрямую присвоить массив реквизиту формы типа «ТаблицаЗначений» нельзя, но можно заполнить её программно.

Порядок действий в управляемой форме: создайте реквизит формы типа «ТаблицаЗначений» с нужными колонками, перетащите его на дерево элементов формы, затем заполните из массива в коде:

&НаСервере

Процедура ЗаполнитьТаблицуИзМассива(МассивДанных)

ТаблицаНаФорме.Очистить();

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

НоваяСтрока = ТаблицаНаФорме.Добавить();

НоваяСтрока.Наименование = Элемент;

КонецЦикла;

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

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

Порядок действий
  1. 1
    Создайте реквизит формы типа ТаблицаЗначений и добавьте колонки
  2. 2
    Перетащите реквизит в дерево элементов формы — появится табличное поле
  3. 3
    В серверной процедуре очистите таблицу и заполните её циклом по массиву
  4. 4
    Откройте форму и проверьте, что все элементы отображаются в строках

Отладка массива через табло и окно выражений

Во время отладки выводить массив кодом не обязательно — конфигуратор позволяет посмотреть содержимое напрямую. Установите точку останова после заполнения массива, выделите переменную и нажмите Shift+F9 («Вычислить выражение») или добавьте её в табло (Ctrl+Shift+W в окне вычисления — кнопка «Включить в табло»).

В окне выражения массив отображается с кнопкой «Показать значение в отдельном окне» — откроется просмотр всех элементов с индексами. Это быстрее, чем вставлять временные вызовы Сообщить(), и не загрязняет код, который потом придётся чистить.

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

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

Вывод массива в табличный документ и печатную форму

Если массив нужно показать в отчёте или печатной форме, данные выводятся в табличный документ через макет. Создайте макет с областью-строкой, затем в цикле по массиву заполняйте параметры области и выводите её в результирующий документ.

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

Макет = ПолучитьМакет("МакетСписка");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

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

ОбластьСтрока.Параметры.Значение = Элемент;

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

ТабДок.Показать("Список значений");

Для отчётов на СКД массив как источник данных не подходит напрямую — преобразуйте его в таблицу значений и передайте через ВнешниеНаборыДанных в КомпоновщикМакета. Это стандартный приём для отчётов по программно сформированным данным.

Сравнение вариантов вывода

Сообщить() в цикле

Быстро для отладки и служебных сообщений; не подходит для больших объёмов и красивого представления

СтрСоединить()

Компактная строка для заголовков и текстов; только строковые элементы, нет структуры

Таблица значений на форме

Полноценный интерфейс с сортировкой и отбором; требует создания реквизитов формы

Табличный документ

Печать и сохранение в файл; нужен макет, больше кода

Типичные ошибки при выводе массива

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

Вторая ошибка — выход за границы массива при ручной индексации. Цикл Для Индекс = 0 По Массив.Количество() Цикл вызовет ошибку на последней итерации, потому что последний индекс равен Количество() - 1. Используйте ВГраница() или цикл Для Каждого.

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

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

Как проверить корректность вывода

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

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

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

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

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

Совпадает с Массив.Количество()

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

Строк меньше или появились дубли при повторном вызове

Пустой массив
Норма

Пустая таблица или понятное сообщение, ошибок нет

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

Ошибка выполнения или одна пустая строка с мусором

Типы элементов
Норма

Все элементы отображаются читаемо

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

Слово «Массив», «Структура» или пустые значения вместо данных

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

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

Да, если элементы строковые — функция СтрСоединить(Массив, ", ") вернёт одну строку со всеми элементами. Для нестроковых типов потребуется предварительное преобразование или цикл.

Почему Сообщить(Массив) выводит слово «Массив» вместо значений?

Платформа не раскрывает содержимое коллекций при неявном преобразовании в строку — выводится только имя типа. Переберите массив циклом и выводите каждый элемент отдельно.

Как вывести массив структур пользователю?

Преобразуйте его в таблицу значений: создайте колонки под поля структуры и в цикле заполняйте строки обращением к свойствам. Таблицу привяжите к табличному полю формы или выведите в табличный документ.

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

Поставьте точку останова, в режиме отладки выделите переменную и нажмите Shift+F9. В окне вычисления выражения нажмите «Показать значение в отдельном окне» — откроется список элементов с индексами.

Что делать, если массив содержит тысячи элементов?

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

Работает ли СтрСоединить в старых версиях платформы?

Функция появилась в платформе 8.3.6. На более ранних версиях объединяйте элементы вручную в цикле с добавлением разделителя через конкатенацию строк.

Итог

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

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