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

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

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

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

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

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

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

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

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

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

Вывод таблицы на управляемую форму

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

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

&НаСервере

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

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

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

"ВЫБРАТЬ ПЕРВЫЕ 100

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

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

|ИЗ

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

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

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

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

Метод ЗначениеВРеквизитФормы копирует данные с учётом состава колонок реквизита: лишние колонки исходной таблицы будут проигнорированы, отсутствующие — останутся пустыми. Обратная операция — РеквизитФормыВЗначение — позволяет получить таблицу значений из реквизита для обработки на сервере.

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

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

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

&НаСервере

Процедура СоздатьРеквизитТаблицы()

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

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

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

МассивДобавляемых.Добавить(РеквизитТаблица);

Колонка = Новый РеквизитФормы("Наименование",

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

"ДинамТаблица", "Наименование", Ложь);

МассивДобавляемых.Добавить(Колонка);

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

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

После создания реквизита нужно программно добавить элементы формы: элемент типа «ТаблицаФормы» с путём к данным ДинамТаблица и поля-колонки с путями вида ДинамТаблица.Наименование. Это более трудоёмкий путь, но единственный для таблиц с переменной структурой.

Вывод таблицы на обычную форму

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

Программное заполнение выполняется напрямую присваиванием или методом Загрузить:

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

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

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

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

Сравнение способов вывода данных в таблицу формы

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

СпособКогда применятьОграничения
Реквизит «ТаблицаЗначений»Произвольные рассчитанные или загруженные данные, которых нет в базеНет автоматической сортировки и отбора, данные не сохраняются
Динамический списокОтображение данных справочников и документов с отбором и сортировкойТолько чтение, источник — запрос к таблицам базы
Табличная часть объектаРедактируемые данные, которые сохраняются вместе с документом или справочникомПривязка к конкретному объекту конфигурации
Маршрут решения

Как выбрать способ

Данные берутся из таблиц базы и нужны отборы с сортировкойИспользуйте динамический список вместо таблицы значений
Данные рассчитываются программно или загружаются из файлаСоздайте реквизит формы типа «ТаблицаЗначений»
Пользователь должен редактировать и сохранять строки вместе с документомИспользуйте табличную часть объекта
Состав колонок заранее неизвестенСоздавайте реквизит и элементы программно через ИзменитьРеквизиты

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

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

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

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

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

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

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

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

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

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

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

Ссылки, даты и числа отображаются в правильном формате

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

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

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

Старые данные полностью заменяются новыми

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

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

Производительность и ограничения

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

Дополнительно учитывайте, что таблица значений в реквизите формы не поддерживает интерактивную сортировку «из коробки» в том виде, в каком её даёт динамический список. Сортировку и поиск при необходимости реализуют программно методами таблицы значений (Сортировать, НайтиСтроки) с последующим обновлением реквизита.

Если таблица нужна только для просмотра результата обработки, часто проще вывести её в табличный документ методом вывода секций макета и показать пользователю как печатную форму. Это избавляет от создания реквизитов и элементов, а результат можно сразу сохранить или распечатать.
ПЗ
Практическое замечание

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

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

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

Почему таблица на форме пустая, хотя запрос возвращает данные?

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

Как сделать колонки таблицы редактируемыми?

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

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

Используйте метод РеквизитФормыВЗначение("ИмяРеквизита") в серверной процедуре — он вернёт объект ТаблицаЗначений с актуальными данными, включая строки, добавленные или отредактированные пользователем интерактивно.

Что делать, если строк в таблице очень много и форма тормозит?

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

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

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

Итог

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

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