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

21.11.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расшифровка СКД. Управляемые формы
.epf 6,90Kb
86
86 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159453    874    399    

861

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8684    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    6996    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3148    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10808    23    John_d    25    

124

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

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

05.12.2023    8017    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Сурикат 401 28.02.18 14:18 Сейчас в теме
Просто спасли!
Спасибо!
2. Olga12 170 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 Сейчас в теме
Автор спасибо за статью. Вопрос такого характера. Как мне на тонком клиенте, в модуле формы, получить объект типа "ДанныеРасшифровкиКомпоновкиДанных". Использую процедуру ПриСозданииНаСервере.
При попытке получить на тонком клиенте выдаёт тип "Строка".
Тот же код на толстом выдаёт правильный результат?
Что нужно добавить или изменить, ума не приложу, ведь в модуле объекта, если нажимаю "Сформировать" всё получается.
Где же эта ошибка?
Оставьте свое сообщение