Как отобразить ТаблицуЗначений на управляемой форме в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на управляемых формах в 1С:Предприятие 8.3 часто возникает ситуация: на сервере сформирована или получена ТаблицаЗначений, и ее данные необходимо вывести пользователю на экран. Рассмотрим, почему нельзя напрямую передать этот объект на клиент и какими способами можно правильно отобразить данные на форме.

Особенности работы с ТаблицейЗначений в управляемом приложении

Главное ограничение клиент-серверной архитектуры 1С заключается в том, что тип данных ТаблицаЗначений недоступен на тонком и веб-клиенте. На клиенте элементы формы типа «Таблица» работают с объектом ДанныеФормыКоллекция.

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

Способ 1. Использование реквизита формы типа «ТаблицаЗначений»

Это основной и самый удобный способ для вывода произвольных табличных данных, не связанных напрямую с объектом базы данных.

Разберем процесс настройки и заполнения по шагам:

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

Посмотрим на пример кода заполнения реквизита формы на сервере:


&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
    
    // Получаем или формируем ТаблицуЗначений на сервере
    ТЗДанные = СформироватьДанные();
    
    // Вариант А: Использование метода ЗначениеВРеквизитФормы
    ЗначениеВРеквизитФормы(ТЗДанные, "ТаблицаНаФорме");
    
    // Вариант Б: Использование метода Загрузить() у реквизита формы
    // ТаблицаНаФорме.Загрузить(ТЗДанные);
    
КонецПроцедуры

Способ 2. Загрузка данных в табличную часть объекта

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

Рассмотрим пример кода:


&НаСервере
Процедура ЗагрузитьВТабличнуюЧастьНаСервере()
    
    // Формируем или получаем ТаблицуЗначений с совпадающими именами колонок
    ТЗДанные = ПолучитьТаблицуТоваров();
    
    // Загружаем данные в табличную часть объекта формы
    Объект.Товары.Загрузить(ТЗДанные);
    
КонецПроцедуры

Метод Загрузить() автоматически очищает текущую коллекцию и переносит строки из таблицы значений по совпадающим именам колонок.

Способ 3. Передача таблицы значений между формами через Временное хранилище

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

Проанализируем порядок действий:

  1. На сервере помещаем ТаблицуЗначений во временное хранилище и получаем строковый адрес.
  2. Передаем полученный адрес в параметрах открытия целевой формы.
  3. В целевой форме в событии ПриСозданииНаСервере извлекаем таблицу из хранилища и загружаем ее в реквизит формы.

Посмотрим на пример реализации:


// В исходной форме при открытии новой формы:
&НаСервере
Функция ПоместитьТаблицуВХранилище()
    ТЗ = СформироватьДанные();
    Возврат ПоместитьВоВременноеХранилище(ТЗ, УникальныйИдентификатор);
КонецФункции

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

// В целевой форме в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("АдресТаблицы") И ЗначениеЗаполнено(Параметры.АдресТаблицы) Тогда
        ТЗДанные = ПолучитьИзВременногоХранилища(Параметры.АдресТаблицы);
        ТаблицаНаФорме.Загрузить(ТЗДанные);
    КонецЕсли;
    
КонецПроцедуры

Рекомендации по производительности

При передаче табличных данных на клиент важно учитывать объем информации. Все строки реквизита формы передаются между сервером и клиентом при вызове контекста формы.

Выясним основные правила оптимизации:

← На главную