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

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

Как отобразить таблицу значений на форме 1С

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

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

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

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

Как работает механизм отображения данных на управляемой форме

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

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

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

Создание реквизита формы типа «Таблица значений»

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

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

Состав колонок реквизита должен совпадать со структурой таблицы значений, которую вы будете переносить в форму. Если типы или имена колонок различаются, метод ЗначениеВДанныеФормы() может выдать ошибку несоответствия типов или «молча» потерять часть данных.

Добавление табличного поля на форму

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

Если добавляете элемент вручную: в дереве элементов выберите «Добавить» → «Таблица», в свойстве «ПутьКДанным» укажите имя реквизита (ТаблицаДанных). Затем внутрь таблицы добавьте поля, каждое со своим «ПутьКДанным» вида ТаблицаДанных.Номенклатура.

Обратите внимание на свойство таблицы «КоманднаяПанель» и автоматически создаваемые кнопки «Добавить», «Удалить», «Переместить вверх/вниз». Если таблица предназначена только для просмотра (например, результат отчёта), установите у элемента свойство «ТолькоПросмотр» в значение «Истина», чтобы пользователь случайно не изменил данные.

Заполнение таблицы значений и вывод на форму в коде

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

&НаСервере

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

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

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Номенклатура,

| Номенклатура.Код КАК Код

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

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

ЗначениеВДанныеФормы(ТЗ, ТаблицаДанных);

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

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

Если данные редактируются пользователем и затем нужны для обработки, используйте обратное преобразование: ТЗ = ДанныеФормыВЗначение(ТаблицаДанных, Тип("ТаблицаЗначений")). Полученную таблицу можно обходить в цикле, сворачивать, выгружать в запрос.

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

Динамическое создание реквизитов и колонок

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

&НаСервере

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

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

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

Новый ОписаниеТипов("Число"), "ТаблицаДанных", "Колонка 1"));

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

НовоеПоле = Элементы.Добавить("ТаблицаДанныхКолонка1",

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

НовоеПоле.ПутьКДанным = "ТаблицаДанных.Колонка1";

НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;

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

Здесь второй параметр конструктора РеквизитФормы — путь к родительскому реквизиту, то есть имя таблицы. Создание реквизита и элемента формы выполняется в два этапа: сначала платформа регистрирует колонку в данных формы, затем к ней привязывается визуальное поле.

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

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

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

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

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

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

Таблица значений

Подходит для произвольных данных: результаты расчётов, загрузка из файлов, объединение разных источников. Требует ручного переноса в реквизит и обновления.

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

Подходит для данных из таблиц базы с отборами и сортировкой. Обновляется автоматически, но структура колонок определяется запросом.

Дерево значений

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

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

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

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

Ещё одна распространённая проблема — попытка вызвать ЗначениеВДанныеФормы() в клиентской процедуре. Метод доступен только на сервере, потому что работает с прикладными объектами. Если заполнение инициируется с клиента, организуйте вызов: клиентская процедура команды вызывает серверную, а та выполняет всю работу с данными.

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

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

Отображение строк
Норма

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

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

Таблица пустая или строк меньше — проверяйте имена колонок и путь к данным

Повторное заполнение
Норма

После повторного нажатия кнопки число строк не меняется

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

Строки дублируются — реквизит не очищается перед заполнением

Типы данных в колонках
Норма

Числа выравнены вправо, ссылки кликабельны, даты в формате даты

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

Все значения отображаются как текст — тип колонки реквизита задан неверно

При работе с большими объёмами помните о производительности: перенос таблицы в десятки тысяч строк на форму замедляет открытие и потребляет память клиентского сеанса. В таких случаях выводите ограниченную порцию данных, используйте динамический список или отчёт на СКД вместо табличного поля.

Итог

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

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

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

Можно ли отобразить таблицу значений без создания реквизита формы?

Нет, на управляемой форме это невозможно: элементы формы отображают только реквизиты. Если структура данных известна заранее, реквизит создаётся в конфигураторе; если колонки формируются динамически, реквизиты добавляются программно методом ИзменитьРеквизиты в серверной процедуре.

Почему после ЗначениеВДанныеФормы таблица на форме пустая?

Наиболее вероятные причины: имена колонок таблицы значений не совпадают с именами колонок реквизита, элемент таблицы привязан к другому реквизиту в свойстве ПутьКДанным, либо процедура заполнения вообще не выполняется. Проверьте в отладчике содержимое таблицы значений перед переносом и состав реквизита после него.

Как обновить таблицу на форме без закрытия и повторного открытия?

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

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

Используйте обратное преобразование в серверной процедуре: ТЗ = ДанныеФормыВЗначение(ТаблицаДанных, Тип("ТаблицаЗначений")). Полученную таблицу значений можно обходить в цикле, передавать в запрос через временную таблицу или сохранять в базу.

Что выбрать для больших объёмов данных — таблицу значений или динамический список?

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

Как сделать колонку таблицы недоступной для редактирования?

Установите у соответствующего поля формы свойство ТолькоПросмотр в значение Истина — в конфигураторе через палитру свойств или программно: Элементы.ТаблицаДанныхСумма.ТолькоПросмотр = Истина. Если редактирование запрещено полностью, установите ТолькоПросмотр у всего элемента таблицы.