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