Имя: Пароль:
1C
1С v8
СКД. УФ. Пример расшифровки вариантом отчета.
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].Поле;
       КонецЕсли;
       
       Если ИмяРасшифровываемогоПоля = "МаршрутДоставки" ИЛИ ИмяРасшифровываемогоПоля = "ТорговаяТочка" Тогда
       
           СтандартнаяОбработка = Ложь;
       
           ПоляРасшифровки = ПолучитьСтруктуруПолейРасшифровки(ЭлементРасшифровки); // значения полей из текущих и вышестоящих группировок
           
           ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
           
           ДоступныеДействия = Новый Массив;
           ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);

           ДополнительныеПункты = Новый СписокЗначений;
           ДополнительныеПункты.Добавить("ВывестиКомплектовочныеЛисты", "Вывести комплектовочные листы");
           
           ВыполненноеДействие = Неопределено; ПараметрВыполненногоДействия = Неопределено;
           ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыполненноеДействие, ПараметрВыполненногоДействия, ДоступныеДействия, ДополнительныеПункты);

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