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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

В этой теме еще нет сообщений.
Оставьте свое сообщение