1. Главная страница » Компьютеры » 1С компоновка данных расшифровка

1С компоновка данных расшифровка

Автор: | 16.12.2019

Для реализации расшифровки отчетов, выполненных при помощи системы компоновки данных, в платформе реализован объект ОбработкаРасшифровкиКомпоновкиДанных, который позволяет сформировать настройки компоновки данных, которые можно использовать для формирования отчета — расшифровки.

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

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

Содержимое расшифровки

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

ВАЖНО!
Для того, чтобы при выводе отчета объект ДанныеРасшифровки был заполнен, следует его создать при компоновке макета и передать в процессор компоновки данных.

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

МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);

Для того, чтобы данные расшифровки заполнились при формировании результата, необходимо передать объект ДанныеРасшифровки в метод Инициализировать процессора компоновки данных.

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

Если отчет формируется при помощи стандартной команды отчета Сформировать, то данные расшифровки помещаются в свойство расширения формы отчета ДанныеРасшифровки.

Объект ДанныеРасшифровки содержит настройки, для которых этот объект был сформирован (заполняются при генерации макета компоновки данных) и коллекции элементов расшифровки (заполняются при формировании результата).

Каждый элемент расшифровки имеет идентификатор (который и помещается в ячейку табличного документа — результата) и массив идентификаторов родительских элементов расшифровки. Имея идентификатор расшифровки из объекта ДанныеРасшифровки можно получить элемент расшифровки при помощи метода Получить или при помощи операции [].

Существуют два типа элементов расшифровки: ЭлементРасшифровкиКомпоновкиДанныхПоля и ЭлементРасшифровкиКомпоновкиДанныхГруппировка.

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

ЭлементРасшифровкиКомпоновкиДанныхГруппировка содержит имя группировки, для которой был создан элемент (соответствует идентификатору группировки в настройках из данных расшифровки).

При компоновке результата процессор компоновки данных заполняет данные расшифровки следующим образом:

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

Читайте также:  Http prometheus freize net

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

3. При выводе ячеек процессор компоновки получит из каждой ячейки список полей, которые нужно помещать в ее расшфровку и создаст в данных расшифровки для ячейки элемент типа ЭлементРасшифровкиКомпоновкиДанныхПоля, в который поместит значения полей. При этом родительским для нового элемента будет являться элемент, содержащий значения полей группировки, т.е. элемент, заполненный на втором шаге. Если выводился элемент для ресурсов на пересечении группировок кросс-таблицы, то у элемента будет установлено два родительских элемента — один от группировки — строки и один от группировки — колонки. Идентификатор вновь созданного элемента будет помещен в качестве значения расшифровки в ячейку результирующего табличного документа. Именно этот идентификатор придет в обработчик расшифровки, если пользователь потребует расшифровать в отчет в данной ячейке.

Обработка расшифровки.

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

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

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

  • раскрытие группировки;
  • открытие документа или элемента справочника;
  • открыть другой отчет;
  • открыть обороты или анализ счета, если речь идет о программе, где ведется бухгалтерский учет;
  • упорядочивание;
  • ограничить действия пользователя;
  • добавить собственное произвольное действие;
  • компоновать состав меню в зависимости от данных в ячейках.

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

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

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

Читайте также:  P5s mx se характеристики

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

//Здесь заполняем колонки, на которые должна реагировать расшифровка.
//В данном варианте отчета поля д.б. ссылками
МРасшифровываемых = Новый Массив ( ) ;
МРасшифровываемых . Добавить ( «Контрагент» ) ;
МРасшифровываемых . Добавить ( «Номенклатура» ) ;

//Полученное значение
РасшифрЗначение = ПолучитьРасшифровкуНаСервере (
Расшифровка , МРасшифровываемых ) ;

Если РасшифрЗначение = Неопределено Тогда Возврат ; КонецЕсли ;
СтандартнаяОбработка = Ложь ;

// Прописываем доступные действия. Если какое-то действие не указать,
//оно не будет доступно пользователю

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

ВыпДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных . Нет ;
ПараметрВыполненногоДействия = Неопределено ;
ДоступДействия = Новый Массив ;
ДоступДействия . Добавить (
ДействиеОбработкиРасшифровкиКомпоновкиДанных . ОткрытьЗначение ) ;
ДоступДействия . Добавить (
ДействиеОбработкиРасшифровкиКомпоновкиДанных . Отфильтровать ) ;
ДоступДействия . Добавить (
ДействиеОбработкиРасшифровкиКомпоновкиДанных . Оформить ) ;
ДоступДействия . Добавить (
ДействиеОбработкиРасшифровкиКомпоновкиДанных . Расшифровать ) ;
ДоступДействия . Добавить (
ДействиеОбработкиРасшифровкиКомпоновкиДанных . Сгруппировать ) ;
ДоступДействия . Добавить (
ДействиеОбработкиРасшифровкиКомпоновкиДанных . Упорядочить ) ;
//Создаем собственные действия

ДопПункты = Новый СписокЗначений ;
ОбщСтрока = «Открыть отчет Расчеты с поставщиками «
+ «» «» + Строка ( ТипЗнч ( РасшифрЗначение ) )
+ » = « + РасшифрЗначение + «» «» ;

ДопПункты . Добавить ( 1 , ОбщСтрока + » за 1 мес.» ) ;
ДопПункты . Добавить ( 3 , ОбщСтрока + » за 3 мес.» ) ;
ДопПункты . Добавить ( 6 , ОбщСтрока + » за 6 мес» ) ;
ДопПункты . Добавить ( 12 , ОбщСтрока + » за 12 мес.» ) ;

//Меню
ОбрРасшифровки . ВыбратьДействие (
Расшифровка ,
ВыпДействие ,
ПараметрВыполненногоДействия ,
ДоступДействия ,
ДопПункты ) ;

ЕслиВыпДействие
= ДействиеОбработкиРасшифровкиКомпоновкиДанных . Нет Тогда
ИначеЕсли ВыпДействие
= ДействиеОбработкиРасшифровкиКомпоновкиДанных . ОткрытьЗначение Тогда
ОткрытьЗначение ( ПараметрВыполненногоДействия ) ;
ИначеЕсли ТипЗнч ( ВыпДействие ) = Тип ( «Число» ) Тогда

Форм2 = ПолучитьФорму (
«Отчет.РасчетыСПоставщиками.Форма» ,
,
,
РасшифрЗначение ) ; //Форма Расшифровки.

КомпоновщНастр = ЭтаФорма . Отчет . КомпоновщикНастроек ;
КомпоновщНастр2 = Форм2 . Отчет . КомпоновщикНастроек ;

//Здесь устанавливаем настройки открываемого отчета
УстановитьЗначениеОтбораКомпоновщикаНастроекПоОбразцу (
КомпоновщНастр ,
КомпоновщНастр2 ,
«Контрагент» ) ;

УстановитьЗначениеОтбораКомпоновщикаНастроек ( КомпоновщНастр2 ,
Строка ( ТипЗнч ( РасшифрЗначение ) ) ,
РасшифрЗначение ,
ВидСравненияКомпоновкиДанных . Равно ) ;

ДатаКонца = ПолучитьЗначениеПераметраКомпоновщикаНастроек (
ЭтаФорма . Отчет . КомпоновщикНастроек ,
«ДатаКонца» ) ;

ПериодОтчета = Новый СтандартныйПериод (
ДобавитьМесяц ( ДатаКонца , — ВыпДействие ) ,
ДатаКонца ) ;

УстановитьЗначениеПераметраКомпоновщикаНастроек (
КомпоновщНастр2 ,
«Период» ,
ПериодОтчета ) ;

//Здесь открываем новый отчет
СтрВозврата = ОбработатьРасшифровкуНаСервере (
Форм2 . Отчет , «ОтчетОбъект.РасчетыСПоставщиками» ,
Форм2 . ОтчетТабличныйДокумент ,
Форм2 . НавигационнаяСсылка ,
Форм2 . УникальныйИдентификатор ) ;

Форм2 . ОтчетТабличныйДокумент = СтрВозврата . Результат ;
Форм2 . НавигационнаяСсылка = СтрВозврата . ДанныеРасшифровки ;
Форм2 . Открыть ( ) ;

&НаСервере
Функция ПолучитьРасшифровкуНаСервере (
Расшифровка ,
МассивИменРасшифровки ,
ЭтоГруппа = Ложь )

Данные = ПолучитьИзВременногоХранилища ( ДанныеРасшифровки ) ;
Поля = Данные . Элементы . Получить ( Расшифровка ) . ПолучитьПоля ( ) ;
Для Каждого ИмяРасшифровки Из МассивИменРасшифровки Цикл
ПолеНоменкл = Поля . Найти ( ИмяРасшифровки ) ;
Если Не ПолеНоменкл = Неопределено Тогда Прервать ; КонецЕсли ;
КонецЦикла ;
Возврат ПолеНоменкл . Значение ;
КонецФункции

&НаКлиенте
Процедура УстановитьЗначениеОтбораКомпоновщикаНастроек (
КомпоновщНастр2 ,
ИмяОтбора ,
Значение ,
ВидСравнения ,
Использование = Истина )

ПолеЭлементаОтбора =
КомпоновщНастр2 . Настройки . Отбор . ДоступныеПоляОтбора . Элементы . Найти ( ИмяОтбора ) . Поле ;

ИДЭлмОтбора = «» ;
Для Каждого Элемент Из КомпоновщНастр2 . Настройки . Отбор . Элементы Цикл
Если Элемент . ЛевоеЗначение = ПолеЭлементаОтбора Тогда
ИДЭлмОтбора = Элемент . ИдентификаторПользовательскойНастройки ;
Прервать ;
КонецЕсли ;
КонецЦикла ;

Коллекция2 = КомпоновщНастр2 . ПользовательскиеНастройки . Элементы ;

Если ИДЭлмОтбора = «» Тогда //Нет среди стандартных настроек
Для Каждого Элемент Из Коллекция2 Цикл //Ищем….
Если ТипЗнч ( Элемент ) = Тип ( «ОтборКомпоновкиДанных» ) Тогда
ПолеОтбора = Новый ПолеКомпоновкиДанных ( ИмяОтбора ) ;
ОтборНайден = Ложь ;
Для Каждого ЭлемОтбора Из Элемент . Элементы Цикл
Если ЭлемОтбора . ЛевоеЗначение = ПолеОтбора Тогда
ОтборНайден = Истина ; Прервать ; КонецЕсли ;
КонецЦикла ;
Если Не ОтборНайден Тогда
ЭлемОтбора = Элемент . Элементы . Добавить ( Тип ( «ЭлемОтбораКомпоновкиДанных» ) ) ;
Элемент . Элементы [ 0 ] . ЛевоеЗначение = ПолеОтбора ;
ЭлемОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( ИмяОтбора ) ;
КонецЕсли ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Иначе
ЭлемОтбора = Коллекция2 . Найти ( ИДЭлмОтбора ) ;
КонецЕсли ;

Читайте также:  Bbk popcorn np101s v2

ЭлемОтбора . ПравоеЗначение = Значение ;
ЭлемОтбора . Использование = Использование ;
ЭлемОтбора . ВидСравнения = ВидСравнения ;

&НаКлиенте
Процедура УстановитьЗначениеОтбораКомпоновщикаНастроекПоОбразцу ( КомпоновщНастр , КомпоновщНастр2 , ИмяОтбора )
Отбор = КомпоновщНастр . Настройки . Отбор ;
Для Каждого Элемент Из Отбор . Элементы Цикл
ЭлемОтбора = Элемент ;
Прервать ;
КонецЦикла ;
УстановитьЗначениеОтбораКомпоновщикаНастроек ( КомпоновщНастр2 , ИмяОтбора , ЭлемОтбора . ПравоеЗначение , ЭлемОтбора . ВидСравнения , ЭлемОтбора . Использование ) ;
КонецПроцедуры

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

Результат проделанной работы:

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

После выбора нужной позиции откроется отчет «Ведомость расчетов с поставщиками»:

У меня данных в этом отчете нет, но видно, что параметры формирования передались правильно.

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

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

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

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

Итак, задача №1. Постановка: Необходимо доступные действия для пользователя ограничить только: открытием элемента, упорядочиванием и оформлением.
Решение:
Код 1C v 8.х

Задача №2. Постановка: Необходимо добавить в меню свое действие, открывающее основную форму элемента, содержащегося в ячейке, для которой выполняется расшифровка.
Решение:
Код 1C v 8.х
В процедуре ВыполнитьДействие1(Расшифровка) получаем ПараметрРасшифровки для выбранной ячейки и открывает основную форму:
Код 1C v 8.х

Задача №3. Постановка: Необходимо в зависимости от колонки, для которой выполняется расшифровка, добавлять свои действия: для «Поле1» — «Действие1», для «Поле2» — «Действие2».
Решение:
Код 1C v 8.х
Как видите, ничего сложного здесь нет!
Источник
При использовании в типовой конфигурации:
Код 1C v 8.х

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *