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

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