Имя: Пароль:
1C
1С v8
СКД фильтр по наличию картинки
0 Pchelinka
 
20.02.18
15:31
Всем привет. Помогите други пж с созданием фильтра в отчете СКД.
Вывожу номенклатуру и картинку ее вытаскиваю из папки на диске по артикулу с порядковым номером. Если картинки к номенклатуре нет, вывожу пустую картинку.Все получилось, теперь меня попросили сделать фильтр отбор где нет фото номенклатуры. Я добавляю в Вычисляемы поля "НаличиеКартинки" и хочу заполнить ее булевным значением и не получается(( подскажите как передать значение в НаличиеКартинки

Вот код, когда выводится картинка, тут же пытаюсь заполнить значение Наличие картинки:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ДокументРезультат.Очистить();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

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

                    /////    
                    Если Картинка <> Неопределено Тогда
                        ДокументРезультат.Рисунки[Индекс].Картинка = Картинка;
                    КонецЕсли;
                    
                КонецЕсли;
                
                
                ВысотаТабДок = ДокументРезультат.ВысотаТаблицы;
                ОбластьДляКартинки = ДокументРезультат.НайтиТекст("%Картинка%");
                Если ОбластьДляКартинки <> Неопределено Тогда
                    ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьДляКартинки);    
                    ОбластьДляКартинки.Текст = "%КартинкаДобавлена%";
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;    
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();
    
КонецПроцедуры
1 FIXXXL
 
20.02.18
15:37
(0) ПроцессорВывода - это уже печать результата запроса СКД
тебе в запросе Схемы надо добавить поле наличия картинки и вывести его в отбор СКД
дальше "оно само" по идее
2 Pchelinka
 
20.02.18
15:44
а ну да...но в процессе вывода у меня определяется есть картинка или ее нет..  поэтому хотела сделать доп поле и туда передать данные а потом и фильтровать... а как лучше?
3 FIXXXL
 
20.02.18
15:53
(2) ну сделай в справочнике флаг "НаличиеКартинки" и заполняй при записи элемента
а потом его выводи в запросе
4 Pchelinka
 
20.02.18
18:23
а вывести всеж таки пока значение в поле НаиличиеКартинки как можно?
НаличиеКартинки уже в этом месте имеет свое значение Да или Нет, мне нужно в отчету вывести это значение...
вот тут у меня не то:

ФильтрДляКартинки=НаличиеКартинки;
ОбластьФильтрДляКартинки=ДокументРезультат.НайтиТекст("%НаличиеКартинки%");
//ДокументРезультат.НаличиеКартинки.Расположить(ОбластьФильтрДляКартинки);    

ОбластьФильтрДляКартинки =ФильтрДляКартинки;
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший