В данной статье я решил представить пример использования расшифровки отчета СКД, а также формирование СКД с помощью программных алгоритмов. На сайте ИТС есть пример "Работа с расшифровкой в управляемом приложении", но там приведен пример программного кода отдельно взятых кусков кода.
Для случая, когда форма отчета, основанного на СКД, строится в ручном режиме, прошу обратить внимание на скриншот, на котором показаны основные настройки (реквизиты, кнопки, группы) которые необходимо добавить на форму. Важные области формы указаны красными прямоугольниками.
Ниже представлен программный код кнопки "Сформировать". На данном этапе формируется отчет и заполняются данные для расшифровки.
&НаКлиенте
Процедура Сформировать(Команда)
// инициировать формирование отчета
СформироватьНаСервере();
// при программном выводе отчета СКД
// табличный документ "Результат" будет засерен
// для исправления этой ситуации скорретируем состояние отчета
Элементы.Результат.ОтображениеСостояния.Видимость = ложь;
Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
// очищаем табличный документ
Результат.Очистить();
// получаем СКД
МакетСКД = ПолучитьМакетОбъекта("ОсновнаяСхемаКомпоновкиДанных");
// получаем пользовательские настройки СКД
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
// Готовим объект, который будет содержащать информацию о расшифровке
ДанныеРасшифровкиОтчета = Новый ДанныеРасшифровкиКомпоновкиДанных;
// Готовим объект для создания макета компоновки данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Формируем макет компоновки с нашими настройками
// и не забываем указывать объект для хранения расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(МакетСКД,Настройки,ДанныеРасшифровкиОтчета);
// выводим данные СКД в макет компоновки и заполняем данные расшифровки
ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКомпоновки,,ДанныеРасшифровкиОтчета);
// На форме есть реквизит "ДанныеРасшифровки" с типом "Строка"
// присвоим адрес хранилища наших данных расшифровок этой переменной
ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОтчета,Новый УникальныйИдентификатор);
// выводим данные в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКД);
КонецПроцедуры
&НаСервере
Функция ПолучитьМакетОбъекта(ИмяМакета)
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
Возврат ОтчетОбъект.ПолучитьМакет(ИмяМакета);
КонецФункции // ПолучитьМакетОбработки()
Для программной обработки расшифровки используем событие табличного документа "ОбработкаРасшифровки". Пишем там следующее:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// отключаем стандартный механизм
СтандартнаяОбработка = Ложь;
// готовим объект обрабатывающий расшифровку
// в первый параметр указываем адрес хранилища данных расшифровки (который мы подготовили при формировании отчета)
// во второй параметр настройки нашего отчета
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
// подготавливаем доступные действия
// их может быть больше чем один
// но если указать одной действие, то при обработки расшифровки будет выполнено именно оно
// без возможности выбора других
МассивДоступныхДействий = Новый Массив();
МассивДоступныхДействий.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
// в режим запрета модальности используется метод "ПоказатьВыборДействия", иначе можно использовать метод "ВыбратьДействие"
ОбработкаРасшифровки.ПоказатьВыборДействия(Новый ОписаниеОповещения("ОбработатьРасшифровку",ЭтаФорма),Расшифровка,МассивДоступныхДействий);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьРасшифровку(ВыбранноеДействие,ВыбранноеЗначение,Параметр3) Экспорт
// поле выбора действия, обрабаытваем нужные нам манипуляции
// в нашем случае можно этого не делать, так как у нас доступно только действие "ОткрытьЗначение"
Если ВыбранноеДействие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Тогда
Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
// в режиме запрета модальности используем "ПоказатьЗначение"
ПоказатьЗначение(,ВыбранноеЗначение);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Вот и все. Можно пробовать.
PS: Данный пример показан для тех случаев, когда стандартных механизмов СКД недостаточно, или необходимо немного изменить алгоритм формирования СКД и расшифровки к ней. Автоматически генерируемая форма отчета построенная на СКД, выполняет весь данный функционал сама.