1с как сделать расшифровку в отчете
Как сделать программную расшифровку диаграммы сформированное с помощью СКД 1С 8.3? У меня при стандартной расшифровке число выдает.(
Там справа от названия темы есть буква «Я». Пробовали нажимать?
Да нагуглил уже не понятно
по букве Я работает яндекс, импортозамещение, панимаешь
Да знаю. Но я много чего уже посмотрел в инете.( Попробую еще посидеть(((
(4) Тема неоднократно обсуждалась.
У стандартного отчета на СКД есть реквизит ДанныеРасшифровки — вот это цифра это значение одного из полей ДанныеРасшифровки. либо сам получи нужную строку, либо есть процедуры типа этой — ТиповыеОтчеты.ОбработкаРасшифровкиТиповогоОтчета, где используются процедуры по типу таких ТиповыеОтчеты.ПолучитьМассивПолейРасшифровки, которые и работают с реквизитом ДанныеРасшифровки. вот туда копай.
В процедуре РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) через точку останова проверяю ДанныеРасшифровки пустое
Реквизит ДанныеРасшифровки пустое нет никаких данных
Значит надо копать программный вывод отчета, где-то данные расшифровки потерялись.
(7) У тебя стандартный СКД отчет?
Посмотри в модуле объекта процедуру сформироватьОтчет там данныеРасшифровки передаються обязательно в СКД, может как то по другому переменную назвали. а может вообще ничего не передают, проверь там.
Нет. У меня в отчете 4 диаграммы первую я сформирую через СКД. Остальные 3 программно. Я убрал командную панель. И добавил свою команду сформировать. При нажатие выполняется и скд и программно созданные диаграммы. Да я назвал ДанныеРасшифровки Как ДанныеРасшифровкиК. Если не переименовать оно не дало возможности сформировать отчет.
Ошибку выдало Не сответствие типов параметр 3
: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
по причине:
Несоответствие типов (параметр номер ‘3’)Отчет.КоличествоСооружении.Форма.ФормаОтчета.Форма(26)>
(11) Так сразу бы и сказал.
Все ссылки завязаны на том, что отчет, который формируется — один. И в нём присутствует нужная тебе расшифровка.
А в твоём случае нужно хранить все четыре отчета на форме, чтобы в расшифровке определить, по какому отчету пользователь хочет её увидеть.
Плюс, твой отчет не до конца понимает, какая схема главная для табДока Результат.
ДанныеРасшифровкиОтчета = Новый ДанныеРасшифровкиКомпоновкиДанных;
НастройкиСКД.ПараметрыДанных.Элементы.Найти(«Номенклатура»).Значение = Справочники.Номенклатура.НайтиПоКоду(«1»); // заполняем какие-то параметры
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиСКД, ДанныеРасшифровкиОтчета);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровкиОтчета);
ДокументРезультат = ЭлементыФормы.Результат;
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ДокументРезультат.Показать();
Тебе нужно будет подменить
НастройкиСКД = КомпоновщикНастроек.Настройки;
СхемаКомпоновкиДанных = ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
на нужный отчет.
УТ 11 СКД: Меню Расшифровать другим отчетом в 1С

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

Меню Расшифровать другим отчетом в 1С
ИначеЕсли ПолноеИмяОтчета = "Отчет.ОстаткиИДоступностьТоваровНовый" Тогда // Расшифровать отчетом -> Поступление и отгрузка товаров ПараметрыОтчета = Новый Структура; ПараметрыОтчета.Вставить("Имя", "ПоступлениеИОтгрузкаТоваров"); ПараметрыОтчета.Вставить("Заголовок", НСтр("ru = 'Поступление и отгрузка товаров'")); ПараметрыОтчета.Вставить("ИмяОтчета", "Отчет.ПоступлениеИОтгрузкаТоваров"); ПоляРасшифровки = Новый Массив; ПоляРасшифровки.Добавить("Номенклатура"); ПоляРасшифровки.Добавить("Характеристика"); ПоляРасшифровки.Добавить("Склад"); ПоляРасшифровки.Добавить("ДатаДоступности"); ПараметрыОтчета.Вставить("ПоляРасшифровки", ПоляРасшифровки); СписокПараметров = Новый Массив; СписокПараметров.Добавить("ЕдиницыКоличества"); ПараметрыОтчета.Вставить("СписокПараметров", СписокПараметров); МенюОтчетов.Добавить(ПараметрыОтчета); КонецЕсли;
Расшифровка в 1С СКД
При разработке отчетов в 1С достаточно часто требуется такая функция как Расшифровка 1С СКД. Обычно под СКД расшифровкой понимается формирование такого же отчета с установленными отборами с дополнительной (более подробной) группировкой.
В том числе такая возможность имеется и в отчетах, созданных с помощью 1С СКД. При этом функционал расшифровки является встроенным и позволяет выполнять пользователю различные действия, без приложения дополнительных усилий со стороны программиста. То есть при создании отчета на СКД программисту достаточно настроить только схему компоновки – без дополнительного кода в модуле отчета и без добавления форм отчета.
- 1 Стандартные возможности расшифровки 1С СКД
- 1.1 Данные расшифровки 1С СКД
Стандартные возможности расшифровки 1С СКД
В пользовательском режиме расшифровку отчета можно вызвать двумя способами:
- Левой клавишей мыши (ЛКМ) или с клавиатуры клавишей Enter на области отчета. При этом для значений ссылочного типа выполняется действие по умолчанию – открытие значения, для полей ресурсов – расшифровка по выбранному полю, для значений группировкой не ссылочного типа – открывается меню выбора действия расшифровки
- Правой клавишей мыли (ПКМ) . При этом открывается меню выбора действия расшифровки
Какие действия доступны при выполнении расшифровки:
- Расшифровать – новый отчет с установленными отборами по измерениям и группировкой по выбранному полю
- Открыть – открыть форму значения ссылочного типа
- Отфильтровать – новый отчет с дополнительно установленным отбором
- Упорядочить – новый отчет с дополнительно установленной сортировкой
- Сгруппировать – новый отчет с дополнительной группировкой
- Оформить – новый отчет с дополнительно настроенным условным оформлением
Что еще можно сделать с расшифровкой без программирования? В расшифровку попадают значения полей из наборов данных. Иногда возникает необходимость в отчет вывести одно значение, но в качестве расшифровки должно выступать другое поле. Например, регистратор можно выводить как номер, но необходимо, чтобы при клике по нему открывался документ. Это можно сделать без дополнительного программирования – через установку выражения представления

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

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

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

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

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

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

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

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

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


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

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

Нас будут интересовать параметры: «Расшифровка» — в этом параметре указывается идентификатор расшифровки, в параметре «СтандартнаяОбработка» указываем «Истина», если нужно выполнить стандартный алгоритм расшифровки, «Ложь» если мы реализуем произвольную расшифровку.
Теперь немного подробнее про параметр «Расшифровка». Вспомним про реквизит формы «ДанныеРасшифровки» . В этом реквизите (напомню, что мы рассматриваем управляемый режим) хранится адрес временного хранилища, в котором хранится объект типа «ДанныеРасшифровкиКомпоновкиДанных». У этого объекта есть свойство «Элементы», в котором в виде списка (коллекции) хранятся все параметры расшифровки. И наш параметр «Расшифровка» является индексом в этой коллекции. То есть получить собственно сам параметр расшифровки мы можем получить следующим образом:
&НаСервере Функция ПолучитьНастройкиРасшифровки(ИдентификаторРасшифровки) // В тонком клиенте ДанныеРасшифровки это адрес временного хранилища ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); МассивПолей = СКД.ПолучитьМассивПолейРасшифровки(ИдентификаторРасшифровки, ДанныеРасшифровкиОбъект, Ложь); Возврат МассивПолей; КонецФункции// УстановитьНастройки()
Здесь используется функция общего модуля «ПолучитьМассивПолейРасшифровки», которая кроме текущего значения параметра расшифровки получается значения родительский полей и значения установленных отборов:
#Область Расшифровка // Возвращает доступное поле по полю компоновки Функция ПолучитьДоступноеПолеПоПолюКомпоновкиДанных(ПолеКомпоновкиДанных, ОбластьПоиска) Экспорт Если ТипЗнч(ПолеКомпоновкиДанных) = Тип("Строка") Тогда ПолеПоиска = Новый ПолеКомпоновкиДанных(ПолеКомпоновкиДанных); Иначе ПолеПоиска = ПолеКомпоновкиДанных; КонецЕсли; Если ТипЗнч(ОбластьПоиска) = Тип("КомпоновщикНастроекКомпоновкиДанных") ИЛИ ТипЗнч(ОбластьПоиска) = Тип("ДанныеРасшифровкиКомпоновкиДанных") ИЛИ ТипЗнч(ОбластьПоиска) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда Возврат ОбластьПоиска.Настройки.ДоступныеПоляВыбора.НайтиПоле(ПолеПоиска); Иначе Возврат ОбластьПоиска.НайтиПоле(ПолеПоиска); КонецЕсли; КонецФункции Функция ДобавитьРодителей(ЭлементРасшифровки, ТекущийОтчет, МассивПолейРасшифровки, ВключатьРесурсы = Ложь) Экспорт Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл ДоступноеПоле = ПолучитьДоступноеПолеПоПолюКомпоновкиДанных(Новый ПолеКомпоновкиДанных(Поле.Поле), ТекущийОтчет); Если ДоступноеПоле = Неопределено Тогда Продолжить; КонецЕсли; Если Не ВключатьРесурсы И ДоступноеПоле.Ресурс Тогда Продолжить; КонецЕсли; МассивПолейРасшифровки.Добавить(Поле); КонецЦикла; КонецЕсли; Для каждого Родитель Из ЭлементРасшифровки.ПолучитьРодителей() Цикл ДобавитьРодителей(Родитель, ТекущийОтчет, МассивПолейРасшифровки, ВключатьРесурсы); КонецЦикла; КонецФункции // Возвращает массив, по которому следует расшифровать отчет Функция ПолучитьМассивПолейРасшифровки(Расшифровка, ДанныеРасшифровки, ВключатьРесурсы = Ложь) Экспорт МассивПолейРасшифровки = Новый Массив; Если ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") И ТипЗнч(Расшифровка) <> Тип("ДанныеРасшифровкиКомпоновкиДанных") Тогда Возврат МассивПолейРасшифровки; КонецЕсли; // Добавим поля родительских группировок ДобавитьРодителей(ДанныеРасшифровки.Элементы[Расшифровка], ДанныеРасшифровки, МассивПолейРасшифровки, ВключатьРесурсы); Количество = МассивПолейРасшифровки.Количество(); Для Индекс = 1 По Количество Цикл ОбратныйИндекс = Количество - Индекс; Для ИндексВнутри = 0 По ОбратныйИндекс - 1 Цикл Если МассивПолейРасшифровки[ОбратныйИндекс].Поле = МассивПолейРасшифровки[ИндексВнутри].Поле Тогда МассивПолейРасшифровки.Удалить(ОбратныйИндекс); Прервать; КонецЕсли; КонецЦикла; КонецЦикла; // Добавим отбор, установленный в отчете Для каждого ЭлементОтбора Из ДанныеРасшифровки.Настройки.Отбор.Элементы Цикл Если Не ЭлементОтбора.Использование Тогда Продолжить; КонецЕсли; МассивПолейРасшифровки.Добавить(ЭлементОтбора); КонецЦикла; Возврат МассивПолейРасшифровки; КонецФункции #КонецОбластиВ итоге мы получаем массив элементов с типом «ЭлементОтбораКомпоновкиДанных» или «ЗначениеПоляРасшифровкиКомпоновкиДанных», эти значения мы уже можем передать в другой отчет или в обработку.
Когда мы реализуем собственную расшифровку, часто возникает потребность оставить типовые действия расшифровки , к которым нужно лишь добавить свои действия.
В этом нам может помочь объекта с типом «ОбработкаРасшифровкиКомпоновкиДанных». В обработчике «ОбработкаРасшифровки» мы можем написать такой код:
&НаКлиенте Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Отчет.КомпоновщикНастроек.ПолучитьИсточникДоступныхНастроек()); ДоступныеДействия = Новый Массив; ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать); ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить); ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение); ДополнительныеПункты = Новый СписокЗначений; ДополнительныеПункты.Добавить("Наше действие"); ОбработкаРасшифровки.ПоказатьВыборДействия(Новый ОписаниеОповещения("ОбработкаВыбораРасшифровки", ЭтаФорма, Расшифровка) , Расшифровка , ДоступныеДействия , ДополнительныеПункты , , Элемент); КонецПроцедурыЗдесь с помощью реквизита «ДанныеРасшифровки» и источника доступных настроек, полученного из компоновщика настроек нашего отчета мы получаем объект указанного типа. Далее мы вызываем метод объекта «ПоказатьВыборДействия», в который передаем нужные нам типовые действия и список наших действие в виде дополнительных пунктов.
В обработке выбранного действия мы производится собственно действия по расшифровке:
&НаКлиенте Процедура ОбработкаВыбораРасшифровки(ВыполненноеДействие, ПараметрДействия, ИдентификаторРасшифровки) Экспорт Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ПоказатьЗначение(,ПараметрДействия); ИначеЕсли ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать ИЛИ ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить Тогда ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина); Расшифровка = Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИдентификаторРасшифровки,ПараметрДействия); ПараметрыФормы.Вставить("Расшифровка", Расшифровка); ОткрытьФорму("Здесь форма вашего (текущего) отчета", ПараметрыФормы, , Новый УникальныйИдентификатор); ИначеЕсли ВыполненноеДействие = "Наше действие" Тогда // здесь мы можем открыть другой отчет, выполнить какую-то обработку КонецЕсли; КонецПроцедуры // ОбработкаВыбораРасшифровки()В этом примере видно, что типовые действия такие как расшифровка, упорядочить можно выполнить с помощью объекта типа «ОписаниеОбработкиРасшифровкиКомпоновкиДанных», который мы передаем в новую форму нашего отчета. Можно выполнить расшифровку в текущей форме. Для этого используется метод «ПрименитьНастройки» объекта «ОбработкаРасшифровкиКомпоновкиДанных», который возвращает итоговые настройки. Далее мы загружаем эти настройки в компоновщик и выполняем отчет:

