Расшифровка одного отчета СКД при помощи другого отчета СКД (в управляемых формах, классический вариант, методика + пример для УТ11)

18.11.12

Разработка - СКД

Если требуется расшифровка одного отчета СКД при помощи другого отчета СКД, можно использовать представленный классический вариант от 1С. Вариант реализуется еще проще чем http://infostart.ru/public/151562/, но при этом имеет ряд недостатков и ограничений. Пример приведен для конфигурации УТ11.

Скачать исходный код

Наименование Файл Версия Размер
РасшифровкаКВ
.zip 17,57Kb
121
.zip 17,57Kb 121 Скачать

Здесь специально используются те же отчеты что и в //infostart.ru/public/151562/, реализуется тот же функционал (за небольшим исключением). Начало такое же как и в предыдущей методике.

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

При расшифровке отчета «НеликвидыНоменклатуры» хочется использовать отчет «АнализДвиженийТоваровСРезервамиУпак», оба отчета самопальные и внедерены в УТ11 (оба отчета во вложении к теме). Т.е. при клике на ячейке с номенклатурой исходного отчета, должен быть построен отчет-расшифровка уже установленным отбором по этой номенклатуре, до кучи можно установить другие параметры отчета расшифровки (например период и склад):

  1. Прежде всего, чтобы иметь возможность запрограммировать расшифровку нам понадобится ФормаОтчета «НеликвидыНоменклатуры», её необходимо добавить (элементы формы система добавит сама).
  2. Для элемента формы «Результат» в событии «ОбработкаРасшифровки» нужно добавить процедуру, например: «РезультатОбработкаРасшифровки»
  3. В модуле этой формы нужно наполнить процедуру содержимым:

Сначала нужно понять в каком же месте произошло событие, требующее расшифровки  (иначе говоря нужно узнать какую номенклатуру выбрал пользователь), т.к. «РезультатОбработкаРасшифровки» работает на клиенте, тут потребуется вызов серверной функции с передачей в качестве параметра переменной «Расшифровка»

Номенклатура = ПолучитьРасшифровкуНаСервере(Расшифровка, ЭтоГруппа);

Тут передается также переменная ЭтоГруппа – для возврата признака выбранной номенклатуры.

Сама функция:

&НаСервере

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

               Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); //Здесь основная «недокументированная фишка»: Переменная ДанныеРасшифровки не описана в хелпе, также не описано что Данные, нужно получать путем извлечения из временного хранилища,

               Поля = Данные.Элементы.Получить(Расшифровка).ПолучитьПоля(); //Тут получаем поля расшифровки, среди которых находим нужное.

               ПолеНоменклатура = Поля.Найти("Номенклатура");

               Если ПолеНоменклатура = Неопределено Тогда

                               Возврат Неопределено;

               Иначе

                               ЭтоГруппа = ПолеНоменклатура.Значение.ЭтоГруппа;

                               Возврат ПолеНоменклатура.Значение;

               КонецЕсли;

КонецФункции

До этого момента все делается также как и в //infostart.ru/public/151562/, отсюда начинаются отличия.

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

        Если Номенклатура = Неопределено Тогда Возврат; КонецЕсли;

        Если ЭтоГруппа Тогда Возврат; КонецЕсли; //Группа стандартной обработкой проверяется на равенство, поэтому при выборе группы используем стандартную расшифровку.
        СтандартнаяОбработка = Ложь;

        //Получаем Склад, указанный в Отборе текущего отчета:
        КоллекцияЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
        НастройкиЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки;
        ПолеСкладЗдесь = НастройкиЗдесь.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Склад").Поле;
        ИДЭлмОтбораСкладЗдесь = "";
        Для Каждого Элемент Из НастройкиЗдесь.Отбор.Элементы Цикл
                Если Элемент.ЛевоеЗначение = ПолеСкладЗдесь Тогда ИДЭлмОтбораСкладЗдесь = Элемент.ИдентификаторПользовательскойНастройки; Прервать; КонецЕсли;
        КонецЦикла;
        ЭлементОтбораСкладЗдесь = КоллекцияЗдесь.Найти(ИДЭлмОтбораСкладЗдесь);

        //Получаем Период, указанный в настройках текущего отчета:
        ИДНастройкиПериодЗдесь = НастройкиЗдесь.ПараметрыДанных.Элементы.Найти("Интервал").ИдентификаторПользовательскойНастройки;
        КонецПериодаЗдесь = КоллекцияЗдесь.Найти(ИДНастройкиПериодЗдесь).Значение.ДатаОкончания;

        //"Классическая" схема расшифровки одного отчета используя другой отчет:
        //Настраиваем отбор будующего отчета
        ОтборХ = Новый Структура("Номенклатура, Период",
                                Номенклатура,
                                Новый СтандартныйПериод(ДобавитьМесяц(КонецПериодаЗдесь, -12),КонецПериодаЗдесь));
        //Склад добавляем только если включен соотв. отбор в источнике
        Если ЭлементОтбораСкладЗдесь.Использование Тогда
        ОтборХ.Вставить("Склад", ЭлементОтбораСкладЗдесь.ПравоеЗначение);
        КонецЕсли;

        //В параметрах должен фигурировать вариант, в котором НЕТ установки параметров пользовательских настроек и пользовательских отборов,
        //т.к. это вызовет конфликт настроек и отчет не будет сформирован.
        ПараметрыФормыХ = Новый Структура("СформироватьПриОткрытии, Отбор, КлючВарианта", Истина, ОтборХ, "ДляРасшифровки");

        ОткрытьФорму("Отчет.АнализДвиженийТоваровСРезервамиУпак.Форма", ПараметрыФормыХ, ЭтаФорма, Номенклатура);


Некоторые пояснения к тексту процедуры:

    1. Получаем Номенклатуру, по которой пользователь произвел клик (вызов серверной функции "ПолучитьРасшифровкуНаСервере") 
    2. Получаем отбор по складу в исходном отчете (из настроек).
    3. Получаем параметр Интервал в исходном отчете (из настроек)
    4. Формируем структуру отбора отчета-расшифровки (наполняем её данными полученными в пп. 1-3)
    5. Формируем структуру ПараметрыФормыХ, для передачи в открывемую форму отчета описание параметров здесь:
      Синтаксис помошник 
    6. Открываем форму отчета расшифровки передавая соответствующие параметры, описание здесь:
      Синтаксис помощник
Обращаю внимание на то,  что эта методика имеет более простую реализацию, но при этом обладает рядом недостатков, впрочем, они незначительные:
    1. т.к. условие в отборе отчета-расшифровки при использовании данной методики, устанавливается платформой на "равенство" или на "вхождение в список", то нет возможности получить расшифровку по группе номенклатуры.
    2. при расшифровке в строке Вариант отчета отчета-расшифровки, получаем значение "Для Расшифровки (Установлен дополнительный отбор)", т.е. переформировать данный отчет с другими настройками (номенклатуры или склада), будет невозможно.
    3. вытекает из пп 2.: для использования такой расшифровки, в настройках отчета-расшифровки должен быть вариант, в котором нет пользовательских отборов и параметров"пересекающихся" с теми, которые устанавливаются при его открытии.
Реализация во вложении, сам продолжаю использовать первоначальный вариант (//infostart.ru/public/151562/), т.к. считаю его более юзабельным.





См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124936    682    389    

732

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4376    31    obmailok    19    

69

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2149    2    Yashazz    0    

31

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8380    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4929    PROSTO-1C    13    

63

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    6012    15    kalyaka    5    

87

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    7353    accounting_cons    7    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    4770    KVIKS    15    

80
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. GreenFox 27.11.12 11:40 Сейчас в теме
Спасибо, было познавательно, как раз такая задача сейчас передо мной и стоит - расшифровать один самопальный отчет другим.
+
2. ksely 112 25.10.15 02:25 Сейчас в теме
Спасибо тебе, добрый человек!
+
3. janibeg 2 01.07.20 09:49 Сейчас в теме
А эти отчеты должны быть встроены в конфу или достаточно в справочник ДополнительныеОтчетыИОбработки?
+
4. Diyversus 08.02.21 14:12 Сейчас в теме
Пытаюсь реализовать в обычном приложении (УПП) , ругается на ПолучитьИзВременногоХранилища(ДанныеРасшифровки)

Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);

