Расшифровка СКД. Управляемые формы

Программирование - Практика программирования

57
Отчеты СКД классные. Они значительно упрощают жизнь и позволяют пользователям меньше зависеть от программистов. Но иногда все же случаются проблемы при разработке таких отчетов. Сегодня обсудим как выводить отчет в произвольной форме или АРМ’е, а так же проблемы с которыми мы при этом встретимся. Для тех, кто предпочитает сразу готовый результат - обработка во вложении. Остальных приглашаю почитать эту статью.

Платформа 1С предоставляет возможность расшифровки из коробки, но только в том случае, если мы используем объект “Отчет” и его форму. Если мы выводим отчет на форме обработки – нам придется добавить немного кода.

Для начала создадим обработку, форму обработки и создадим реквизиты формы:

  1. Результат (ТабличныйДокумент)
  2. АдресРасшифровки (Строка(0))
  3. АдресХранилищаСКД (Строка(0))

На форме сделаем два элемента:

  1. Поле табличного документа “Результат” (ПутьКДанным – “Результат”)
  2. Кнопка “Обновить”

Пойдем от очень простого к простому.

Код кнопки “Обновить” будет таким:

ОбновитьОтчетНаСервере();

И добавим процедуру:

&НаСервере
Процедура ОбновитьОтчетНаСервере()
    ОбъектОтчета = Отчеты.ИмяНашегоОтчета.Создать();
    Результат.Очистить();
    ОбъектОтчета.СкомпоноватьРезультат(Результат);
КонецПроцедуры

Это минимум кода, который нам необходим, чтобы вывести отчет.

Тут-то и появляется вопрос “Куда делась расшифровка?”.

Для того, чтобы появилась расшифровка нам надо изменить нашу процедуру ОбновитьОтчетНаСервере:

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

Теперь мы добавили данные расшифровки в наш отчет.

Но и это еще не все. Если мы сформируем отчет у нас будет расшифровка. но вместо нее мы будем видеть цифры, как на скриншоте

Эту проблему я встречал достаточно часто на различных форумах. Но и это не проблема.

Достаточно создать событие “ОбработкаРасшифровки” для поля табличного документа со следующим кодом:

    СтандартнаяОбработка = Ложь;
 
    ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресХранилищаСКД);
 
    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресРасшифровки, ИсточникДоступныхНастроек);
 
    ДоступныеДействия = Новый Массив();
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
    
    Оповещение = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Продолжение", ЭтаФорма, Расшифровка);
    ОбработкаРасшифровки.ПоказатьВыборДействия(Оповещение, Расшифровка, ДоступныеДействия, , Истина);

И передать данные расшифровки с сервера на клиент. Кстати именно для этого мы сделали два реквизита “АдресРасшифровки” и “АдресХранилищаСКД”.

Для этого опять изменим процедуру ОбновитьОтчетНаСервере и приведем ее вот к такому виду:

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

Теперь добавим процедуру для обработки вышеуказанного оповещения:

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

Запускаем – смотрим.

Видим, что мы уже почти все сделали. Отчет работает, выводит меню расшифровки и даже открывает ссылки справочников и документов. Осталось два вопроса:

  1. Как добавить стандартные функции (расшифровку, оформление, фильтрацию) в контекстное меню расшифровки?
  2. Как добавить нестандартные функции?

В отличии от открытия значений расшифровка и фильтрация требует повторного формирования отчета с заданными настройками.

Эти настройки нам нужно получить и вывести отчет уже с новыми настройками.

Конечный результат модуля формы

Для этого приведем процедуру ОбновитьОтчетНаСервере к такому виду:

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

А процедуру РезультатОбработкаРасшифровки_Продолжение к такому:

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

Подставляем параметры в отчет СКД

Если выводимый отчет имеет параметры – нам надо об этом тоже позаботиться.

Впрочем ничего сложно тут нет.

Предположим, что нам нужно установить параметр “Период” для отчета.

Перед тем как скомпановать результат нужно добавить одну строку:

ОбъектОтчета.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“Период”,ТекущаяДата());

Таким образом наша процедура примет следующий вид:

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

Все что я хотел рассказать и чем поделиться – подробно изложено в этой статье. Если у вас остались вопросы – добро пожаловать в комментарии.

Во вложении готовая обработка, в которой нужно указать имя отчета и нажать кнопку "Обновить". В результате будет выведен указанный отчет в поле табличного документа.
ВНИМАНИЕ!!! Если отчет требует установку параметров - воспользуйтесь инструкцией, которую я описал выше.
Обработка тестировалась на версии платформы 8.3.10.2466

57

Скачать файлы

Наименование Файл Версия Размер
Расшифровка СКД. Управляемые формы
.epf 6,90Kb
21.11.17
30
.epf 6,90Kb 30 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. Сурикат 181 28.02.18 14:18 Сейчас в теме
2. kn 61 15.07.18 08:51 Сейчас в теме
Много пришлось просмотреть сообщений на форуме и другой инфы, пока не нашлась эта публикация. Было полезно узнать про работу с расшифровкой СКД в тонком клиенте. Большое спасибо!
Оставьте свое сообщение