Отчеты СКД классные. Они значительно упрощают жизнь и позволяют пользователям меньше зависеть от программистов. Но иногда все же случаются проблемы при разработке таких отчетов. Сегодня обсудим как выводить отчет в произвольной форме или АРМ’е, а так же проблемы с которыми мы при этом встретимся
Платформа 1С предоставляет возможность расшифровки из коробки, но только в том случае, если мы используем объект «Отчет» и его форму. Если мы выводим отчет на форме обработки — нам придется добавить немного кода.
Для начала создадим обработку, форму обработки и создадим реквизиты формы:
- Результат (ТабличныйДокумент)
- АдресРасшифровки (Строка(0))
- АдресХранилищаСКД (Строка(0))
На форме сделаем два элемента:
- Поле табличного документа «Результат» (ПутьКДанным — «Результат»)
- Кнопка «Обновить»
Пойдем от очень простого к простому.
Код кнопки «Обновить» будет таким:
1 |
ОбновитьОтчетНаСервере(); |
И добавим процедуру:
1 2 3 4 5 6 |
&НаСервере Процедура ОбновитьОтчетНаСервере() ОбъектОтчета = Отчеты.ИмяНашегоОтчета.Создать(); Результат.Очистить(); ОбъектОтчета.СкомпоноватьРезультат(Результат); КонецПроцедуры |
Это минимум кода, который нам необходим, чтобы вывести отчет.
Тут-то и появляется вопрос «Куда делась расшифровка?».
Для того, чтобы появилась расшифровка нам надо изменить нашу процедуру ОбновитьОтчетНаСервере:
1 2 3 4 5 6 7 |
&НаСервере Процедура ОбновитьОтчетНаСервере() ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; ОбъектОтчета = Отчеты.ИмяНашегоОтчета.Создать(); Результат.Очистить(); ОбъектОтчета.СкомпоноватьРезультат(Результат, ДанныеРасшифровки); КонецПроцедуры |
Теперь мы добавили данные расшифровки в наш отчет.
Но и это еще не все. Если мы сформируем отчет у нас будет расшифровка. но вместо нее мы будем видеть цифры, как на скриншоте
Эту проблему я встречал достаточно часто на различных форумах. Но и это не проблема.
Достаточно создать событие «ОбработкаРасшифровки» для поля табличного документа со следующим кодом:
1 2 3 4 5 6 7 8 9 10 11 |
СтандартнаяОбработка = Ложь; ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресХранилищаСКД); ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресРасшифровки, ИсточникДоступныхНастроек); ДоступныеДействия = Новый Массив(); ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение); Оповещение = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Продолжение", ЭтаФорма, Расшифровка); ОбработкаРасшифровки.ПоказатьВыборДействия(Оповещение, Расшифровка, ДоступныеДействия, , Истина); |
И передать данные расшифровки с сервера на клиент. Кстати именно для этого мы сделали два реквизита «АдресРасшифровки» и «АдресХранилищаСКД».
Для этого опять изменим процедуру ОбновитьОтчетНаСервере и приведем ее вот к такому виду:
1 2 3 4 5 6 7 8 9 10 |
&НаСервере Процедура ОбновитьОтчетНаСервере() ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; ОбъектОтчета = Отчеты.ИмяНашегоОтчета.Создать(); Результат.Очистить(); ОбъектОтчета.СкомпоноватьРезультат(Результат, ДанныеРасшифровки); АдресХранилищаСКД = ПоместитьВоВременноеХранилище(ОбъектОтчета.СхемаКомпоновкиДанных, УникальныйИдентификатор); АдресРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор); КонецПроцедуры |
Теперь добавим процедуру для обработки вышеуказанного оповещения:
1 2 3 4 5 6 7 8 9 10 |
&НаКлиенте Процедура РезультатОбработкаРасшифровки_Продолжение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт Если ПараметрВыполненногоДействия <> Неопределено Тогда Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ПоказатьЗначение(,ПараметрВыполненногоДействия); КонецЕсли; КонецЕсли; КонецПроцедуры |
Запускаем — смотрим.
Видим, что мы уже почти все сделали. Отчет работает, выводит меню расшифровки и даже открывает ссылки справочников и документов. Осталось два вопроса:
- Как добавить стандартные функции (расшифровку, оформление, фильтрацию) в контекстное меню расшифровки?
- Как добавить нестандартные функции?
В отличии от открытия значений расшифровка и фильтрация требует повторного формирования отчета с заданными настройками.
Эти настройки нам нужно получить и вывести отчет уже с новыми настройками.
Конечный результат модуля формы
Для этого приведем процедуру ОбновитьОтчетНаСервере к такому виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
&НаСервере Процедура ОбновитьОтчетНаСервере(ОписаниеОбработкиРасшифровки = Неопределено) ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; ОбъектОтчета = Отчеты.ИмяНашегоОтчета.Создать(); Результат.Очистить(); Если ОписаниеОбработкиРасшифровки <> Неопределено Тогда ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(АдресРасшифровки); ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиОбъект, Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОбъектОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"))); РезультирующиеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(ОписаниеОбработкиРасшифровки.Идентификатор, ОписаниеОбработкиРасшифровки.ПрименяемыеНастройки); Если ТипЗнч(РезультирующиеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьНастройки(РезультирующиеНастройки); ИначеЕсли ТипЗнч(РезультирующиеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(РезультирующиеНастройки); КонецЕсли; КонецЕсли; ОбъектОтчета.СкомпоноватьРезультат(Результат, ДанныеРасшифровки); АдресХранилищаСКД = ПоместитьВоВременноеХранилище(ОбъектОтчета.СхемаКомпоновкиДанных, УникальныйИдентификатор); АдресРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор); КонецПроцедуры |
А процедуру РезультатОбработкаРасшифровки_Продолжение к такому:
1 2 3 4 5 6 7 8 9 10 11 12 |
&НаКлиенте Процедура РезультатОбработкаРасшифровки_Продолжение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт Если ПараметрВыполненногоДействия <> Неопределено Тогда Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ПоказатьЗначение(,ПараметрВыполненногоДействия); Иначе ОбновитьОтчетНаСервере(Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(АдресРасшифровки, ДополнительныеПараметры, ПараметрВыполненногоДействия)); КонецЕсли; КонецЕсли; КонецПроцедуры |
Подставляем параметры в отчет СКД
Если выводимый отчет имеет параметры — нам надо об этом тоже позаботиться.
Впрочем ничего сложно тут нет.
Предположим, что нам нужно установить параметр «Период» для отчета.
Перед тем как скомпановать результат нужно добавить одну строку:
ОбъектОтчета.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(«Период»,ТекущаяДата());
Таким образом наша процедура примет следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
&НаСервере Процедура ОбновитьОтчетНаСервере(ОписаниеОбработкиРасшифровки = Неопределено) ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; ОбъектОтчета = Отчеты.ИмяНашегоОтчета.Создать(); Результат.Очистить(); Если ОписаниеОбработкиРасшифровки <> Неопределено Тогда ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(АдресРасшифровки); ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиОбъект, Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОбъектОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"))); РезультирующиеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(ОписаниеОбработкиРасшифровки.Идентификатор, ОписаниеОбработкиРасшифровки.ПрименяемыеНастройки); Если ТипЗнч(РезультирующиеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьНастройки(РезультирующиеНастройки); ИначеЕсли ТипЗнч(РезультирующиеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(РезультирующиеНастройки); КонецЕсли; КонецЕсли; ОбъектОтчета.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период",ТекущаяДата()); ОбъектОтчета.СкомпоноватьРезультат(Результат, ДанныеРасшифровки); АдресХранилищаСКД = ПоместитьВоВременноеХранилище(ОбъектОтчета.СхемаКомпоновкиДанных, УникальныйИдентификатор); АдресРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор); КонецПроцедуры |
Все что я хотел рассказать и чем поделиться — подробно изложено в этой статье. Если у вас остались вопросы — добро пожаловать в комментарии.