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