Такая ошибка:
{ВнешнийОтчет.АнализНеликвидов106.Форма.ФормаОтчета.Форма(113)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
по причине:
Ошибка получения значения из временного хранилища
по причине:
Неправильный путь к файлу 'ДанныеРасшифровкиКомпоновкиДанных'

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

Что я упускаю из виду?
+
5. Diyversus 08.02.21 15:17 Сейчас в теме
А упустил я из виду, что ПолучитьИзВременногоХранилища используется для миграции ДанныеРасшифровкиКомпоновкиДанных с клиента на сервер. В обычном приложении не нужно пользоваться временным хранилищем.
+
6. unknown181538 152 01.06.21 14:27 Сейчас в теме
Это еще актуально? Что за переменная ДанныеРасшифровки, которая нигде не определена?
+
7. unknown181538 152 03.06.21 02:35 Сейчас в теме
(6) Разобрался. В УТ11 нужно в общий модуль вписывать - публикация очень помогла.
+
8. akim2040 41 22.08.21 14:14 Сейчас в теме
(7) Можно подробнее?
пытаюсь сделать расшифровку другим отчетом в ERP, но натыкаюсь на эту переменную "ДаннуеРасшифровки" и ошибку что он не определена, не могу понять как исправить
+
9. unknown181538 152 22.08.21 21:42 Сейчас в теме
(8) Нашел, что тогда сделал. Что-то такое получилось.


// В ОБЩЕМ МОДУЛЕ ОтчетыКлиентПереопределяемый

Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
	// ++ 01.06.2021
	иоКлиент.ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	// --





// МОДУЛЬ иоКлиент

Процедура РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, ИмяОтчета)

		Номенклатура = СтруктураРасшифровки.Номенклатура;
		Если Не СтруктураРасшифровки.Свойство("Склад") Тогда
			Склад = Неопределено;
		Иначе
			Склад = СтруктураРасшифровки.Склад;
		КонецЕсли;
	
		Если Номенклатура = Неопределено Тогда 
			Возврат; 
		КонецЕсли;

		//Если ЭтоГруппа Тогда Возврат; КонецЕсли; //Группа стандартной обработкой проверяется на равенство, поэтому при выборе группы используем стандартную расшифровку.
        //Получаем Склад, указанный в Отборе текущего отчета:
        КоллекцияЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
        НастройкиЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки;
        ПолеСкладЗдесь = НастройкиЗдесь.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Склад").Поле;
        ИДЭлмОтбораСкладЗдесь = "";
		
        Для Каждого Элемент Из НастройкиЗдесь.Отбор.Элементы Цикл
			Если Элемент.ЛевоеЗначение = ПолеСкладЗдесь Тогда 
				ИДЭлмОтбораСкладЗдесь = Элемент.ИдентификаторПользовательскойНастройки; 
				Прервать; 
			КонецЕсли;
        КонецЦикла;
        ЭлементОтбораСкладЗдесь = КоллекцияЗдесь.Найти(ИДЭлмОтбораСкладЗдесь);

        //Получаем Период, указанный в настройках текущего отчета:
		//ИДНастройкиПериодЗдесь = НастройкиЗдесь.ПараметрыДанных.Элементы.Найти("Интервал").ИдентификаторПользовательскойНастройки;
		//КонецПериодаЗдесь = КоллекцияЗдесь.Найти(ИДНастройкиПериодЗдесь).Значение.ДатаОкончания;

        //"Классическая" схема расшифровки одного отчета используя другой отчет:
        //Настраиваем отбор будующего отчета
        ОтборХ = Новый Структура("Номенклатура, ПериодОтчета",
                                Номенклатура,
                                Новый СтандартныйПериод(ДобавитьМесяц(ТекущаяДата(), -12),ТекущаяДата()));
        //Склад добавляем только если включен соотв. отбор в источнике
        Если ЗначениеЗаполнено(Склад) Тогда
        	ОтборХ.Вставить("Склад", Склад);
        КонецЕсли;

        //В параметрах должен фигурировать вариант, в котором НЕТ установки параметров пользовательских настроек и пользовательских отборов,
        //т.к. это вызовет конфликт настроек и отчет не будет сформирован.
        ПараметрыФормыХ = Новый Структура("СформироватьПриОткрытии, Отбор, КлючВарианта", Истина, ОтборХ, "ДляРасшифровки");

        ОткрытьФорму("Отчет."+ИмяОтчета+".Форма", ПараметрыФормыХ, ЭтаФорма, Номенклатура);

КонецПроцедуры



Процедура ОбработкаРасшифровки(ЭтаФорма, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт

	ПолноеИмяОтчета = ЭтаФорма.НастройкиОтчета.ПолноеИмя;

	Если ПолноеИмяОтчета = "ВнешнийОтчет.ОстаткиИДоступностьТоваровРасширенный" Тогда
		
		СтруктураРасшифровки = ОтчетыУТВызовСервераПереопределяемый.СформироватьДанныеРасшифровки(Расшифровка, ЭтаФорма.ОтчетДанныеРасшифровки);
		
		Если СтруктураРасшифровки.Свойство("ПриходПодЗаказ")Или СтруктураРасшифровки.Свойство("ПриходОсновной") Тогда
			СтандартнаяОбработка = Ложь;
			РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, "иоРасшифровкаПоОжидаемому");
		ИначеЕсли СтруктураРасшифровки.Свойство("РасходОсновной") Тогда
			СтандартнаяОбработка = Ложь;
			РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, "иоРасшифровкаПоОтгрузке");
		ИначеЕсли СтруктураРасшифровки.Свойство("ВРезерве") Тогда
			СтандартнаяОбработка = Ложь;
			РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, "иоРасшифровкаПоНоменклатуре");
		КонецЕсли;
		
	КонецЕсли;
		
КонецПроцедуры
Показать
+
10. akim2040 41 23.08.21 08:52 Сейчас в теме
(9) Спасибо коллега!
Попробую вечерком.
+
11. akim2040 41 24.08.21 19:30 Сейчас в теме
Чё то я не расскурил как это сделать...
Может кто помочь за символическую плату сделать?
Нужно сделать расшифровку внешнего отчета внутренним "Ведомость по партиям товаров" в конфигурации ERP
+
Оставьте свое сообщение