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

Обновлено: 03.07.2024

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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


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


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


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


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


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


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

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



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

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

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


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


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

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

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

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

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

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

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

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


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

От вас правильно заданный вопрос. Идеально - модельная база с тестовыми данными и отчет (обработка и т.п.).

Не обещаю, что смогу ответить прям на любой вопрос, но буду стараться :)

(0) Правильно заданный вопрос содержит половину ответа.

А ты попробуй на неверно заданный ответить!

Есть вопрос! Есть ЗУП. 3.1. В нём формирование запросов, например, по кадровому состоянию делается некими процедурами каких-то модулей.
Есть отчёт на СКД, куда вдруг стало необходимым добавить Должности и Подразделения физических лиц, если они когда-либо работали в компании.
Когда кто-то работал в компании, по физлицу НекаяПроцедура.КакоготоМодуля возвращает список всех мест работы (совместителей, уже уволенных, работающих), вертает это всё в виде ВТ_КадроваяЧтототам.
Как такое правильно сопрягать с отчётом на СКД?

(3) для меня простой и понятный вариант выгрузка в объект нужного набора (ВТ_КадроваяЧтототам) и подключение его в схеме СКД как набор Объект.

Вариант сложнее - модификация текста запроса.

И то и другое делается ПриКомпоновкеРезультата

+ к (4) при формировании данных для объекта, можно считать настройки из компоновщика (отборы и параметры), чтобы передать их в нужную процедуру. тем самым поработать чуть-чуть за СКД (в плане отборов).
Так выборка физлиц происходит в момент компоновки, т.е. нужно как-то использовать значения выборки отчёта и прикрутить доп соединение, выполняемое после, а результат дать в макет
Либо, ну это как я вижу - выполнить СКД, получить физлиц, модифицировать СКД - отдать результат.
Что-то мне подсказывается, что вариант в (6) всё же решается стандартными средствами СКД. По варианту (5), который вырождается в (7) - двойное выполнение отчёта, что излишне
(7) есть и такой подход. сейчас постараюсь найти ссылку, где отчет формируется через 2 схемы СКД. первая схема принимает запрос от юзера, далее идет программная обработка, затем данные помещаются во вторую схему.

(12) Реальный вопрос начинается с описания результата - какую проблему надо решить. Когда пишут, что надо в некий отчет добавить некие поля - это уже процесс решения.

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

Говорю это как человек, который сам регулярно пишет отчеты для ЗУП 3.

Бывают такие задачи, когда проще запилить свой отчет на СКД с использованием каких-то процедур ОМ или собственных запросов, чем модифицировать существующий.

(9) не понял где двойное выполнение отчета. функция формирует ВТ только по одному физ лицу? или туда можно передать список?

если можно передать список, то в схеме описываем набор Объект. в ПриКомпоновкеРезультата формируем этой функцией ТЗ (не ВТ), передаем ее в схему. Можно считать настройки отбора, чтобы функция отрабатывала с отборами. Ну и все - выполняем отчет.

Блин недавно читал на ИС хорошую статью где с помощью 2х СКД описывалась методика формирования. НАйти не могу.

(16)Есть вопрос. Самописный, простой отчет без использования всяких универсальных отчетов и общих форм.
В форме отчета, в процедуре ПриСозданииНаСервере в Отчет.КомпоновщикНастроек.ФиксированныеНастройки.Отбор добавляются некие отборы. Типа ограничение доступа к некоторым данным для пользователя.

На предыдущей платформе (8.3.10) этот отчет прекрасно работал.
На платформа 8.3.13.1644 вдруг перестало работать. Отчет выдает пустую таблицу. Помогло только в модуле объекта в процедуре ПриКомпоновкеРезультата отключить СтандартнуюОбработку и написать программное формирование отчета с получением настроек из компоновщика и загрузкой их в компоновщик макета.
Так вот вопрос, что нужно сделать чтобы фиксированные настройки компоновщика в форме применились сразу, без лишних телодвижений в модуле объекта?

Создавал отдельную тему по своему вопросу:

Два регистра "Продажи" и "ПродажиСебестоимость". В первом есть измерение "Менеджер", во втором нет. Надо отобрать данные Стоимости и Себестоимости продаж с детализацией по Менеджеру, но из-за отсутствия данного измерения во втором регистре записи в нем группируются, когда в продажах эти записи могут разбиваться на несколько строк, потому что для записей разные Менеджеры.
В результате следующего запроса данные в отчете по себестоимости неверные. Как получить корректную сумму по себестоимости с учетом того, что данные должны группироваться по Менеджеру?

Ок, лезем на любой ресурс, коих полно, копируем код, правим под свои нужды и вуаля! Отчет работает, только при попытке расшифровать выскакивает какое то окошко с цифрами :( Что делать?

Решение

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

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

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

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

(1) Да, сорри этот код можно выполнить в толстом клиенте упр. приложения. Я когда выкладывал статью делал пример как раз на базе. которая переходит на тонкие формы и там был период когда режим работы обычное приложение, а форма управляемая.
Тут самое главное смысл получения расшифровки по идентификатору.

На УФ надо положить "Данные расшифровки" во временное хранилище. Далее:

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

На форму добавить реквизит "ДанныеРасшифровки" с типом "Строка"

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)

&НаСервере
Процедура КонтрагентПриИзмененииНаСервере()

Если Контрагент.Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;

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

ПараметрКД = Настройки.ПараметрыДанных.Элементы.Найти("Контрагент");
ПараметрКД.Значение = Контрагент;

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

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

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

&НаКлиенте
Процедура ТабДокОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
Данные = Сервер(Расшифровка);
ОткрытьЗначение(Данные);

&НаСервере
Функция Сервер(Расшифровка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также: