Уведомления
Очистить все

Корректировать вывод (построение отчета) СКД программно.

4 Записи
1 Пользователи
0 Likes
3,609 Просмотры
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

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

А также: Цвет шрифта, Цвет фона, Видимость, Доступность редактирования, Шрифт в ячейках и колонках табличного документа в СКД.

Повлиять на построение макета компоновки данных. На построчный вывод строк в СКД (Формирование отчета СКД построчно). Совместить программный код и работу СКД. И многое-многое другое.

Для этого, в модуле объекта нашего отчета, разместим следующий код (шаблон).

Этот код, в таком первоначальном виде, обеспечивает стандартный вывод отчета в СКД.

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

   
Цитата
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Теперь изменим код стандартного вывода (формирования отчета) СКД.

В самом коде укажем комментарии и произведём некоторые изменения, чтобы стало понятно что к чему.

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

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

Как видим, всё просто, осталось наполнить нашу "заготовку" своим собственным кодом для решения необходимых задач.


   
ОтветитьЦитата
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Еще пример:

Убираем защиту ячеек в макете (табличном документе СКД) по какому либо условию.

Например, пользователи захотели вносить правки в ячейки готового (сформированного) отчета в СКД, а потом его распечатать с такими данными.

Для решения этой задачи необходимо убрать защиту с определенных колонок, строк, ячеек в отчете СКД. (Ниже приложу пример такой работы).

Хочу добавить, что в указанном ниже коде, присутствует полезная функция - "ПолучитьВсеЗначенияРасшифровки(Данные)", которая получает и возвращает тип значения и значения поля табличного документа (отчета / макета) СКД.

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

Функция ПолучитьВсеЗначенияРасшифровки(Данные)
	
	ЗначенияРасшифровки = Новый Структура;
	Поля = Данные.ПолучитьПоля();
	
	Для Каждого текПоле из Поля цикл
		ЗначенияРасшифровки.Вставить(СтрЗаменить(текПоле.Поле, ".", "_"), текПоле.Значение);
	КонецЦикла;
	
	Возврат ЗначенияРасшифровки;
	
КонецФункции

   
ОтветитьЦитата
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Чтобы более раскрыть тему, предложу еще одно решение.

Вопрос:

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

Решение:

ГруппировкаМакетаОтчета = МакетКомпоновкиДанных.Тело[МакетКомпоновкиДанных.Тело.Количество() - 1];
ГруппировкаМакетаТаблицы = Неопределено;

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

Если ГруппировкаМакетаТаблицы = Неопределено Тогда
    ВызватьИсключение "Нарушена структура настроек - не найдена таблица";
КонецЕсли;

ГруппировкаМакетаСтроки = ГруппировкаМакетаТаблицы.Строки[ГруппировкаМакетаТаблицы.Строки.Количество() - 1];
ГруппировкаТелаСтроки = ГруппировкаМакетаСтроки.Тело[ГруппировкаМакетаСтроки.Тело.Количество() - 1];
ИмяМакетаГруппировки = ГруппировкаТелаСтроки.Тело[ГруппировкаТелаСтроки.Тело.Количество() - 1].Макет;

   
ОтветитьЦитата
Поделиться: