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



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

Здесь специально используются те же отчеты что и в //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/), т.к. считаю его более юзабельным.





2 Comments

  1. GreenFox

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

    Reply
  2. ksely

    Спасибо тебе, добрый человек!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *