helpf.pro
Регистрация

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

Mokey
27.04.2011 15:40Прочитано: 69618
Вопрос в следуущем:
Есть отчёт в СКД с собственной расшифровкой.
Открывает расшифровка новую форму (тоже на СКД) и компонуется
Код 1C v 8.х
 
Форма = Отчет.ПолучитьФорму();
Отчет.СкомпоноватьРезультат(Форма.ЭлементыФормы.Результат);
Форма.Открыть();

все открывается и компонуется, но расшифровки не работают. Если я вставляю второй параметр - то в качестве расшифровки выводится на экран число (уровень расшифровки, я так понимаю). Если нажать штатную кнопку "Сформировать" ничего не меняя, то расшифровка начинает работать. Как заставить её работать сразу?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
27.04.2011 18:02Ответ № 1
(0) Mokey, если я тебя правильно понял, то: v8.x: Как сделать, чтобы при открытии отчет сразу Сформировался?
Mokey
28.04.2011 09:35Ответ № 2
(1) E_Migachev, нет, он формируется, расшифровка не работает
E_Migachev
28.04.2011 11:22Ответ № 3
(2) Mokey, Посмотри книгу Хрусталевой стр 260, там расписано как делается расшифровка
Mokey
28.04.2011 15:18Ответ № 4
(3) E_Migachev, меня интересует вопрос, почему СкомпоноватьРезультат() не компонует расшифровку?
E_Migachev
28.04.2011 15:46Ответ № 5
(4) Mokey, если все правильно указал - должен формировать!
Похоже что не понимает что ей скомпановывать *09
Mokey
28.04.2011 16:08Ответ № 6
(5) E_Migachev, Там же всего два параметра - куда выводить и переменная ДанныеРасшифровки. Если оставить NULL, то расшифровка вообще не работает, если передать переменную - то работает расшифровка, но выводит идентификатор этой самой расшифровки (число). Если нажать штатную "Сформировать", то расшифровка начинает работать так, как положено. Переформулирую вопрос:
где взять данные расшифровки в таком варианте, который я описал выше?
E_Migachev
28.04.2011 17:26Ответ № 7
Как описал ДанныеРасшифровки? код покажи
E_Migachev
28.04.2011 17:31Ответ № 8
+(7) перед формированием расшифровки нужно ЗагрузитьНастройки
Mokey
28.04.2011 17:47Ответ № 9
Код 1C v 8.х
 
Отчет = Отчеты[Метаданные().Имя].Создать();
Форма = Отчет.ПолучитьФорму();
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Отчет.СкомпоноватьРезультат(Форма.ЭлементыФормы["Результат"], ДанныеРасшифровки);
Форма.Открыть();
Mokey
28.04.2011 17:53Ответ № 10
а если полностью, то так выглядит:
Код 1C v 8.х
 
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных (ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДополнительныеДействия=Новый СписокЗначений;
ДополнительныеДействия.Добавить("Действие2","Моё действие...");
ДоступныеДействия = Новый Массив();
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать);
Настройки = ОбработкаРасшифровки.Выполнить(Расшифровка, ВыполненноеДействие, ДоступныеДействия, ДополнительныеДействия);
Если Настройки<>Неопределено Тогда
Отчет = Отчеты.ОбороткаДляБухгалтерии.Создать();
Форма = Отчет.ПолучитьФорму();
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Отчет.СкомпоноватьРезультат(Форма.ЭлементыФормы["Результат"], ДанныеРасшифровки);
Форма.Открыть();


Иначе
Если ВыполненноеДействие="Действие2" Тогда
ВыполнитьДействие2(Расшифровка);
КонецЕсли;
КонецЕсли;

Mokey
28.04.2011 17:57Ответ № 11
т.е. после условия Настройки<>Неопределено вызывается этот штатная расшифровка
E_Migachev
28.04.2011 18:01Ответ № 12
Для реализации расшифровки отчетов, выполненных при помощи системы компоновки данных, в платформе реализован объект ОбработкаРасшифровкиКомпоновкиДанных, который позволяет сформировать настройки компоновки данных, которые можно использовать для формирования отчета - расшифровки.

В некоторых ситуациях использовать возможности объекта ОбработкаРасшифровкиКомпоновкиДанных не представляется возможным, и возникает необходимость программного получения значений полей, которые присутствовали в некоторой ячейке табличного документа, для которой можно получать расшифровку.
В данной статье описывается, каким образом устроен объект ДанныеРасшифровки и как его можно использовать для получения значений полей и полей группировок.
ВАЖНО!
Для того, чтобы при выводе отчета объект ДанныеРасшифровки был заполнен, следует его создать при компоновке макета и передать в процессор компоновки данных.
Для создания объекта ДанныеРасшифровки, при вызове метода Выполнить компоновщика макета, следует передать переменную, в которую требуется поместить созданный объект.
Пример:
Код 1C v 8.х
     МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);   

Для того, чтобы данные расшифровки заполнились при формировании результата, необходимо передать объект ДанныеРасшифровки в метод Инициализировать процессора компоновки данных.
Пример:
Код 1C v 8.х
     ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки);   

