gifts2017

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

Опубликовал mxm2 mxm2 (mxm2) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

&НаСервере

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

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

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

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

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

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

               Иначе

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

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

               КонецЕсли;

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

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

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

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

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

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

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

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

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

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


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

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





Скачать файлы

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Alex Stasyuk (GreenFox) 27.11.12 11:40
Спасибо, было познавательно, как раз такая задача сейчас передо мной и стоит - расшифровать один самопальный отчет другим.
2. Алексей Войтович (ksely) 25.10.15 02:25
Спасибо тебе, добрый человек!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа