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