1с скд открыть документ по двойному клику на ячейке отчета

Обновлено: 04.07.2024

Использование объекта ДанныеРасшифровки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

наверное надо начать с того, что успел сделать. и описать стартовые условия - УФ/ОФ, внешний/встроенный

Гугл, Хрусталева. Тема заезженная.
Что такое "другой СКД-макет"? Другой вариант?

УФ. Внешний. Облазил весь инет. Помимо макета "ОсновнаяСхемаКомпоновкиДанных" есть еще два макета, один собран руками, другой сделан на СКД - они одинаковые, пытаюсь хоть какой-нибудь запустить. Это не другой вариант, если конкретно - там детализация по сотрудникам, количество которых указано в самом отчете (то есть имена, телефоны и т.д.). Есть форма отчета. Пытался в процедуре "ОбработкаРасшифровки" что-нибудь написать. Получалось вывести то идентификатор ячейки, то пустой табличный документ, но дальше этого не продвинулся.

(4) так и напиши = "не понимаю как работает расшифровка". тогда книжки, яндекс, инфостарт

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

Или проблема с получением нужных данных из расшифровки в событии расшифровки?

(6) По сути да, табличный документ. Сформирован в модуле формы. Хотел в том же модуле формы сделать обработку расшифровки.
(7) И да, нужные данные не могу получить, в лучшем случае получаю идентификатор ячейки.
(8) Если не жалко чем-то поделиться, поделитесь.

(9) Это не идентификатор ячейки. Это индекс элемента данных расшифровки, которые лежат во временном хранилище. Адрес хранилища лежит в реквизите отчета "ДанныеРасшифровки" (обычно с таким именем его создает мастер, ссылка на него прописывается в свойствах отчета).
И вот оттуда уже достаешь чего надо. В БСП или в блоке работы с отчетами в типовых какие-то наработки на эту тему уже есть. Но под рукой вот что-то сам когда-то писал.
Вызываешь ПолучитьПараметрыРасшифровываемогоПоля(Расшифровка, ДанныеРасшифровки) и на выходе получаешь структуру, у которой в "ПоляГруппировок" будут значения всех группировок от текущей до вышестоящих.

Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан

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

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

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

указание параметров для расшифровки отчета на СКД в 1С

установка формы настроек

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

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ПолучитьЗначениеПераметраКомпоновщикаНастроек ( КомпоновщНастр , ИмяПараметра )
ИД_Настройки = КомпоновщНастр . Настройки . ПараметрыДанных . Элементы . Найти ( ИмяПараметра ) . ИдентификаторПользовательскойНастройки ;
Коллекция = КомпоновщНастр . ПользовательскиеНастройки . Элементы ;
Возврат Коллекция . Найти ( ИД_Настройки ) . Значение ;
КонецФункции

&НаКлиенте
Процедура УстановитьЗначениеПераметраКомпоновщикаНастроек ( КомпоновщНастр2 , ИмяПараметра , Значение )
ИД_НастройкиПарам2 =
КомпоновщНастр2 . Настройки . ПараметрыДанных . Элементы . Найти ( ИмяПараметра ) . ИдентификаторПользовательскойНастройки ;
Коллекция2 = КомпоновщНастр2 . ПользовательскиеНастройки . Элементы ;
Коллекция2 . Найти ( ИД_НастройкиПарам2 ) . Значение = Значение ;
КонецПроцедуры

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

работа с расшифровкой в Отчете 1С на СКД

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

отборы в расшифрованном отчете

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

Когда может потребоваться программный вывод отчета в 1С на СКД:

  • программная установка параметров СКД;
  • использование внешних данных в отчете;
  • специфика табличного документа при выводе на печать;
  • прочие нестандартные ситуации.

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

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

ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Счет,
ХозрасчетныйОстаткиИОбороты.Субконто1,
ХозрасчетныйОстаткиИОбороты.Субконто2,
ХозрасчетныйОстаткиИОбороты.Субконто3,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток,
ХозрасчетныйОстаткиИОбороты.СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , Счет = &Счет, , ) КАК ХозрасчетныйОстаткиИОбороты

Вот, как выглядит отчет в стандартном виде:

сформированный отчет в 1С на СКД

Теперь сформируем его программно. Для этого нам нужно добавить Основную Форму:

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

создание формы отчета по умолчанию

Добавим команду и кнопку на форме:

создание команды на управляемой форме

В действиях команды пропишем следующий код (читать код на сайте достаточно трудно, поэтому рекомендуем скачать уже готовый пример отчета и посмотреть код в нем):

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