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