![]() |
|
СКД. УФ. Пример расшифровки вариантом отчета. | ☑ | ||
---|---|---|---|---|
0
fisher
14.02.13
✎
14:07
|
Дайте, плиз, примерчик расшифровки другим вариантом этого же отчета в УФ. С передачей в отборы текущей группировки и текущих параметров.
|
|||
1
fisher
14.02.13
✎
14:10
|
На самом деле, мне наверное нужен просто примерчик программного открытия на тонком клиенте отчета СКД с установкой отборов и параметров.
|
|||
2
olegves
14.02.13
✎
14:18
|
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) ПоляРасшифровки = Новый Структура; ИмяОбластиРасш = Элемент.ТекущаяОбласть.Имя; ПозицияКолонки = Найти(ИмяОбластиРасш,"C"); ПоляРасшифровки.Вставить("Помещение",Результат.Область(лев(ИмяОбластиРасш,ПозицияКолонки)+"1").Расшифровка); ПоляРасшифровки.Вставить("Материал",Результат.Область(лев(ИмяОбластиРасш,ПозицияКолонки)+"2").Расшифровка); ПоляРасшифровки.Вставить("Количество",Результат.Область(лев(ИмяОбластиРасш,ПозицияКолонки)+"3").Расшифровка); ПараметрыРасшифровки = РасшОбработатьНаСервере(ПоляРасшифровки, ДанныеРасшифровки); Если ЗначениеЗаполнено(ПараметрыРасшифровки) Тогда СтандартнаяОбработка = Ложь; Период = Новый СтандартныйПериод; Период.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод; Период.ДатаОкончания = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период").Значение.Дата; Период.ДатаНачала = Дата(2012,08,01); //ДобавитьМесяц(Период.ДатаОкончания, -1); ПараметрыРасшифровки.Вставить("Период", Период); ПараметрыОтч = Новый Структура("СформироватьПриОткрытии, КлючПользовательскихНастроек", Истина, ПараметрыРасшифровки); Отч = ОткрытьФормуМодально("Отчет.ОборотыМатериаловСкладОбъекта.Форма.ФормаОтчета", ПараметрыОтч, ЭтаФорма); КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста Функция РасшОбработатьНаСервере(ПоляРасшифровки, ДанныеРасшифровки) Парам = Новый Структура; Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); Если Данные.Элементы[ПоляРасшифровки.Помещение].ПолучитьПоля()[0].Поле = "Помещение" Тогда Парам.Вставить("Помещение", Данные.Элементы[ПоляРасшифровки.Помещение].ПолучитьПоля()[0].Значение); Парам.Вставить("Материал", Данные.Элементы[ПоляРасшифровки.Материал].ПолучитьПоля()[0].Значение); Парам.Вставить("Количество", Данные.Элементы[ПоляРасшифровки.Количество].ПолучитьПоля()[0].Значение); ПолеРодитель = Данные.Элементы[ПоляРасшифровки.Помещение].ПолучитьРодителей()[0]; Если Типзнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда ЗначениеПоля = ПолеРодитель.ПолучитьПоля().Получить(0); Парам.Вставить(ЗначениеПоля.Поле, ЗначениеПоля.Значение); иначе ЗначениеПоля = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля().Получить(0); Парам.Вставить(ЗначениеПоля.Поле, ЗначениеПоля.Значение); КонецЕсли; КонецЕсли; Возврат Парам; КонецФункции // РасшОбработатьНаСервере() &НаКлиенте Процедура КомпоновщикНастроекПользовательскиеНастройкиПередНачаломИзменения(Элемент, Отказ) ОтборОбъект = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(идОбъект); Если Элемент.ТекущиеДанные.Настройка = "Помещение" Тогда Парам = Новый Массив(); Если ОтборОбъект.Использование И НЕ ОтборОбъект.ПравоеЗначение.Пустая() Тогда Парам.Добавить(Новый ПараметрВыбора("Отбор.Владелец", ОтборОбъект.ПравоеЗначение)); КонецЕсли; ПараметрыОтбора = Новый ФиксированныйМассив(Парам); Если Элемент.ТекущийЭлемент.Имя = "КомпоновщикНастроекПользовательскиеНастройкиЗначение" Тогда Элемент.ТекущийЭлемент.ПараметрыВыбора = ПараметрыОтбора; КонецЕсли; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки) Для каждого эл из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл Если эл.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект") Тогда идОбъект = эл.ИдентификаторПользовательскойНастройки; ИначеЕсли эл.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Материал") Тогда идМатериал = эл.ИдентификаторПользовательскойНастройки; ИначеЕсли эл.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Помещение") Тогда идПомещение = эл.ИдентификаторПользовательскойНастройки; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
3
fisher
14.02.13
✎
14:22
|
О, спасибо!
|
|||
4
fisher
15.02.13
✎
11:51
|
Короче, нетривиальная задачка оказалась.
Суть: два варианта отчета СКД, один расшифровывает другой с учетом отборов и текущих группировок. Но отборы учитываются не произвольные, а предопределенные в пользовательских настройках. Такая вот особенность... Для универсальных отборов тоже несложно сделать, но данный отчет - оперативный и не предусматривает произвольных отборов. Выкладываю мой вариант. Подозреваю, что в типовых на УФ все велосипеды уже изобретены, но вдруг кому пригодиться... &НаКлиенте Функция ПолучитьПредопределенныйЭлементПользовательскихНастроек(ЭлементНастроекВарианта, ПользовательскиеНастройки) НайденныйЭлемент = Неопределено; Если ЭлементНастроекВарианта <> Неопределено Тогда НайденныйЭлемент = ПользовательскиеНастройки.Элементы.Найти(ЭлементНастроекВарианта.ИдентификаторПользовательскойНастройки); КонецЕсли; Возврат НайденныйЭлемент; КонецФункции &НаКлиенте Функция ПолучитьПредопределенныйПользовательскийОтбор(ИмяПоля, КомпоновщикНастроек) НайденныйОтбор = Неопределено; Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); НайденныйОтборНастроекВарианта = Неопределено; Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда Если ЭлементОтбора.ЛевоеЗначение = Поле Тогда НайденныйОтборНастроекВарианта = ЭлементОтбора; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; НайденныйОтбор = ПолучитьПредопределенныйЭлементПользовательскихНастроек(НайденныйОтборНастроекВарианта, КомпоновщикНастроек.ПользовательскиеНастройки); Возврат НайденныйОтбор; КонецФункции &НаКлиенте Функция ПолучитьПользовательскийПараметр(ИмяПараметра, КомпоновщикНастроек) НайденныйПараметр = Неопределено; НайденныйПараметрВарианта = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра); Если НайденныйПараметрВарианта <> Неопределено Тогда НайденныйПараметр = ПолучитьПредопределенныйЭлементПользовательскихНастроек(НайденныйПараметрВарианта, КомпоновщикНастроек.ПользовательскиеНастройки); КонецЕсли; Возврат НайденныйПараметр; КонецФункции &НаКлиенте Функция ПолучитьМассивРодительскихЭлементовРасшифровки(ЭлементРасшифровки) МассивРодителей = Новый Массив; МассивПрямыхРодителей = ЭлементРасшифровки.ПолучитьРодителей(); Для Каждого РодительскийЭлементРасшифровки Из МассивПрямыхРодителей Цикл МассивВышестоящихРодителей = ПолучитьМассивРодительскихЭлементовРасшифровки(РодительскийЭлементРасшифровки); Для Каждого ЭлементРасшифровкиВышестоящегоРодителя Из МассивВышестоящихРодителей Цикл Если ТипЗнч(ЭлементРасшифровкиВышестоящегоРодителя) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда МассивРодителей.Добавить(ЭлементРасшифровкиВышестоящегоРодителя); КонецЕсли; КонецЦикла; КонецЦикла; Для Каждого ПрямойРодитель Из МассивПрямыхРодителей Цикл Если ТипЗнч(ПрямойРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда МассивРодителей.Добавить(ПрямойРодитель); КонецЕсли; КонецЦикла; Возврат МассивРодителей; КонецФункции &НаКлиенте Функция ПолучитьСтруктуруПолейРасшифровки(ЭлементРасшифровки) МассивЭлементовРасшифровки = ПолучитьМассивРодительскихЭлементовРасшифровки(ЭлементРасшифровки); МассивЭлементовРасшифровки.Добавить(ЭлементРасшифровки); СтруктураПолей = Новый Структура; Для Каждого текЭлементРасшифровки Из МассивЭлементовРасшифровки Цикл Для Каждого текПоле Из текЭлементРасшифровки.ПолучитьПоля() Цикл СтруктураПолей.Вставить(текПоле.Поле, текПоле.Значение); КонецЦикла; КонецЦикла; Возврат СтруктураПолей; КонецФункции &НаКлиенте Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) Если КлючТекущегоВарианта = "РеестрСбораЗаказов" Тогда ДанныеРасшифровкиОтчета = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); ЭлементРасшифровки = ДанныеРасшифровкиОтчета.Элементы[Расшифровка]; ИмяРасшифровываемогоПоля = Неопределено; ПоляЭлементаРасшифровки = ЭлементРасшифровки.ПолучитьПоля(); Если ПоляЭлементаРасшифровки.Количество() > 0 Тогда ИмяРасшифровываемогоПоля = ПоляЭлементаРасшифровки[0].Поле; КонецЕсли; Если ИмяРасшифровываемогоПоля = "МаршрутДоставки" ИЛИ ИмяРасшифровываемогоПоля = "ТорговаяТочка" Тогда СтандартнаяОбработка = Ложь; ПоляРасшифровки = ПолучитьСтруктуруПолейРасшифровки(ЭлементРасшифровки); // значения полей из текущих и вышестоящих группировок ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет)); ДоступныеДействия = Новый Массив; ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение); ДополнительныеПункты = Новый СписокЗначений; ДополнительныеПункты.Добавить("ВывестиКомплектовочныеЛисты", "Вывести комплектовочные листы"); ВыполненноеДействие = Неопределено; ПараметрВыполненногоДействия = Неопределено; ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыполненноеДействие, ПараметрВыполненногоДействия, ДоступныеДействия, ДополнительныеПункты); Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ОбработкаРасшифровки.ОткрытьЗначение(Расшифровка, Новый ПолеКомпоновкиДанных(ИмяРасшифровываемогоПоля)); ИначеЕсли ВыполненноеДействие = "ВывестиКомплектовочныеЛисты" Тогда // получим форму отчета для расшифровки ФормаОтчетаРасшифровки = ПолучитьФорму(ЭтаФорма.ИмяФормы, Новый Структура("КлючВарианта", "КомплектовочныеЛисты"), ЭтаФорма, Истина); // перенесем дату отчета в отчет-расшифровку ПараметрДатыЭтогоОтчета = ПолучитьПользовательскийПараметр("НачалоПериода", Отчет.КомпоновщикНастроек); ПараметрДатыОтчетаРасшифровки = ПолучитьПользовательскийПараметр("НачалоПериода", ФормаОтчетаРасшифровки.Отчет.КомпоновщикНастроек); Если ПараметрДатыЭтогоОтчета <> Неопределено И ПараметрДатыОтчетаРасшифровки <> Неопределено Тогда ЗаполнитьЗначенияСвойств(ПараметрДатыОтчетаРасшифровки,ПараметрДатыЭтогоОтчета,"Значение,Использование"); КонецЕсли; // перенесем текущие отборы и значения группировок в отборы отчета-расшифровки СтруктураПредопределенныхПользовательскихОтборов = Новый Структура("СкладРК,МаршрутДоставки,ТорговаяТочка"); Для Каждого ЭлементСтруктурыПредопределенныхПользовательскихОтборов Из СтруктураПредопределенныхПользовательскихОтборов Цикл ЭлементОтбораЭтогоОтчета = ПолучитьПредопределенныйПользовательскийОтбор(ЭлементСтруктурыПредопределенныхПользовательскихОтборов.Ключ, Отчет.КомпоновщикНастроек); ЭлементОтбораОтчетаРасшифровки = ПолучитьПредопределенныйПользовательскийОтбор(ЭлементСтруктурыПредопределенныхПользовательскихОтборов.Ключ, ФормаОтчетаРасшифровки.Отчет.КомпоновщикНастроек); Если ПоляРасшифровки.Свойство(ЭлементСтруктурыПредопределенныхПользовательскихОтборов.Ключ) Тогда ЭлементОтбораОтчетаРасшифровки.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЭлементСтруктурыПредопределенныхПользовательскихОтборов.Ключ); ЭлементОтбораОтчетаРасшифровки.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбораОтчетаРасшифровки.ПравоеЗначение = ПоляРасшифровки[ЭлементСтруктурыПредопределенныхПользовательскихОтборов.Ключ]; ЭлементОтбораОтчетаРасшифровки.Использование = Истина; Иначе Если ЭлементОтбораЭтогоОтчета <> Неопределено И ЭлементОтбораОтчетаРасшифровки <> Неопределено Тогда ЗаполнитьЗначенияСвойств(ЭлементОтбораОтчетаРасшифровки,ЭлементОтбораЭтогоОтчета,"ВидСравнения,Использование,ЛевоеЗначение,ПравоеЗначение,Применение"); КонецЕсли; КонецЕсли; КонецЦикла; ФормаОтчетаРасшифровки.Открыть(); ФормаОтчетаРасшифровки.СкомпоноватьРезультат(); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |