Имя: Пароль:
1C
1С v8
Отчет (СКД) Управляемые формы. Несколько схем компоновки данных
0 kort-kort
 
19.12.14
11:43
Всем привет.
Пишу отчет, в котором при определенных условиях должна выбираться разная схема компоновке данных. Проблема - не изменяются доступные поля выбора. Скрин и код сейчас добавлю
1 kort-kort
 
19.12.14
11:47
&НаСервере
Процедура ПолеВыбора1ПриИзмененииНаСервере()
    // Вставить содержимое обработчика.
        
        Если ЭтаФорма.ПолеВыбора1 = "Все" Тогда        // УСТАНОВКА СКД "ВСЕ"
        
        Настройки = Отчет.КомпоновщикНастроек.Настройки;
        
        ОбъектОтчет        = РеквизитФормыВЗначение("Отчет");

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

        ОбъектОтчет.СхемаКомпоновкиДанных = ОбъектОтчет.ПолучитьМакет("СхемаОплаченные");
        Настройки = ОбъектОтчет.СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
        
        ОбъектОтчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОбъектОтчет.СхемаКомпоновкиДанных));
        ОбъектОтчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
        
        Настройки = ОбъектОтчет.КомпоновщикНастроек.Настройки;
        
        
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        
        МакетКомпоновки = КомпоновщикМакета.Выполнить(ОбъектОтчет.СхемаКомпоновкиДанных,Настройки);
        
        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
        
            //Очищаем поле табличного документа
        Результат = ЭтотОбъект.Результат;
        Результат.Очистить();


    ////
    Если ЭтотОбъект.ОтборНоменклатуры = ИСТИНА Тогда
        Настройки.Структура[0].Структура[0].Структура[0].Использование = ИСТИНА;
        Настройки.Выбор.Элементы[6].Использование = ИСТИНА;   //СУММА
        Настройки.Выбор.Элементы[4].Использование = ЛОЖЬ;
    ИначеЕсли ЭтотОбъект.ОтборНоменклатуры = ЛОЖЬ Тогда
        Настройки.Структура[0].Структура[0].Структура[0].Использование = ЛОЖЬ;
        Настройки.Выбор.Элементы[6].Использование = ИСТИНА;     //СУММА
        Настройки.Выбор.Элементы[4].Использование = ЛОЖЬ;
    КонецЕсли;
    
    Пр_ДатаПо = Настройки.ПараметрыДанных.Элементы[0];
    Пр_ДатаС = Настройки.ПараметрыДанных.Элементы[1];
    
    От_Организация = Настройки.Отбор.Элементы[0];
    От_Контрагент = Настройки.Отбор.Элементы[1];
    От_Номенклатура = Настройки.Отбор.Элементы[2];
    
    Если ЭтаФорма.НачПериода = Дата('00010101') Тогда
        Пр_ДатаС.Значение = Дата('00010101');
        Пр_ДатаС.Использование = Истина;    
    Иначе
        Пр_ДатаС.Значение = НачалоДня(НачПериода);
        Пр_ДатаС.Использование = Истина;    
    КонецЕсли;
    
    Если ЭтаФорма.КонПериода = Дата('00010101') Тогда
        Пр_ДатаПо.Значение = Дата('22220101');
        Пр_ДатаПо.Использование = Истина;  
    Иначе
        Пр_ДатаПо.Значение = КонецДня(КонПериода);
        Пр_ДатаПо.Использование = Истина;    
    КонецЕсли;
    
    Если ПустаяСтрока(Отчет.СписокНоменклатуры) Тогда
        От_Номенклатура.Использование = Ложь;
    Иначе
        От_Номенклатура.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
        От_Номенклатура.ПравоеЗначение = Отчет.СписокНоменклатуры;
        От_Номенклатура.Использование = Истина;
    КонецЕсли;
    
    Если ПустаяСтрока(Отчет.Контрагент) Тогда
        От_Контрагент.Использование = Ложь;                    
    Иначе
        От_Контрагент.ПравоеЗначение = Отчет.Контрагент;          
        От_Контрагент.Использование = Истина;
    КонецЕсли;
    
    Если ПустаяСтрока(Отчет.Организация) Тогда
        От_Организация.Использование = Ложь;  
    Иначе
        От_Организация.ПравоеЗначение = Отчет.Организация;
        От_Организация.Использование = Истина;  
    КонецЕсли;  
    
    Настройки.ПараметрыВывода.Элементы[11].Значение = "Оплаченные за период с " + Формат(НачПериода, "ДЛФ=DD") + " по " + Формат(КонПериода, "ДЛФ=DD");
    Настройки.ПараметрыВывода.Элементы[11].Использование = ИСТИНА;
    Настройки.ПараметрыВывода.Элементы[10].Значение = ИСТИНА;

        
        ///
        
        
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

        ПроцессорВывода.УстановитьДокумент(Результат);
        
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

        
        ЗначениеВРеквизитФормы(ОбъектОтчет, "Отчет");


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

КонецПроцедуры

&НаКлиенте
Процедура ПолеВыбора1ПриИзменении(Элемент)
    ПолеВыбора1ПриИзмененииНаСервере();
КонецПроцедуры
2 kort-kort
 
19.12.14
11:48
P.S.

Смотреть только условие  
ИначеЕсли ЭтаФорма.ПолеВыбора1 = "Оплаченые" Тогда     // УСТАНОВКА СКД ОПЛАЧЕННЫЕ

Тренируюсь на этом условии
3 Cube
 
19.12.14
11:51
А что, поиск для слабаков?

v8: Использование нескольких схем в СКД
4 Любопытная
 
19.12.14
11:52
(3) а ты читал? Там вроде ответа не нашли
5 Cube
 
19.12.14
11:53
(4) Я там даже писал :)
6 kort-kort
 
19.12.14
11:56
Все это уже пробывал..не помогает
7 kort-kort
 
19.12.14
11:56
дело в том, что в обычной форме все работает
8 Cube
 
19.12.14
11:57
(7) Я знаю :)
Я в 1С написал письмо с ошибкой 28.08.2012 - ответа нет до сих пор :) Может им напомнить? :)
9 Cube
 
19.12.14
12:00
+(8) А, нет, ответили!)))

Ответ пришел 15.10.2013:

Ответ от разработчиков:
Не ошибка. При использовании не основной схемы компоновки данных нужно переопределять событие ПриКомпопоновкеРезультата, в котором формировать отчет.
Для редактирования настроек нужно правильно инициализировать компоновщик настроек. См. статью ИТС http://its.1c.ru/db/metod81#content:3480:1
10 kort-kort
 
19.12.14
12:01
я уже все форумы и сайты и мануалы облазил....все меняется..кроме доступных полей...
11 kort-kort
 
19.12.14
12:02
спасибо)). попробую понять, что гуру  1с написали)
12 Любопытная
 
19.12.14
12:03
(9) а вот нефиг в формах заниматься формированиями отчетов. Правильно
13 kort-kort
 
19.12.14
12:03
http://hkar.ru/xhZe
скрин
Ошибка? Это не ошибка, это системная функция.