Как программно вывести табличное поле или таблицу формы в табличный документ с сохранением колонок в 1С?

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

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

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

Способ 1. Использование объекта ПостроительОтчета

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

Для того чтобы учесть только нужные колонки и их пользовательские заголовки, выполним следующие шаги:

  1. Выгрузим исходные данные в объект ТаблицаЗначений или используем коллекцию данных формы.
  2. Инициализируем ПостроительОтчета и передадим данные через ОписаниеИсточникаДанных.
  3. Очистим коллекцию ВыбранныеПоля построителя и заполним ее заново, указав имена только видимых полей и их пользовательские заголовки через свойство Представление.
  4. Вызовем метод Вывести(), передав результирующий ТабличныйДокумент.

Посмотрим на пример реализации данного подхода на сервере:


// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;

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

// Инициализируем построитель отчета
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗДанные);

// Очищаем автосформированные поля
Построитель.ВыбранныеПоля.Очистить();

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

// Выводим результат в табличный документ
Построитель.Вывести(ТабДок);

Способ 2. Программная генерация табличного документа по элементам формы

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

Проанализируем алгоритм работы раздельно для клиента и сервера:

  1. На клиенте: обходим коллекцию Элементы.ИмяТаблицы.ПодчиненныеЭлементы. Отбираем только те колонки, у которых свойство Видимость установлено в значение Истина. Собираем массив структур со свойствами: Имя, ПутьКДанным, Заголовок, Ширина, Формат.
  2. На сервере: создаем ТабличныйДокумент, выводим строку заголовков и построчно заполняем данными, применяя форматирование.

Разберем программный код для клиентской части:


&НаКлиенте
Функция ПолучитьНастройкиКолонок(ИмяЭлементаТаблицы)
	НастройкиКолонок = Новый Массив;
	
	ЭлементТаблицы = Элементы[ИмяЭлементаТаблицы];
	Для Каждого Колонка Из ЭлементТаблицы.ПодчиненныеЭлементы Цикл
		Если ТипЗнч(Колонка) = Тип("ПолеФормы") И Колонка.Видимость Тогда
			СтрКолонки = Новый Структура;
			СтрКолонки.Вставить("Имя", Колонка.Имя);
			СтрКолонки.Вставить("ПутьКДанным", СтрЗаменить(Колонка.ПутьКДанным, ИмяЭлементаТаблицы + ".", ""));
			СтрКолонки.Вставить("Заголовок", ?(ЗначениеЗаполнено(Колонка.Заголовок), Колонка.Заголовок, Колонка.Имя));
			СтрКолонки.Вставить("Ширина", Колонка.Ширина);
			СтрКолонки.Вставить("Формат", Колонка.Формат);
			НастройкиКолонок.Добавить(СтрКолонки);
		КонецЕсли;
	КонецЦикла;
	
	Возврат НастройкиКолонок;
КонецФункции

Теперь рассмотрим процедуру вывода на сервере:


&НаСервере
Функция СформироватьТабличныйДокумент(НастройкиКолонок)
	ТабДок = Новый ТабличныйДокумент;
	
	НомерСтроки = 1;
	
	// Формируем шапку таблицы
	НомерКолонки = 1;
	Для Каждого ОписаниеКолонки Из НастройкиКолонок Цикл
		ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);
		ОбластьЯчейки.Текст = ОписаниеКолонки.Заголовок;
		ОбластьЯчейки.Шрифт = Новый Шрифт(ТабДок.Область(НомерСтроки, НомерКолонки).Шрифт,,, Истина);
		
		Если ОписаниеКолонки.Ширина > 0 Тогда
			ТабДок.Область(, НомерКолонки).ШиринаКолонки = ОписаниеКолонки.Ширина;
		КонецЕсли;
		
		НомерКолонки = НомерКолонки + 1;
	КонецЦикла;
	
	// Выводим строки данных
	КоллекцияДанных = Объект.СоставПлана;
	Для Каждого СтрДанных Из КоллекцияДанных Цикл
		НомерСтроки = НомерСтроки + 1;
		НомерКолонки = 1;
		
		Для Каждого ОписаниеКолонки Из НастройкиКолонок Цикл
			ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);
			Значение = СтрДанных[ОписаниеКолонки.ПутьКДанным];
			
			Если ЗначениеЗаполнено(ОписаниеКолонки.Формат) Тогда
				ОбластьЯчейки.Текст = Формат(Значение, ОписаниеКолонки.Формат);
			Иначе
				ОбластьЯчейки.Значение = Значение;
				ОбластьЯчейки.Текст = Строка(Значение);
			КонецЕсли;
			
			НомерКолонки = НомерКолонки + 1;
		КонецЦикла;
	КонецЦикла;
	
	// Оформляем сетку
	ОбластьТаблицы = ТабДок.Область(1, 1, НомерСтроки, НастройкиКолонок.Количество());
	ОбластьТаблицы.Обвести(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 
	                       ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 
	                       ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 
	                       ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
	
	ТабДок.ФиксацияСверху = 1;
	Возврат ТабДок;
КонецФункции

Способ 3. Программное использование Системы компоновки данных (СКД)

Если в таблице планирования требуется динамический вывод итогов, группировок или сложное условное оформление, целесообразно использовать программную СКД:

  1. Создаем объект СхемаКомпоновкиДанных программно.
  2. Добавляем набор данных с типом «Объект», куда в качестве внешней таблицы передается выгруженная коллекция формы.
  3. В настройках схемы динамически добавляем в ВыбранныеПоля только те поля, которые видимы на форме.
  4. Выполняем компоновку через КомпоновщикМакета, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиПрименительноКТабличномуДокументу.

Важные нюансы реализации

При реализации вывода таблиц формы обратите внимание на следующие особенности:

  1. Клиент-серверное разделение: Элементы формы и их свойства (порядок колонок, текущая видимость) доступны только в контексте клиента. Перед формированием отчета на сервере обязательно передавайте массив описания колонок.
  2. Сложные шапки: Если таблица содержит многоуровневую структуру (элементы с типом ГруппаФормы вида ГруппаКолонок), для их вывода потребуется рекурсивный обход элементов с объединением смежных ячеек методом Область.Объединить().
  3. Форматирование типов: При прямом заполнении ячеек табличного документа числа и даты выводятся без разделителей и нужного количества знаков, если не применить явный вызов функции Формат() со строкой форматирования из поля формы.
← На главную