Top.Mail.Ru

Расшифровка в 1С СКД

При разработке отчетов в 1С достаточно часто требуется такая функция как Расшифровка 1С СКД. Обычно под СКД расшифровкой понимается формирование такого же отчета с установленными отборами с дополнительной (более подробной) группировкой.

В том числе такая возможность имеется и в отчетах, созданных с помощью 1С СКД. При этом функционал расшифровки является встроенным и позволяет выполнять пользователю различные действия, без приложения дополнительных усилий со стороны программиста. То есть при создании отчета на СКД программисту достаточно настроить только схему компоновки – без дополнительного кода в модуле отчета и без добавления форм отчета.

Стандартные возможности расшифровки 1С СКД

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

  • Левой клавишей мыши (ЛКМ) или с клавиатуры клавишей Enter на области отчета. При этом для значений ссылочного типа выполняется действие по умолчанию – открытие значения, для полей ресурсов – расшифровка по выбранному полю, для значений группировкой не ссылочного типа – открывается меню выбора действия расшифровки
  • Правой клавишей мыли (ПКМ) . При этом открывается меню выбора действия расшифровки

Какие действия доступны при выполнении расшифровки:

  • Расшифровать – новый отчет с установленными отборами по измерениям и группировкой по выбранному полю
  • Открыть – открыть форму значения ссылочного типа
  • Отфильтровать – новый отчет с дополнительно установленным отбором
  • Упорядочить – новый отчет с дополнительно установленной сортировкой
  • Сгруппировать – новый отчет с дополнительной группировкой
  • Оформить – новый отчет с дополнительно настроенным условным оформлением

Что еще можно сделать с расшифровкой без программирования? В расшифровку попадают значения полей из наборов данных. Иногда возникает необходимость в отчет вывести одно значение, но в качестве расшифровки должно выступать другое поле. Например, регистратор можно выводить как номер, но необходимо, чтобы при клике по нему открывался документ. Это можно сделать без дополнительного программирования – через установку выражения представления

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

Дальше мы будем рассматривать все более сложные ситуации при разработке отчета на СКД. Например, вам может понадобиться добавить свою форму в отчет – добавить какие-то дополнительные команды, настроить более сложный интерфейс для пользователя.

Данные расшифровки 1С СКД

При добавлении новой формы отчета система производит сама настройку формы для использования совместно с СКД. В том числе добавляется реквизит «ДанныеРасшифровки» с типом «Строка». И в свойствах формы производится связь атрибута «Данные расшифровки» с созданным реквизитом.

данные расшифровки 1С СКД

Если вы добавляете форму отчета самостоятельно – например, как произвольную или копируете форму из какого-то другого объекта, для правильной работы расшифровки вам необходимо добавить реквизит и настроить его связь, как описано выше.

Расшифровка при программном выполнении 1С СКД

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

В этом случае, для правильной работы расшифровки, необходимо в модуле объекта отчета в процедуре ПриКомпоновкеРезультата передавать параметр процедуры «ДанныеРасшифровки» в два места кода программного выполнения СКД:

Макеты и расшифровка 1С СКД

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

Рассмотрим настройку простого отчета по регистру оборотов «Продажи»

1с скд макет расшифровка

В схеме добавлено два макета группировки

Если сформировать отчет и навести курсор на группировку «Контрагент», то курсор меняется на «лупу с крестиком» — расшифровка доступна. Если навести курсор на группировки «Номенклатура» или «Детали», расшифровка недоступна.

Макет для группировки «Номенклатура» выглядит следующим образом

Для ячейки макета «Номенклатура» определим свойство «ПараметрРасшифровки»

Назвать параметр расшифровки нужно отлично от свойства «Параметр», тогда в параметрах макета добавится наш параметр расшифровки:

Зайдем здесь в редактирование поля «Выражение», определим основное действие. Например, «Расшифровать»:

Теперь это действие будет выполняться по умолчанию при клике ЛКМ, при клике ПКМ доступно меню всех действий расшифровки. Для остальных ячеек (Количество, Сумма) зададим такое же название параметра расшифровки. В этом случае расшифровка будет действовать одинаково для всех ячеек в группировке.

В окне редактирования параметра расшифровки мы можем также переопределить значения полей набора, которые будут использоваться для расшифровки. Например, для поля «Номенклатуры» можно указать выражение «Контрагент» и при открытии значения будет открываться карточка контрагента:

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

Произвольная обработка расшифровки 1С СКД

Когда может понадобиться произвольная обработка расшифровки? Например, если результат отчета вам нужно расшифровать этим же отчетом, но с другими настройками, с другим макетом, выполнить расшифровку другим отчетом, выполнить какую-то обработку и т.п.

