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