Универсальная печать таблицы значений для 1С 8

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

1. Самый простой вариант через построитель отчета.

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

 

2. Второй вариант распечатать произвольную таблицу значений это использовать макет и построчный вывод ТЗ. В этом варианте надо подготовить макет, поместить его, например, в "общие макеты". В макете надо сделать табличку с 2-мя именованными вертикальными областями "Основной", "Показатели"; с 3-мя именованными горизонтальными областями "Шапка", "Строка", "Итог". Далее перебором всех колонок ТЗ вывести их в табличный документ.

 

 

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

 Результат печати ниже. Обработку с примером можно скачать здесь.

3. Третий вариант вывода таблицы значений через СКД

 

&НаСервере
Функция ПечатьТаблицыЗначенийСКД(ТЗ, Таб)
	
	///Таб = Новый ТабличныйДокумент;	
	
	СКД = Новый СхемаКомпоновкиДанных();
	Источник1 = СКД.ИсточникиДанных.Добавить();
	Источник1.Имя = "Основной";
	Источник1.ТипИсточникаДанных = "Local";	

	Набор1 = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	Набор1.Имя = "ИмяНабора";
	Набор1.ИмяОбъекта = "НаборТЗ";
	Набор1.ИсточникДанных = "Основной";

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

	ГруппировкаКомпоновкиДанных = СКД.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));							   
	ГруппировкаКомпоновкиДанных.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанных.Использование = Истина;
	
	ДанныеРасшифровки = Новый  ДанныеРасшифровкиКомпоновкиДанных;

	//Объект для создания макета компоновки данных
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	Попытка
		МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, СКД.НастройкиПоУмолчанию, ДанныеРасшифровки);
	Исключение 
		Сообщить(ОписаниеОшибки());
		Возврат Таб;		
	КонецПопытки;

	//Объект, выполняющий компоновку данных. 
	ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
	ВнешнийНаборДанных = Новый Структура("НаборТЗ", ТЗ);
	ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки, Истина);

	//Вывожу Результат компоновки данных в табличный документ.
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;	
	ПроцессорВывода.УстановитьДокумент(Таб);
	ПроцессорВывода.Вывести(ПроцессорКД);
	
	АдресРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, ЭтаФорма.УникальныйИдентификатор);
	
	Возврат Таб;	
	
КонецФункции

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

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
	СтандартнаяОбработка = Ложь;
	
	Если ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") тогда		
		ОткрытьЗначение(ПолучитьРасшифровку(Расшифровка));
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьРасшифровку(Расшифровка)
	
	ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресРасшифровки);
	ЭлементРасшифровки = ДанныеРасшифровки.Элементы[Расшифровка];
	Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
		Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
			Возврат Поле.Значение;
		КонецЦикла;
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции
Комментарии  
+4 #2 Павел Васянин 13.12.2019 08:44
Спасибо !
Благодаря Вам съэкономил время !
+4 #1 Ираида, г.Березники 06.11.2019 06:22
Класс!!!! Коллеги, то что нужно!!!! :-)

You have no rights to post comments