Имя: Пароль:
1C
1С v8
СКД При компоновке результата
0 1c_yeah
 
14.05.14
11:10
Добрый день всем! Кто знает почему так происходит. Сам не смог разобраться.  Создаю отчет с помощью СКД и в событии отчета указанном в теме программно компоную результат, но при выполнении компоновки макета параметры содержат значения по умолчанию ("дата" - пустая , "вид цен" - пустая ссылка), хотя в форме отчета эти параметры заполнены другими значениями. Если выполнять стандартную обработку то параметры заполнены верно. Код ниже. Всем заранее спасибо!


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;      
    
    КомпНастр = КомпоновщикНастроек.Настройки;
    
    ВидЦен = КомпНастр.ПараметрыДанных.Элементы.Найти("ВидыЦен");
    ВидЦен.Значение = Справочники.ВидыЦен.НайтиПоНаименованию("Дилерская");
    
    КомпНастр.ПараметрыДанных.Элементы.Найти("Период").Значение = '20140101';
    
    ДокументРезультат.Очистить();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпНастр, ДанныеРасшифровки);
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    ПолеПоКоторомуНеобходимоПолучитьЗначение = "Номенклатура";
    ПроцессорВывода.НачатьВывод();
    Пока Истина Цикл
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
        Если ЭлементРезультата = Неопределено Тогда
            Прервать;
        КонецЕсли;    
        
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
            ЗначениеВыводимыхДанных = Неопределено;
            Для каждого ЗначениеПараметра из ЭлементРезультата.ЗначенияПараметров Цикл
                Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
                    ПоляРасшифровки = ДанныеРасшифровки.Элементы[ЗначениеПараметра.Значение].ПолучитьПоля();
                    Для Каждого ПолеРасшифровки из ПоляРасшифровки Цикл
                        Если ПолеРасшифровки.Поле = ПолеПоКоторомуНеобходимоПолучитьЗначение Тогда
                            ЗначениеВыводимыхДанных = ПолеРасшифровки.Значение;
                            Прервать;
                        КонецЕсли;    
                    КонецЦикла;    
                КонецЕсли;    
            КонецЦикла;    
            
            Если ЗначениеЗаполнено(ЗначениеВыводимыхДанных) Тогда
                //ВысотаТабДок = ДокументРезультат.ВысотаТаблицы;
                //_________ФОТО___НОМЕНКЛАТУРЫ__________________
                ОбластьДляКартинки = ДокументРезультат.НайтиТекст("%Картинка%");
                Если ОбластьДляКартинки <> Неопределено Тогда
                    ФотоНоменклатурыВыборка = РегистрыСведений.ПрисоединенныеФайлы.Выбрать(Новый Структура("ПрисоединенныйФайл", ЗначениеВыводимыхДанных.ФайлКартинки));
                    Если ФотоНоменклатурыВыборка.Следующий() Тогда
                        ФотоНоменклатуры = Новый Картинка(ФотоНоменклатурыВыборка.ХранимыйФайл.Получить());
                    Иначе
                        ФотоНоменклатуры = Неопределено;
                    КонецЕсли;
                    Если Не ФотоНоменклатуры = Неопределено Тогда
                        Рис = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
                        Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                        Индекс = ДокументРезультат.Рисунки.Индекс(Рис);
                        
                        ДокументРезультат.Рисунки[Индекс].Картинка = ФотоНоменклатуры;
                        ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.АвтоРазмер;
                        ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьДляКартинки);    
                        ОбластьДляКартинки.Текст = "%КартинкаДобавлена%"
                    Иначе
                        //ДокументРезультат.Рисунки[Индекс].Картинка = БиблиотекаКартинок.Справка;
                        //ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                        //ДокументРезультат.Рисунки.Удалить(ДокументРезультат.Рисунки[Индекс]);    
                        ОбластьДляКартинки.Текст = "";
                    КонецЕсли;
                КонецЕсли;
                
                //_________ФОТО___УПАКОВКИ__________________
                ОбластьДляКартинки = ДокументРезультат.НайтиТекст("%КартинкаУпаковки%");
                Если ОбластьДляКартинки <> Неопределено Тогда
                    Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
                                          |    ПрисоединенныеФайлы.ХранимыйФайл
                                          |ИЗ
                                          |    РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
                                          |ГДЕ
                                          |    ВЫРАЗИТЬ(ПрисоединенныеФайлы.ПрисоединенныйФайл КАК Справочник.НоменклатураПрисоединенныеФайлы).ВладелецФайла = &Номенклатура
                                          |    И ВЫРАЗИТЬ(ПрисоединенныеФайлы.ПрисоединенныйФайл КАК Справочник.НоменклатураПрисоединенныеФайлы).Наименование ПОДОБНО ""Короб%""");
                Запрос.УстановитьПараметр("Номенклатура", ЗначениеВыводимыхДанных);
                ФотоУпаковкаВыборка  =  Запрос.Выполнить().Выбрать();
                    Если ФотоУпаковкаВыборка.Следующий() Тогда
                        ФотоУпаковки = Новый Картинка(ФотоУпаковкаВыборка.ХранимыйФайл.Получить());
                    Иначе
                        ФотоУпаковки = Неопределено;
                    КонецЕсли;
                    Если Не ФотоУпаковки = Неопределено Тогда
                        Рис = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
                        Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                        Индекс = ДокументРезультат.Рисунки.Индекс(Рис);
                        
                        ДокументРезультат.Рисунки[Индекс].Картинка = ФотоУпаковки;
                        ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.АвтоРазмер;
                        ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьДляКартинки);    
                        ОбластьДляКартинки.Текст = "%КартинкаДобавлена%"
                    Иначе
                        //ДокументРезультат.Рисунки[Индекс].Картинка = БиблиотекаКартинок.Справка;
                        //ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                        //ДокументРезультат.Рисунки.Удалить(ДокументРезультат.Рисунки[Индекс]);    
                        ОбластьДляКартинки.Текст = "";
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;    
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
1 1c_yeah
 
14.05.14
11:13
В данном коде для отладки пока принудительно задаю параметры!
2 1c_yeah
 
14.05.14
12:25
Неужели нет выхода?)
3 fisher
 
14.05.14
14:14
Если форма управляемая, то пользователь работает не с
КомпоновщикНастроек.Настройки
а с
КомпоновщикНастроек.ПользовательскиеНастройки
Получить настройки для компоновщика макета с учетом пользовательских настроек можно методом КомпоновщикНастроек.ПолучитьНастройки()
4 1c_yeah
 
14.05.14
15:01
(3)  То что надо, Спасибо огромное! Я уже начал делать велосипед

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