Если используется метод объекта Отчет СкомпоноватьРезультат, то для заполнения данных расшифровки следует передать в метод переменную, в которую необходимо поместить данные расшифровки.
Пример:
Код 1C v 8.х
 СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);   

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

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

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

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

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

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

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

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

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

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

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

Если необходимо получать значения полей - группировок для текущего элемента, то следует рекурсивно получить все родительские элементы расшифровки и получить из них значения полей.
Mokey
28.04.2011 21:54Ответ № 13
(12) E_Migachev, спасибо, но всё это я уже читал,
Если используется метод объекта Отчет СкомпоноватьРезультат, то для заполнения данных расшифровки следует передать в метод переменную, в которую необходимо поместить данные расшифровки.
Пример:
Код 1C v 8.х
СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);

меня вот тут как раз и интересует, откуда я возьму ДанныеРасшифровки?
E_Migachev
29.04.2011 14:46Ответ № 14
(13) Mokey, Реализация расшифровки в Системе Компоновки Данных
Mokey
02.05.2011 21:17Ответ № 15
(14) E_Migachev, это всё из одной оперы, вокруг да около, я в 10 ответе уже приводил кусок кода, где это реализовано. Как обработать текущую расшифровку - мне понятно, непонятно другое, как сформировать другую СКД так, чтобы в ней тоже расшифровка работала сразу...
Heinrich
14.03.2012 21:49Ответ № 16
Доброго дня. Проблема та же: при формировании отчёта в расшифровке только унылые цифирьки. Нажимая "Сформировать" появляется расшифровка. Как быть, подскажите...
romanoff
24.05.2012 17:08Ответ № 17
(16) Heinrich, (15) Mokey
Что только не перепробовал, но без "ОбработкиРасшифровки" в форме ни как не выходил каменный цветок...
задача проста... имеет только макет (или адрес полчения XML)
мне нужно Показать() Новый ТабличныйДокумент.

все оказалось весьма просто.
на каждое поле создаем макет, в поле параметр и параметрРасшифровки пишем один и тот же параметр (иначе он будет распознавать как параметр расшифровки и тогда ...циверки). Далее выбираем нужное поле в описании параметра Ииии!!! видим что коварная желтаясистема подставляет Представление(Номенклатура)... тупо ручками правим просто на "Номенклатура" и ..все ) далее мы видим не цифири, не строку с наименованием а открывшуюся форму.
Изменено 24.05.12 17:11:26
Mokey
24.05.2012 17:50Ответ № 18
(17) romanoff, лично я ничего не понял из вышеописанного
kirillova_nn
28.05.2012 16:01Ответ № 19
Всем привет. Тоже занимаюсь сейчас данной проблемой.
К коду, описанному выше (10), добавила еще одну строку по загрузке ДанныхРасшифровки и вместо цифр теперь в отчете (который сам по себе уже расшифровка) появляется уже стандартная расшифровка.
Получилось вот что
....
Если Настройки<>Неопределено Тогда
Отчет = Отчеты.ОбороткаДляБухгалтерии.Создать();
Форма = Отчет.ПолучитьФорму();
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Отчет.СкомпоноватьРезультат(Форма.ЭлементыФормы["Результат"], ДанныеРасшифровки);
// ДОБАВЛЕННАЯ СТРОКА
Форма .ДанныеРасшифровки = ДанныеРасшифровки;
// КОНЕЕЦ ДОБАВ СТРОКИ
Форма.Открыть();


Иначе
...
КонецЕсли;

Есть вероятность, что не те ДанныеРасшифровки я "засылаю" (только начинаю изучать СКД детально), но результат очень порадовал.

Может за это время решение еще кто-то нашел?
vasyak
19.02.2013 16:35Ответ № 20
Народ, вы с бубном танцуете, когда достаточно задать себе вопрос: "А откуда взялась переменная ДанныеРасшифровки, которую вроде никто не объявлял?"
Святой Ctrl+F1 говорит, что это - расширение формы отчёта. Если намёк непонятен, то:

Форма.ДанныеРасшифровки

А вы вместо этого компонуете отчёт в созданной форме, а расшифровку оставляете в этой.
В итоге приз за успех в удалении гланд через *12 получает kirillova_nn.
andjei
20.03.2019 09:02Ответ № 21

Если кому-то интересно. 

Делал печатную форму документа через СКД, там соответственно нет формы, есть только макет.

Код который исправляет ситуацию:

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДокумент); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

//Подмена расшифровки в макете Для к = 1 По ТабДокумент.ВысотаТаблицы Цикл Если ТабДокумент.Область(к,1).Расшифровка<>Неопределено Тогда ТабДокумент.Область(к,1,к,ТабДокумент.ШиринаТаблицы).Расшифровка=ДанныеРасшифровки.Элементы[ТабДокумент.Область(к,1).Расшифровка].ПолучитьПоля()[0].Значение; КонецЕсли; КонецЦикла;

Соответственно расшифровка берется из первой колонки и ставится на всю строку, в моём случае этого достаточно.

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