1С скд расшифровка по всей строке

Платформа:

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

1. В запросе нужно обязательно выбрать поле Ссылка.

2. В колонке "Выражение представления" нужно выбрать реквизит, который будет выводится в отчёт (например, Номер или Наименование).

3. Установить галку переключателя заголовок-автозаголовок в соответствующей строке и указать представление поля.

Теперь при нажатии на значение заданного поля будет открываться соответствующий документ или элемент справочника.

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

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

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

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

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

Я сразу приведу текст процедур и функций для организации расшифровок на СКД в 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 . Найти ( ИДЭлмОтбора ) ;
КонецЕсли ;

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

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

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

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

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

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

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

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

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

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

Перем ВыполненноеДействие , ПараметрВыполненногоДействия ;

Если ТипЗнч ( Расшифровка ) <> Тип ( "ИдентификаторРасшифровкиКомпоновкиДанных" ) Тогда
Возврат;
КонецЕсли;

СтандартнаяОбработка = Ложь;

Если ПустаяСтрока ( СхемаКомпоновки )
Или Не ЭтоАдресВременногоХранилища ( СхемаКомпоновки ) Тогда
Возврат;
КонецЕсли;

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

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

ДополнительныеПункты = Новый СписокЗначений ;
ДополнительныеПункты . Добавить ( "ВывестиВСообщение" , "Вывести в сообщение" );

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

Если ВыполненноеДействие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных . Нет
И ПараметрВыполненногоДействия <> Неопределено Тогда // требуется сформировать отчет с новыми настройками

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

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

ПараметрыФормы = Новый Структура ( "КлючНазначенияИспользования,СформироватьПриОткрытии,Расшифровка","Расшифровка" ,Истина, ОписаниеРасшифровки );

ОткрытьФорму ( "Отчет.ПрограммнаяРасшифрокаОтчета.Форма.ФормаОтчета" , ПараметрыФормы , ЭтаФорма );

КонецЕсли;

ИначеЕсли ВыполненноеДействие = "ВывестиВСообщение" Тогда

ПолучитьЗначениеРасшифровки ( Расшифровка );

Если ТипЗнч ( ЭлементРасшифровки ) = Тип ( "ЭлементРасшифровкиКомпоновкиДанныхПоля" ) Тогда

ПоляРасшифровки = ЭлементРасшифровки . ПолучитьПоля ();

Для каждого ПолеРасшифроки Из ПоляРасшифровки Цикл

Сообщить ( ПолеРасшифроки . Значение );

КонецЦикла;

Где "СхемаКомпоновки" это реквизит формы с типом "Строка", в которую будет помещен адрес во временом хранилище для схемы компновки данных.


[an error occurred while processing the directive]
Карта сайта