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

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

Как вывести таблицу значений в табличное поле в 1С

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

Таблица значений в 1С — это объект встроенного языка, который хранит данные в виде строк и колонок в памяти. Сама по себе она невидима для пользователя: чтобы показать её содержимое на форме, нужно связать таблицу с элементом «Табличное поле» (в обычных формах) или с реквизитом формы типа «ТаблицаЗначений» (в управляемых формах). Способ вывода зависит от режима, в котором работает конфигурация.

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

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

Как устроен механизм вывода таблицы на форму

Табличное поле — это визуальный элемент, который отображает данные из источника. Источником может быть таблица значений, табличная часть объекта, результат запроса или динамический список. Элемент формы не хранит данные сам — он лишь показывает то, что лежит в связанном с ним реквизите или свойстве.

Поэтому задача «вывести таблицу значений» всегда сводится к двум действиям: подготовить таблицу с нужными колонками и строками, а затем связать её с табличным полем. Отличие режимов в том, как именно выполняется связь. В обычных формах связь задаётся свойством Значение элемента. В управляемых — через реквизит формы, созданный заранее в конфигураторе или программно.

Вывод в обычной форме

В обычном приложении (режим «Обычное приложение» или толстый клиент) работа выполняется прямо на форме. Сначала в конфигураторе добавьте на форму элемент «Табличное поле». Затем в модуле формы заполните таблицу значений и присвойте её элементу.

Пример кода, который создаёт таблицу с двумя колонками и выводит её в табличное поле с именем ТабличноеПоле1:

ТЗ = Новый ТаблицаЗначений;

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

ТЗ.Колонки.Добавить("Количество");

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = "Товар А";

НоваяСтрока.Количество = 10;

ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;

ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Метод СоздатьКолонки() строит визуальные колонки табличного поля по колонкам таблицы значений. Без него поле останется пустым, даже если данные присвоены. Если колонки уже настроены в конфигураторе вручную, вызывать метод не нужно.

Порядок действий в обычной форме
  1. 1
    Добавьте на форму элемент «Табличное поле» в конфигураторе
  2. 2
    В модуле формы создайте таблицу значений и добавьте колонки
  3. 3
    Заполните таблицу строками (из запроса или вручную)
  4. 4
    Присвойте таблицу свойству Значение табличного поля
  5. 5
    Вызовите СоздатьКолонки(), если колонки не настроены вручную
  6. 6
    Откройте форму в режиме 1С:Предприятие и проверьте отображение

Вывод в управляемой форме

В управляемых формах (тонкий клиент, веб-клиент) объект «ТаблицаЗначений» нельзя напрямую присвоить элементу формы — между сервером и клиентом данные передаются только через реквизиты формы. Поэтому сначала создаётся реквизит типа «ТаблицаЗначений», а табличное поле привязывается к нему через свойство «Путь к данным».

Откройте форму в конфигураторе, перейдите на закладку «Реквизиты», добавьте реквизит с именем, например, ТаблицаДанных и типом «ТаблицаЗначений». Затем у этого реквизита добавьте подчинённые реквизиты-колонки с нужными типами: «Номенклатура» (строка или ссылка на справочник), «Количество» (число) и так далее. Перетащите реквизит на дерево элементов формы — платформа сама создаст табличное поле.

Заполнение реквизита выполняется на сервере:

&НаСервере

Процедура ЗаполнитьТаблицуНаСервере()

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество

|ИЗ РегистрНакопления.ОстаткиТоваров.Остатки";

ТЗ = Запрос.Выполнить().Выгрузить();

ЗначениеВРеквизитФормы(ТЗ, "ТаблицаДанных");

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

Ключевая строка — ЗначениеВРеквизитФормы(). Она переносит содержимое объекта «ТаблицаЗначений» в реквизит формы. Обратная операция — РеквизитФормыВЗначение() — позволяет получить таблицу обратно для обработки.

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Наименование");
    СтрокаТЗ = ТЗ.Добавить();
    СтрокаТЗ.Наименование = "Пример строки";
    ЗначениеВРеквизитФормы(ТЗ, "ТаблицаДанных");
КонецПроцедуры

Программное создание реквизитов, когда структура таблицы заранее неизвестна

Если набор колонок формируется динамически — например, по настройкам пользователя или по структуре произвольного запроса, — реквизиты формы можно создать программно методом ИзменитьРеквизиты(). Этот метод доступен только на сервере и только в контексте формы.

&НаСервере

Процедура СоздатьРеквизитыДинамически()

Добавляемые = Новый Массив;

Добавляемые.Добавить(Новый РеквизитФормы("ДинамТаблица",

Новый ОписаниеТипов("ТаблицаЗначений")));

Добавляемые.Добавить(Новый РеквизитФормы("Колонка1",

Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)),

"ДинамТаблица"));

ИзменитьРеквизиты(Добавляемые);

ЭлементТаблица = Элементы.Добавить("ДинамТаблица", Тип("ТаблицаФормы"));