Для реализации произвольной расшифровки служит событие «ОбработкаРасшифровки» у табличного документа и обработчик «ОбработкаДополнительнойРасшифровки». Первой событие вызывается по ЛКМ, второй при клике ПКМ.

Заголовок обоих обработчиков выглядит одинаково. Здесь и далее будем рассматривать работу расшифровки для управляемых форм:

Нас будут интересовать параметры: «Расшифровка» — в этом параметре указывается идентификатор расшифровки, в параметре «СтандартнаяОбработка» указываем «Истина», если нужно выполнить стандартный алгоритм расшифровки, «Ложь» если мы реализуем произвольную расшифровку.

Теперь немного подробнее про параметр «Расшифровка». Вспомним про реквизит формы «ДанныеРасшифровки» . В этом реквизите (напомню, что мы рассматриваем управляемый режим) хранится адрес временного хранилища, в котором хранится объект типа «ДанныеРасшифровкиКомпоновкиДанных». У этого объекта есть свойство «Элементы», в котором в виде списка (коллекции) хранятся все параметры расшифровки. И наш параметр «Расшифровка» является индексом в этой коллекции. То есть получить собственно сам параметр расшифровки мы можем получить следующим образом:

&НаСервере

Функция ПолучитьНастройкиРасшифровки(ИдентификаторРасшифровки)

    // В тонком клиенте ДанныеРасшифровки это адрес временного хранилища

    ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);

    МассивПолей = СКД.ПолучитьМассивПолейРасшифровки(ИдентификаторРасшифровки, ДанныеРасшифровкиОбъект, Ложь);

    Возврат МассивПолей;

КонецФункции// УстановитьНастройки()

Здесь используется функция общего модуля «ПолучитьМассивПолейРасшифровки», которая кроме текущего значения параметра расшифровки получается значения родительский полей и значения установленных отборов:

#Область Расшифровка

// Возвращает доступное поле по полю компоновки

Функция ПолучитьДоступноеПолеПоПолюКомпоновкиДанных(ПолеКомпоновкиДанных, ОбластьПоиска) Экспорт

    Если ТипЗнч(ПолеКомпоновкиДанных) = Тип("Строка") Тогда

        ПолеПоиска = Новый ПолеКомпоновкиДанных(ПолеКомпоновкиДанных);

    Иначе

        ПолеПоиска = ПолеКомпоновкиДанных;

    КонецЕсли;

    Если ТипЗнч(ОбластьПоиска) = Тип("КомпоновщикНастроекКомпоновкиДанных")

        ИЛИ ТипЗнч(ОбластьПоиска) = Тип("ДанныеРасшифровкиКомпоновкиДанных")

        ИЛИ ТипЗнч(ОбластьПоиска) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

        Возврат ОбластьПоиска.Настройки.ДоступныеПоляВыбора.НайтиПоле(ПолеПоиска);

    Иначе

        Возврат ОбластьПоиска.НайтиПоле(ПолеПоиска);

    КонецЕсли;

КонецФункции

Функция ДобавитьРодителей(ЭлементРасшифровки, ТекущийОтчет, МассивПолейРасшифровки, ВключатьРесурсы = Ложь) Экспорт

    Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда

        Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл

            ДоступноеПоле = ПолучитьДоступноеПолеПоПолюКомпоновкиДанных(Новый ПолеКомпоновкиДанных(Поле.Поле), ТекущийОтчет);

            Если ДоступноеПоле = Неопределено Тогда

                Продолжить;

            КонецЕсли;

            Если Не ВключатьРесурсы И ДоступноеПоле.Ресурс Тогда

                Продолжить;

            КонецЕсли;

            МассивПолейРасшифровки.Добавить(Поле);

        КонецЦикла;

    КонецЕсли;

    Для каждого Родитель Из ЭлементРасшифровки.ПолучитьРодителей() Цикл

        ДобавитьРодителей(Родитель, ТекущийОтчет, МассивПолейРасшифровки, ВключатьРесурсы);

    КонецЦикла;

КонецФункции

// Возвращает массив, по которому следует расшифровать отчет