Можно эти настройки получать также с помощью таких методов объекта «ОбработкаРасшифровкиКомпоновкиДанных» как: Упорядочить, Расшифровать, Сгруппировать, Отфильтровать.
Настройка расшифровки в макете
Если для оформления ячейки в СКД используется макет, то можно задать значение расшифровки прямо в свойствах ячейки. Свойство называется «Параметр расшифровки». Здесь укажем идентификатор параметра (это может быть имя нужного поля или любое другое имя). Слева внизу в списке параметров макета появится введенный нами идентификатор. В ячейке «Выражение» надо заполнить:
- «Основное действие» = «Открыть значение»,
- Имя поля форму которого надо открыть, например «Регистратор»,
- выражение — совпадает с именем поля.
В результате при двойном нажатии на эту ячейку, программа откроет форму значения поля, которое соответствует выражению идентификатора параметра.
Настройка расшифровки в форме отчета
Если надо выполнять более сложное действие при двойном клике на ячейке, то надо создать форму СКД отчета. При создании формы отчета надо обязательно указать «Использовать систему компоновки данных», тогда не придется придумывать способы отображения настроек отчета на форме.
В результате на созданной форме будет реквизит «Результат» типа табличное поле.
У табличного поля есть 2 события:
- ОбработкаРасшифровки для переопределения действия, происходящее при двойном щелчке мыши на поле отчета
- ОбработкаДополнительнойРасшифровки для переопределения действия, вызываемого при нажатии правой кнопки мыши.
ОбработкаРасшифровки
Расшифровка включает в себя набор действий, которые можно настроить по собственному желанию.
Ниже код процедуры, которая оставляет доступным только действие «Открыть» и выполняет различные действия в зависимости от типа выбранного элемента:
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));ДоступныеДействия = Новый Массив();
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыбранноеДействие, ПараметрыВыбранногоДействия,ДоступныеДействия,,Истина );
Если ВыбранноеДействие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Тогда
Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение ТогдаЕсли ТИпЗнч(ПараметрыВыбранногоДействия) = Тип(«СправочникСсылка.Оборудование») ТОгда
ПараметрыФормы = Новый Структура(«Ключ,ДоступностьИзменения»,ПараметрыВыбранногоДействия,Истина);
ОткрытьФорму(«Справочник.Оборудование.Форма.ФормаОборудования»,ПараметрыФОрмы);
Иначе
ОткрытьЗначение(ПараметрыВыбранногоДействия);
КонецЕсли;КонецЕсли;
КонецЕсли;
КонецПроцедурыОбъявляем переменные, в которые будут записаны выбранное действие и значение выбранного элемента:
Перем ВыбранноеДействие;
Перем ПараметрыВыбранногоДействия;Отменяем стандартную расшифровку и создаем объект ОбработкаРасшифровки в который передаются данные расшифровки нашего отчета:
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));Определяем список действий в расшифровке:
ДоступныеДействия = Новый Массив();
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);Вызываем метод ВыбратьДействие для определения выбора действия пользователем. В параметрах указываем массив доступных действий и ИспользоватьОсновноеДействие = Истина (в этом случае если пользователь просто щелкнет два раза по ячейке, то будет считаться, что выбрано действие ОткрытьЗначение)
ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыбранноеДействие, ПараметрыВыбранногоДействия,ДоступныеДействия,,Истина );
После выбора пользователем действия расшифровки значение выбранного действия возвращается во втором параметре ВыбранноеДействие. Если выбрано действие Открыть, то третий параметр ПараметрыВыбранногоДействия содержит значение, которое нужно открыть. Если выбрано действие Расшифровать, Отфильтровать, Упорядочить, Сгруппировать, Оформить, то параметр ПараметрыВыбранногоДействия содержит настройки, применяемые к отчету. Если выбрано дополнительное действие, то параметр не заполняется.
Далее, если выбранное действие Открыть, то выполняем открытие значения в зависимости от типа значения (для оборудования открывается форма с параметром ДоступностьИзменения = Истина. Можно назначить любую другую форму.)
Если ВыбранноеДействие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Тогда
Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение ТогдаЕсли ТИпЗнч(ПараметрыВыбранногоДействия) = Тип(«СправочникСсылка.Оборудование») ТОгда
ПараметрыФормы = Новый Структура(«Ключ,ДоступностьИзменения»,ПараметрыВыбранногоДействия,Истина);
ОткрытьФорму(«Справочник.Оборудование.Форма.ФормаОборудования»,ПараметрыФОрмы);
Иначе
ОткрытьЗначение(ПараметрыВыбранногоДействия);
КонецЕсли;Вместо ВыбратьДействие можно использовать аналог
Оповещение = Новый ОписаниеОповещения(«РезультатОбработкаРасшифровки_Продолжение», ЭтаФорма, Расшифровка); ОбработкаРасшифровки.ПоказатьВыборДействия(Оповещение, Расшифровка, ДоступныеДействия, , Истина);
В этом случае должна быть объявлена экспортная процедура РезультатОбработкаРасшифровки_Продолжение()
Процедура РезультатОбработкаРасшифровки_Продолжение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт
Если ПараметрВыполненногоДействия <> Неопределено Тогда
Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
Действие Расшифровать
Если надо обработать действие Расшифровать, то расшифровку можно обработать 2 разными способами:
- Открыть новую форму этого же отчета указав в его параметрах параметры расшифровки
- Переформировать отчет в текущей форме.
1. Пример открытия новой формы:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить(«СформироватьПриОткрытии», Истина);
ПараметрыФормы.Вставить(«Расшифровка», Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия));
ОткрытьФорму(«Отчет.СборкаСистемныхБлоков.Форма», ПараметрыФормы, , Истина);Параметр СформироватьПриОткрытии, установленный в значение Истина, обеспечивает формирование отчета сразу при открытии формы.
В параметре Расшифровка описывается расшифровка, которую нужно применить к открываемому отчету. Затем данные расшифровки, идентификатор расшифровки и новые настройки (ПараметрыВыбранногоДействия), применяемые к отчету, передаются в конструктор объекта ОписаниеОбработкиРасшифровкиКомпоновкиДанных.
2. Пример переформирования отчета:
&НаКлиенте
Процедура РезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
.ОтработатьРасшифровку(Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия));
&НаСервере
Процедура ОтработатьРасшифровку(ОписаниеОбработкиРасшифровки)
ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиОбъект, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
РезультирующиеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(ОписаниеОбработкиРасшифровки.Идентификатор, ОписаниеОбработкиРасшифровки.ПрименяемыеНастройки);Если ТипЗнч(РезультирующиеНастройки) = Тип(«НастройкиКомпоновкиДанных») Тогда
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(РезультирующиеНастройки);
ИначеЕсли ТипЗнч(РезультирующиеНастройки) = Тип(«ПользовательскиеНастройкиКомпоновкиДанных») Тогда
Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(РезультирующиеНастройки);
КонецЕсли;В процедуре создается обработчик расшифровки – объект ОбработкаРасшифровкиКомпоновкиДанных и инициализируется данными расшифровки отчета и источником доступных настроек для отчета.
Отчет в параметре Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет) — это основной реквизит формы отчета.
Для применения настроек расшифровки используется метод этого объекта ПрименитьНастройки(). Метод ПрименитьНастройки() может вернуть как полные настройки компоновки данных, так и пользовательские настройки компоновки данных. Пользовательские настройки расшифровки могут быть получены, если применяемые настройки можно полностью применить в пользовательских настройках. Метод ПрименитьНастройки() имеет ограничения, поэтому следует использовать его с осторожностью.
Затем полученные настройки расшифровки применяются к отчету методом компоновщика настроек ЗагрузитьНастройки(), и отчет формируется методом формы отчета СкомпоноватьРезультат().
Пример решения задачи, когда по строке отчета надо сформировать печатную форму с данными строки.
Первым делом надо добавит дополнительное действие. Потом, при выборе действия, надо получить данные текущей строки и сформировать табличный документ.
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)Перем ВыбранноеДействие;
Перем ПараметрыВыбранногоДействия;СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));ДоступныеДействия = Новый Массив();
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);ДополнительныеДействия=Новый СписокЗначений;
ДополнительныеДействия.Добавить(«СформироватьАнкету»,»Сформировать печатную форму анкеты»);ОписаниеРасшифровка = Новый ОписаниеОповещения(«ОбработкаВыбораРасшифровки», ЭтаФорма, Расшифровка);
ОбработкаРасшифровки.ПоказатьВыборДействия(ОписаниеРасшифровка,Расшифровка, ДоступныеДействия, ДополнительныеДействия,, Элемент);&НаКлиенте
Процедура ОбработкаВыбораРасшифровки(ВыполненноеДействие, ПараметрДействия, ИдентификаторРасшифровки) ЭкспортЕсли ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
ИначеЕсли ВыполненноеДействие = «СформироватьАнкету» Тогда
СтруктураРасшифровки = Новый Структура();
ПолучитьДанныеРасшифровкиСоСтруктурой(ИдентификаторРасшифровки,СтруктураРасшифровки);
СформироватьАнкету(СтруктураРасшифровки);
КонецЕсли;//Получаем данные текущей строки без учета группировок
&НаСервере
Функция ПолучитьДанныеРасшифровкиСоСтруктурой(Расшифровка,СтруктураВозврата);
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);МассивРодителей = Данные.Элементы[Расшифровка].ПолучитьРодителей();
ИдентификаторБлижайшейГруппы = 0;
Для каждого нРодитель из МассивРодителей Цикл
ИдентификаторЧисло = Число(нРодитель.Идентификатор);
Если ИдентификаторБлижайшейГруппы < ИдентификаторЧисло Тогда
ИдентификаторБлижайшейГруппы = ИдентификаторЧисло;
КонецЕсли;
КонецЦикла;// смотрим предыдущие поля строки
ИдентификаторЧисло = Число(Расшифровка);
ТекущееПоле = Данные.Элементы[Расшифровка].ПолучитьПоля()[0];
Пока ТекущееПоле.Поле <> ПервоеПолеСтроки И ИдентификаторЧисло > ИдентификаторБлижайшейГруппы Цикл
СтруктураВозврата.Вставить(ИсправитьИмя(ТекущееПоле.Поле),ТекущееПоле.Значение);
ИдентификаторЧисло = ИдентификаторЧисло -1;
ТекущееПоле = Данные.Элементы[ИдентификаторЧисло].ПолучитьПоля()[0];
КонецЦикла;// смотрим предыдущие поля строки
ИдентификаторЧисло = Число(Расшифровка);
ВсегоЭлементов = Данные.Элементы.Количество();
ТекущееПоле = Данные.Элементы[Расшифровка].ПолучитьПоля()[0];
Пока ТекущееПоле.Поле <> ПервоеПолеСтроки И ИдентификаторЧисло СтруктураВозврата.Вставить(ИсправитьИмя(ТекущееПоле.Поле),ТекущееПоле.Значение);
ИдентификаторЧисло = ИдентификаторЧисло +1;
ТекущееПоле = Данные.Элементы[ИдентификаторЧисло].ПолучитьПоля()[0];
КонецЦикла;// Формируем табличный документ
Макет = ОтчетОбъект.ПолучитьМакет(«МакетАнкеты»);
ОбластьШапка = Макет.ПолучитьОбласть(«Шапка»);
ОбластьШапка.параметры.Заполнить(СтруктураРасшифровки);
ОбластьШапка.параметры.ДатаАнкеты = ТекущаяДата();
ТабДокумент.Вывести(ОбластьШапка);Возврат ТабДокумент;
КонецФункции// убираем точку из имени поля для добавления в структуру. Точка встречается в имени служебных полей
РезультатОбработкаДополнительнойРасшифровки
Так как при нажатии правой кнопки мыши выходит контекстное меню, то его можно отредактировать: изменить список доступных действий и добавить дополнительные действия.
&НаКлиенте
Процедура РезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)Перем ВыбранноеДействие;
Перем ПараметрыВыбранногоДействия;СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));ДоступныеДействия = Новый Массив();
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать);
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать);ДополнительныеДействия = Новый СписокЗначений;
ДополнительныеДействия.Добавить(«Действие 1»);
ДополнительныеДействия.Добавить(«Действие 2»);
ДополнительныеДействия.Добавить(«Действие 3»);// Осуществим выбор действия расшифровки пользователем
ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыбранноеДействие, ПараметрыВыбранногоДействия, ДоступныеДействия, ДополнительныеДействия);Если ПараметрыВыбранногоДействия <> Неопределено Тогда
Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
ОткрытьЗначение(ПараметрыВыбранногоДействия);
Иначе
Если ФормаРасшифровки Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить(«СформироватьПриОткрытии», Истина);
ПараметрыФормы.Вставить(«Расшифровка», Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия));
ОткрытьФорму(«Отчет.СборкаСистемныхБлоков.Форма», ПараметрыФормы, , Истина);
Иначе
ОтработатьРасшифровку(Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия));
КонецЕсли;
КонецЕсли;
Иначе
Сообщить(ВыбранноеДействие);
КонецЕсли;&НаСервере
Процедура ОтработатьРасшифровку(ОписаниеОбработкиРасшифровки)Сообщить(«Я в ОтработатьРасшифровку»);
ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиОбъект, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
РезультирующиеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(ОписаниеОбработкиРасшифровки.Идентификатор, ОписаниеОбработкиРасшифровки.ПрименяемыеНастройки);Если ТипЗнч(РезультирующиеНастройки) = Тип(«НастройкиКомпоновкиДанных») Тогда
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(РезультирующиеНастройки);
ИначеЕсли ТипЗнч(РезультирующиеНастройки) = Тип(«ПользовательскиеНастройкиКомпоновкиДанных») Тогда
Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(РезультирующиеНастройки);
КонецЕсли;Начало аналогично первому примеру. Далее определяем список основных действий (Открыть значение, Расшифровать и Отфильтровать) и дополнительных действий (Дейстиве1, Дейстиве2, Дейстиве3). Передаем эти списки в метод ОбработкаРасшифровки.ВыбратьДействие().
В результате при нажатии на правую кнопку мыши пользователь увидит меню:
После выбора пользователем действия расшифровки мы получаем значение выбранного действия во втором параметре ВыбранноеДействие. Если выбрано действие Открыть, то третий параметр ПараметрыВыбранногоДействия содержит значение, которое нужно открыть. Если выбрано действие Расшифровать, Отфильтровать, Упорядочить, Сгруппировать, Оформить, то параметр ПараметрыВыбранногоДействия содержит настройки, применяемые к отчету. Если выбрано дополнительное действие, то параметр не заполняется.
В зависимости от выбранного действия (ВыбранноеДействие) мы либо открываем выбранное значение, либо формируем новую форму отчета с параметрами СформироватьПриОткрытии и Расшифровка.
В параметре Расшифровка мы описываем расшифровку, которую нужно применить к открываемому отчету, и передаем в конструктор объекта ОписаниеОбработкиРасшифровкиКомпоновкиДанных данные расшифровки (реквизит формы ДанныеРасшифровки), идентификатор расшифровки (параметр Расшифровка обработчика события ОбработкаРасшифровки) и новые настройки, применяемые к отчету (ПараметрыВыбранногоДействия).
Настройка расшифровки при программном формировании отчета
Для того чтобы при выводе отчета объект ДанныеРасшифровки был заполнен, следует его создать при компоновке макета и передать в процессор компоновки данных. Для этого при вызове метода Выполнить компоновщика макета следует передать переменную, в которую требуется поместить созданный объект.
Для того чтобы данные расшифровки заполнились при формировании результата, необходимо передать объект ДанныеРасшифровки в метод Инициализировать процессора компоновки данных.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);Получение данных отбора расшифровки
Иногда надо в качестве расшифровки ячейки запустить другой отчет. Хорошо, если расшифровку запустили на поле с ссылочным значением, тогда можно получить значение текущего поля и сформировать отчет. Другое дело, если запускают расшифровку по полю с ресурсом. Здесь возникает проблема получить данные группировок, по которым сформировались итоги ресурса
Выше описанный пример работает в этом случае не корректно. Он определит текущую группировку, но, если есть родительская группировка, то могут быть пролемы.
В процессе поиска решения я отталкивался от того, то если запускать стандартную расшифровку, то запускается отчет в параметрах отбора которого указываются группировки по выбранному ресурсу. Т.е. чтобы получить параметры для нового отчета, надо сформировать настройки компоновки данных стандартными методами и считать параметры и отбор.
&НаСервере
Функция ПолучитьОтборРасшифровки(Расшифровка)СтруктураОтбора = Новый Структура();
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
ТекущееПоле = Данные.Элементы[Расшифровка].ПолучитьПоля()[0].Поле; // чтобы понимать какой ресурс хотим расшифровать
СтруктураОтбора.Вставить(«ТекущаяКолонка»,ТекущееПоле);ПолеРасшифровки = Новый ПолеКомпоновкиДанных(ТекущееПоле); // требуется для запуска метода Расшифровать
НастройкиРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка,ПолеРасшифровки);//Заполняем элементы отбора. В элементы отбора попадают в том числе отбор основного отчета
Для Каждого СтрокаОтбора Из НастройкиРасшифровки.Отбор.Элементы Цикл
СтруктураОтбора.Вставить(СтрокаОтбора.ЛевоеЗначение, СтрокаОтбора.ПравоеЗначение);
КонецЦикла;//Заполняем параметры основного отчета, которые тоже могут потребоваться для отчета расшифровки
Для Каждого СтрокаПараметра из НастройкиРасшифровки.ПараметрыДанных.Элементы Цикл
СтруктураОтбора.Вставить(СтрокаПараметра.Параметр, СтрокаПараметра.Значение);
КонецЦикла;Функция запускается из процедуры РезультатОбработкаРасшифровки() в модуле формы отчета
Дополнительно по обработке расшифровки можно посмотреть здесь: