Как вывести макет в поле табличного документа на управляемой форме 1С и нужен ли метод РеквизитФормыВЗначение()?

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

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

В чем разница между элементом формы и реквизитом формы?

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

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

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

Способ 1. Заполнение табличного документа в контекстном серверном вызове (&НаСервере)

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

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

Посмотрим на пример контекстного формирования печатной формы:


&НаКлиенте
Процедура Сформировать(Команда)
    СформироватьНаСервере();
КонецПроцедуры

&НаСервере
Процедура СформироватьНаСервере()
    // Очищаем реквизит формы перед формированием
    ТабДок.Очистить();
    
    // Для встроенной обработки макет можно получить через менеджер:
    // Макет = Обработки.МояОбработка.ПолучитьМакет("Макет");
    // Если это внешняя обработка, получаем объект обработки:
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    Макет = ОбъектОбработки.ПолучитьМакет("Макет");
    
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьШапка.Параметры.Заголовок = "Сформированный отчет";
    ТабДок.Вывести(ОбластьШапка);
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    Для Сч = 1 По 5 Цикл
        ОбластьСтрока.Параметры.Номер = Сч;
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
КонецПроцедуры

Способ 2. Формирование через бесконтекстный серверный вызов (&НаСервереБезКонтекста)

Разберем более производительный подход. Чтобы не передавать тяжелый контекст формы между клиентом и сервером при каждом формировании, рекомендуется использовать директиву &НаСервереБезКонтекста.

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

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


&НаКлиенте
Процедура СформироватьОптимально(Команда)
    ТабДок = СформироватьБезКонтекста();
КонецПроцедуры

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

Полезные настройки элемента формы

Для корректного отображения сформированного документа в интерфейсе пользователя рекомендуется настроить свойства элемента формы (в свойствах или в процедуре ПриСозданииНаСервере):

  1. Элементы.ПолеТабДок.ТолькоПросмотр = Истина; — блокирует случайное редактирование ячеек пользователем.
  2. Элементы.ПолеТабДок.ОтображатьСетку = Ложь; — скрывает стандартную сетку ячеек при выводе печатных бланков.
  3. Элементы.ПолеТабДок.ОтображатьЗаголовки = Ложь; — скрывает номера строк и буквенные обозначения колонок (A, B, C...).
← На главную