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