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