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