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

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

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

Анализ проблемы: почему отчет не выводится?

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

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

Классическое решение: разделение контекста Клиент-Сервер

Рассмотрим по шагам правильную архитектуру вывода печатной формы. Нам необходимо создать пустой документ на клиенте, передать его на сервер для заполнения, а затем показать пользователю.

Посмотрим на пример правильного кода:


&НаСервере
Процедура УниверсальныйОтчетПоТЗНаСервере(Табл)
    // Здесь получаем макет и заполняем Табл данными
    // ...
КонецПроцедуры

&НаКлиенте
Процедура УниверсальныйОтчетПоТЗ()
    Табл = Новый ТабличныйДокумент;
    УниверсальныйОтчетПоТЗНаСервере(Табл);
    Табл.Показать();
КонецПроцедуры

Формирование красивого макета: строки и колонки

Если при выводе все данные слипаются в одну колонку (например, номер строки, ФИО и отдел идут друг под другом), значит, мы неправильно работаем с областями макета. Вспомним про методы Вывести() и Присоединить().

Метод Вывести() добавляет область макета вниз (формирует новую строку). Метод Присоединить() добавляет область вправо (формирует новую колонку в текущей строке).

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


ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаДанных");
Для Каждого Стр Из ТЗ Цикл
    ОбластьСтрока.Параметры.Заполнить(Стр);
    Табл.Вывести(ОбластьСтрока);
КонецЦикла;

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

Альтернативные способы вывода ТЗ без ручного макета

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

  1. Использование Построителя Отчета на сервере. Построитель может автоматически сгенерировать табличный документ на основе источника данных. Инициализацию и выполнение нужно делать на сервере.
    
    ПострПечать = Новый ПостроительОтчета;
    ПострПечать.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
    ПострПечать.МакетОформления = ПолучитьМакетОформления(СтандартноеОформление.Интерфейс);
    ПострПечать.Выполнить();
    
    // Задаем заголовки колонок, если нужно
    Для каждого Колонка Из ПострПечать.ВыбранныеПоля Цикл
        Колонка.Представление = ТЗ.Колонки[Колонка.Имя].Заголовок;
    КонецЦикла; 
    
    ПострПечать.Вывести(Табл); // Выводим в переданный с клиента ТабличныйДокумент
    
  2. Использование СКД (Система Компоновки Данных). Это современный стандарт. Таблицу значений можно передать в процессор компоновки на сервере как внешний набор данных. СКД сама сформирует красивый документ с итогами, группировками и автоподбором ширины колонок.
  3. Вывод в реквизит формы. Вместо вызова Табл.Показать() и открытия нового окна, мы можем добавить на управляемую форму реквизит с типом ТабличныйДокумент. В серверной процедуре заполняем этот реквизит, и данные отображаются прямо в текущем окне.

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

← На главную