ЭлементТаблица.ПутьКДанным = "ДинамТаблица";

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

После создания реквизита и элемента нужно добавить визуальные колонки таблицы формы и указать для каждой путь к данным вида ДинамТаблица.Колонка1. Это более трудоёмкий путь, но он единственный, когда структура данных определяется в момент выполнения.

Проверка результата и контрольные точки

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

Для отладки полезно вывести количество строк таблицы через Сообщить(ТЗ.Количество()) перед загрузкой в реквизит. Если строки есть, а на форме пусто — проблема в связке элемента с данными. Если строк нет — проблема в запросе или логике заполнения.

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

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

Таблица на форме
Норма

Видны строки и колонки с данными

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

Поле пустое или отображается только шапка без строк

Количество строк через Сообщить()
Норма

Число больше нуля

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

Ноль — запрос или заполнение не дали данных

Имена колонок
Норма

Имена колонок ТЗ совпадают с именами реквизитов-колонок

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

Расхождения в именах — лишние или отсутствующие колонки

Контекст выполнения
Норма

Запрос выполняется в серверной процедуре

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

Ошибка «Процедура или функция не определена» на клиенте

Типичные ошибки и как их избежать

Большинство проблем при выводе таблицы значений связано с непониманием разницы между обычными и управляемыми формами. Код, написанный для обычного приложения, в управляемой форме просто не скомпилируется: свойства ЭлементыФормы там нет, используется коллекция Элементы.

Вторая группа ошибок — попытка обратиться к реквизиту формы как к таблице значений напрямую, например ТаблицаДанных.Добавить() в клиентской процедуре без преобразования. В управляемой форме реквизит имеет тип «ДанныеФормыКоллекция», и у него другой набор методов, хотя добавление строк через Добавить() в нём тоже поддерживается — но обращение идёт через Объект.ИмяТаблицы или напрямую к реквизиту, а не к объекту «ТаблицаЗначений».

Типичные ошибки
01
Присвоение ТаблицаЗначений элементу управляемой формы напрямую — ошибка несовместимости типов; нужен ЗначениеВРеквизитФормы()
02
Забытый СоздатьКолонки() в обычной форме — данные присвоены, но поле выглядит пустым
03
Выполнение запроса в клиентской процедуре управляемой формы — ошибка компиляции или недоступность контекста
04
Несовпадение имён колонок ТЗ и реквизитов формы — часть данных не отображается без сообщения об ошибке
05
Повторное заполнение без Очистить() — строки дублируются при каждом обновлении

Альтернативы: динамический список и табличный документ

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

Если таблицу нужно только показать или напечатать, а редактирование не требуется, подойдёт табличный документ — тот же макет, что используется для печатных форм. Для отчётных задач лучший инструмент — СКД (система компоновки данных), которая строит представление без ручной работы с таблицами значений.

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

Таблица значений + табличное поле

Подходит для обработанных вручную данных; требует кода заполнения и контроля структуры

Динамический список

Лучший выбор для данных одной таблицы или запроса; автообновление, отборы, порционная загрузка; не подходит для произвольных вычислений

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

Только просмотр и печать; нет интерактивного редактирования

СКД-отчёт

Сложные отчёты с группировками и настройками пользователем; избыточен для простой таблицы на форме

Итог

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

В обычных формах таблицу значений выводят через свойство Значение табличного поля и метод СоздатьКолонки(). В управляемых — через реквизит формы типа «ТаблицаЗначений» и метод ЗначениеВРеквизитФормы(), при этом запросы выполняются только на сервере. Имена колонок таблицы и реквизита должны совпадать, а перед повторным заполнением коллекцию нужно очищать.

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

Почему табличное поле пустое, хотя таблица значений заполнена?

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

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

Перед повторным заполнением очистите коллекцию: для реквизита управляемой формы — ТаблицаДанных.Очистить(), для таблицы значений — ТЗ.Очистить(). Затем загрузите данные заново. Без очистки строки добавятся к существующим и задублируются.

Можно ли редактировать данные прямо в табличном поле?

Да, если у элемента не снято свойство «Только просмотр» и не установлено «Редактирование» в значение «Нет». Изменения пользователя сохраняются в реквизите формы; чтобы получить их для обработки, используйте РеквизитФормыВЗначение() на сервере.

Как вывести таблицу значений без формы, просто посмотреть?

Используйте табличный документ: заполните его построчно или через макет и вызовите метод Показать(). Это удобно для быстрой отладки, когда создавать полноценную форму нецелесообразно.

Чем ТаблицаЗначений отличается от ДанныеФормыКоллекция в управляемой форме?

ТаблицаЗначений — самостоятельный объект встроенного языка, живущий на сервере. ДанныеФормыКоллекция — представление реквизита формы, доступное и на клиенте, с ограниченным набором методов. Перенос между ними выполняют методы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение().

Работает ли этот подход в мобильном клиенте 1С?

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