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

21.11.17

Разработка - СКД

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

Скачать исходный код

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124936    682    389    

732

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    4376    31    obmailok    19    

69

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2149    2    Yashazz    0    

31

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8380    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    4929    PROSTO-1C    13    

63

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    6012    15    kalyaka    5    

87

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    7353    accounting_cons    7    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4770    KVIKS    15    

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

Все что связано с СКД - просто какая-то магия.
+
4. user820492 17.12.21 11:24 Сейчас в теме
Отличная статья! Очень помогли, спасибо!
+
5. user1537276 04.05.23 17:21 Сейчас в теме
Автор спасибо за статью. Вопрос такого характера. Как мне на тонком клиенте, в модуле формы, получить объект типа "ДанныеРасшифровкиКомпоновкиДанных". Использую процедуру ПриСозданииНаСервере.
При попытке получить на тонком клиенте выдаёт тип "Строка".
Тот же код на толстом выдаёт правильный результат?
Что нужно добавить или изменить, ума не приложу, ведь в модуле объекта, если нажимаю "Сформировать" всё получается.
Где же эта ошибка?
+
Оставьте свое сообщение