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