Здесь специально используются те же отчеты что и в //infostart.ru/public/151562/, реализуется тот же функционал (за небольшим исключением). Начало такое же как и в предыдущей методике.
Предположим что есть некий отчет, при расшифровке которого нужно использовать другой, отличный от первого отчет, или конкретнее:
При расшифровке отчета «НеликвидыНоменклатуры» хочется использовать отчет «АнализДвиженийТоваровСРезервамиУпак», оба отчета самопальные и внедерены в УТ11 (оба отчета во вложении к теме). Т.е. при клике на ячейке с номенклатурой исходного отчета, должен быть построен отчет-расшифровка уже установленным отбором по этой номенклатуре, до кучи можно установить другие параметры отчета расшифровки (например период и склад):
- Прежде всего, чтобы иметь возможность запрограммировать расшифровку нам понадобится ФормаОтчета «НеликвидыНоменклатуры», её необходимо добавить (элементы формы система добавит сама).
- Для элемента формы «Результат» в событии «ОбработкаРасшифровки» нужно добавить процедуру, например: «РезультатОбработкаРасшифровки»
- В модуле этой формы нужно наполнить процедуру содержимым:
Сначала нужно понять в каком же месте произошло событие, требующее расшифровки (иначе говоря нужно узнать какую номенклатуру выбрал пользователь), т.к. «РезультатОбработкаРасшифровки» работает на клиенте, тут потребуется вызов серверной функции с передачей в качестве параметра переменной «Расшифровка»
Номенклатура = ПолучитьРасшифровкуНаСервере(Расшифровка, ЭтоГруппа);
Тут передается также переменная ЭтоГруппа – для возврата признака выбранной номенклатуры.
Сама функция:
&НаСервере
Функция ПолучитьРасшифровкуНаСервере(Расшифровка, ЭтоГруппа = Ложь)
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); //Здесь основная «недокументированная фишка»: Переменная ДанныеРасшифровки не описана в хелпе, также не описано что Данные, нужно получать путем извлечения из временного хранилища,
Поля = Данные.Элементы.Получить(Расшифровка).ПолучитьПоля(); //Тут получаем поля расшифровки, среди которых находим нужное.
ПолеНоменклатура = Поля.Найти(«Номенклатура»);
Если ПолеНоменклатура = Неопределено Тогда
Возврат Неопределено;
Иначе
ЭтоГруппа = ПолеНоменклатура.Значение.ЭтоГруппа;
Возврат ПолеНоменклатура.Значение;
КонецЕсли;
КонецФункции
До этого момента все делается также как и в //infostart.ru/public/151562/, отсюда начинаются отличия.
Далее, продолжаем наполнять основную процедуру формы исходного отчета «РезультатОбработкаРасшифровки»:
Если Номенклатура = Неопределено Тогда Возврат; КонецЕсли;
Если ЭтоГруппа Тогда Возврат; КонецЕсли; //Группа стандартной обработкой проверяется на равенство, поэтому при выборе группы используем стандартную расшифровку.
СтандартнаяОбработка = Ложь;
//Получаем Склад, указанный в Отборе текущего отчета:
КоллекцияЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
НастройкиЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки;
ПолеСкладЗдесь = НастройкиЗдесь.Отбор.ДоступныеПоляОтбора.Элементы.Найти(«Склад«).Поле;
ИДЭлмОтбораСкладЗдесь = «»;
Для Каждого Элемент Из НастройкиЗдесь.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = ПолеСкладЗдесь Тогда ИДЭлмОтбораСкладЗдесь = Элемент.ИдентификаторПользовательскойНастройки; Прервать; КонецЕсли;
КонецЦикла;
ЭлементОтбораСкладЗдесь = КоллекцияЗдесь.Найти(ИДЭлмОтбораСкладЗдесь);
//Получаем Период, указанный в настройках текущего отчета:
ИДНастройкиПериодЗдесь = НастройкиЗдесь.ПараметрыДанных.Элементы.Найти(«Интервал«).ИдентификаторПользовательскойНастройки;
КонецПериодаЗдесь = КоллекцияЗдесь.Найти(ИДНастройкиПериодЗдесь).Значение.ДатаОкончания;
//»Классическая» схема расшифровки одного отчета используя другой отчет:
//Настраиваем отбор будующего отчета
ОтборХ = Новый Структура(«Номенклатура, Период«,
Номенклатура,
Новый СтандартныйПериод(ДобавитьМесяц(КонецПериодаЗдесь, -12),КонецПериодаЗдесь));
//Склад добавляем только если включен соотв. отбор в источнике
Если ЭлементОтбораСкладЗдесь.Использование Тогда
ОтборХ.Вставить(«Склад«, ЭлементОтбораСкладЗдесь.ПравоеЗначение);
КонецЕсли;
//В параметрах должен фигурировать вариант, в котором НЕТ установки параметров пользовательских настроек и пользовательских отборов,
//т.к. это вызовет конфликт настроек и отчет не будет сформирован.
ПараметрыФормыХ = Новый Структура(«СформироватьПриОткрытии, Отбор, КлючВарианта«, Истина, ОтборХ, «ДляРасшифровки«);
ОткрытьФорму(«Отчет.АнализДвиженийТоваровСРезервамиУпак.Форма«, ПараметрыФормыХ, ЭтаФорма, Номенклатура);
Некоторые пояснения к тексту процедуры:
- Получаем Номенклатуру, по которой пользователь произвел клик (вызов серверной функции «ПолучитьРасшифровкуНаСервере«)
- Получаем отбор по складу в исходном отчете (из настроек).
- Получаем параметр Интервал в исходном отчете (из настроек)
- Формируем структуру отбора отчета-расшифровки (наполняем её данными полученными в пп. 1-3)
- Формируем структуру ПараметрыФормыХ, для передачи в открывемую форму отчета описание параметров здесь:
- Открываем форму отчета расшифровки передавая соответствующие параметры, описание здесь:
- т.к. условие в отборе отчета-расшифровки при использовании данной методики, устанавливается платформой на «равенство» или на «вхождение в список», то нет возможности получить расшифровку по группе номенклатуры.
- при расшифровке в строке Вариант отчета отчета-расшифровки, получаем значение «Для Расшифровки (Установлен дополнительный отбор)«, т.е. переформировать данный отчет с другими настройками (номенклатуры или склада), будет невозможно.
- вытекает из пп 2.: для использования такой расшифровки, в настройках отчета-расшифровки должен быть вариант, в котором нет пользовательских отборов и параметров»пересекающихся» с теми, которые устанавливаются при его открытии.
Спасибо, было познавательно, как раз такая задача сейчас передо мной и стоит — расшифровать один самопальный отчет другим.
Спасибо тебе, добрый человек!