Функция ПолучитьМассивПолейРасшифровки(Расшифровка, ДанныеРасшифровки, ВключатьРесурсы = Ложь) Экспорт

    МассивПолейРасшифровки = Новый Массив;

    Если ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных")

        И ТипЗнч(Расшифровка) <> Тип("ДанныеРасшифровкиКомпоновкиДанных") Тогда

        Возврат МассивПолейРасшифровки;

    КонецЕсли;

    // Добавим поля родительских группировок

    ДобавитьРодителей(ДанныеРасшифровки.Элементы[Расшифровка], ДанныеРасшифровки, МассивПолейРасшифровки, ВключатьРесурсы);

    Количество = МассивПолейРасшифровки.Количество();

    Для Индекс = 1 По Количество Цикл

        ОбратныйИндекс = Количество - Индекс;

        Для ИндексВнутри = 0 По ОбратныйИндекс - 1 Цикл

            Если МассивПолейРасшифровки[ОбратныйИндекс].Поле = МассивПолейРасшифровки[ИндексВнутри].Поле Тогда

                МассивПолейРасшифровки.Удалить(ОбратныйИндекс);

                Прервать;

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

    // Добавим отбор, установленный в отчете

    Для каждого ЭлементОтбора Из ДанныеРасшифровки.Настройки.Отбор.Элементы Цикл

        Если Не ЭлементОтбора.Использование Тогда

            Продолжить;

        КонецЕсли;

        МассивПолейРасшифровки.Добавить(ЭлементОтбора);

    КонецЦикла;

    Возврат МассивПолейРасшифровки;

КонецФункции

#КонецОбласти

В итоге мы получаем массив элементов с типом «ЭлементОтбораКомпоновкиДанных» или «ЗначениеПоляРасшифровкиКомпоновкиДанных», эти значения мы уже можем передать в другой отчет или в обработку.

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

В этом нам может помочь объекта с типом «ОбработкаРасшифровкиКомпоновкиДанных». В обработчике «ОбработкаРасшифровки» мы можем написать такой код:

&НаКлиенте

Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Отчет.КомпоновщикНастроек.ПолучитьИсточникДоступныхНастроек());

    ДоступныеДействия = Новый Массив;

    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать);

    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить);

    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);

    ДополнительныеПункты = Новый СписокЗначений;

    ДополнительныеПункты.Добавить("Наше действие");

    ОбработкаРасшифровки.ПоказатьВыборДействия(Новый ОписаниеОповещения("ОбработкаВыбораРасшифровки", ЭтаФорма, Расшифровка)

    , Расшифровка

    , ДоступныеДействия

    , ДополнительныеПункты

    ,

    , Элемент);

КонецПроцедуры

Здесь с помощью реквизита «ДанныеРасшифровки» и источника доступных настроек, полученного из компоновщика настроек нашего отчета мы получаем объект указанного типа. Далее мы вызываем метод объекта «ПоказатьВыборДействия», в который передаем нужные нам типовые действия и список наших действие в виде дополнительных пунктов.

В обработке выбранного действия мы производится собственно действия по расшифровке:

&НаКлиенте

Процедура ОбработкаВыбораРасшифровки(ВыполненноеДействие, ПараметрДействия, ИдентификаторРасшифровки) Экспорт

    Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда

        ПоказатьЗначение(,ПараметрДействия);

    ИначеЕсли ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать

        ИЛИ ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить    Тогда

        ПараметрыФормы = Новый Структура;

        ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

        Расшифровка = Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИдентификаторРасшифровки,ПараметрДействия);

        ПараметрыФормы.Вставить("Расшифровка", Расшифровка);

        ОткрытьФорму("Здесь форма вашего (текущего) отчета", ПараметрыФормы, , Новый УникальныйИдентификатор);

    ИначеЕсли ВыполненноеДействие = "Наше действие" Тогда

        // здесь мы можем открыть другой отчет, выполнить какую-то обработку

    КонецЕсли;

КонецПроцедуры // ОбработкаВыбораРасшифровки()

В этом примере видно, что типовые действия такие как расшифровка, упорядочить можно выполнить с помощью объекта типа «ОписаниеОбработкиРасшифровкиКомпоновкиДанных», который мы передаем в новую форму нашего отчета. Можно выполнить расшифровку в текущей форме. Для этого используется метод «ПрименитьНастройки» объекта «ОбработкаРасшифровкиКомпоновкиДанных», который возвращает итоговые настройки. Далее мы загружаем эти настройки в компоновщик и выполняем отчет:

Можно эти настройки получать также с помощью таких методов объекта «ОбработкаРасшифровкиКомпоновкиДанных» как: Упорядочить, Расшифровать, Сгруппировать, Отфильтровать.

Материалы для изучения

Работа с расшифровкой в управляемом приложении

Расшифровка одного отчета другим

Продвинутый курс по СКД

Расшифровка отчета с применением БСП

СКД и расшифровка на мобильной платформе

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar