Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут! (в рабочие часы)

Расшифровка в 1С в отчете на СКД (системе компоновки данных)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ДопПункты.Добавить( 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, ИмяОтбора, ЭлемОтбора.ПравоеЗначение, ЭлемОтбора.ВидСравнения, ЭлемОтбора.Использование);
КонецПроцедуры

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

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

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


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

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

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

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

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

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

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

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Остались вопросы?

СПРОСИТЕ в комментариях!

Комментариев: 5 на “Расшифровка в 1С в отчете на СКД (системе компоновки данных)
  1. Добрый день. Что такое «ДанныеРасшифровки»? Откуда они берутся на форме

    Ответить

    • Реквизит на форме, только не плнял в какой момент он должен заполнятсья

      Ответить

  2. В вашем примере тут: «ЭлемОтбораКомпоновкиДанных» ошибка. Д.б. вот так
    «ЭлемОтбора = Элемент.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»))»

    Ответить

  3. ОбрРасшифровки.ВыбратьДействие() возможно ТОЛЬКО в режиме использования модальности. В противном случае получите ошибку!

    Ответить

  4. Использование модальных окон в данном режиме запрещено!

    Ответить

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

Ваш адрес email не будет опубликован.