HelpF.pro

Реализация расшифровки в Системе Компоновки Данных.

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

В СКД расшифровка представляет собой всплывающее меню (по двойному клику на ячейке), содержащие доступные пользователю действия, такие как открытие ссылки на элемент, упорядочивание, группировка, оформление и пр. Здесь я приведу примеры решения наиболее распространенных задач, связанных с расшифровкой, таких как:
1. Ограничение доступных действий;
2. Добавление в меню своего произвольного действия;
3. Добавление в меню различных действий, в зависимости от ячейки, для которой выполняется расшифровка.

Вся работа с расшифровкой, выполняется в событии ОбработкаРасшифровки. Что бы получить доступ к этому событию, необходимо сначала сгенерировать основную форму отчета. Затем ПолеТабличногоДокумента > Свойства > События.

Итак, задача №1. Постановка: Необходимо доступные действия для пользователя ограничить только: открытием элемента, упорядочиванием и оформлением.
Решение:
Код 1C v 8.х
 Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДоступныеДействия=Новый Массив; // заполняем доступные действия, если параметр не указан, то будут доступны все действия
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Оформить);
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить);
Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,ДоступныеДействия);
Если Настройки<>Неопределено Тогда // требуется сформировать отчет с новыми настройками
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); // загружаем настройки
ЭлементыФормы.Результат.Очистить(); // очищаем поле табличного документа
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки); // выводим результат
КонецЕсли;
КонецПроцедуры


Задача №2. Постановка: Необходимо добавить в меню свое действие, открывающее основную форму элемента, содержащегося в ячейке, для которой выполняется расшифровка.
Решение:
Код 1C v 8.х
 Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДополнительныеДействия=Новый СписокЗначений;
ДополнительныеДействия.Добавить("Действие1","Дополнительное действие 1"); // добавляем свое действие
Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,,ДополнительныеДействия);
Если Настройки<>Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЭлементыФормы.Результат.Очистить();
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);
Иначе
Если ВыполненноеДействие="Действие1" Тогда
ВыполнитьДействие1(Расшифровка); // процедура выполняемая при выборе пункта меню "Дополнительное действие 1"
КонецЕсли;
КонецЕсли;
КонецПроцедуры

В процедуре ВыполнитьДействие1(Расшифровка) получаем ПараметрРасшифровки для выбранной ячейки и открывает основную форму:
Код 1C v 8.х
 Процедура ВыполнитьДействие1(Расшифровка)
Ссылка=ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
Ссылка.ПолучитьФорму().Открыть();
КонецПроцедуры


Задача №3. Постановка: Необходимо в зависимости от колонки, для которой выполняется расшифровка, добавлять свои действия: для «Поле1» - «Действие1», для «Поле2» - «Действие2».
Решение:
Код 1C v 8.х
 Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДополнительныеДействия=Новый СписокЗначений;
// Проверяем для какого поля выполняется расшифровка
Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле="Поле1" Тогда
ДополнительныеДействия.Добавить("Действие1","Дополнительное действие 1");
ИначеЕсли ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле="Поле2" Тогда
ДополнительныеДействия.Добавить("Действие2","Дополнительное действие 2");
КонецЕсли;
Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,,ДополнительныеДействия);
Если Настройки<>Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЭлементыФормы.Результат.Очистить();
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);
Иначе
Если ВыполненноеДействие="Действие1" Тогда
ВыполнитьДействие1(Расшифровка);
ИначеЕсли ВыполненноеДействие="Действие2" Тогда
ВыполнитьДействие2(Расшифровка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Как видите, ничего сложного здесь нет! )
Источник

При использовании в типовой конфигурации:
Код 1C v 8.х
 // Чтобы добавить свою расшифровку в СКД нужно в Форме отчета. 
// ЭлементФормы ПолеТаблчногоДокумента в событие ОбработкаРасшифровки поставить:

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

Если ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля()[0].Поле = "ДокументОприходования" Тогда
Док = ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля().Найти("ДокументОприходования").Значение;
Если ТипЗнч(Док) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
СтандартнаяОбработка = Ложь;
Предупреждение(Док.Комментарий);
Возврат;
КонецЕсли;
КонецЕсли;

ТиповыеОтчеты.СтандартнаяОбработкаРасшифровкиТиповогоОтчета(ОтчетОбъект, ЭтаФорма, Расшифровка, СтандартнаяОбработка);

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

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1055.html