Имя: Пароль:
1C
1С v8
Прайс-лист с картинками(зависает)
0 onetone
 
11.10.17
16:39
Прошу помощи.
Есть прайс-лист с картинками на СКД.
код вывода картинок:
ПриКомпоновкеРезультата

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

Функция ПолучитьИзображение(Номенклатура)
    
    КартинкаПоумолчанию = Неопределено;
    
    Если ТипЗнч(Номенклатура) =
            Тип("СправочникСсылка.НоменклатураПрисоединенныеФайлы") Тогда                
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ПрисоединенныеФайлы.ХранимыйФайл
        |ИЗ
        |    РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
        |ГДЕ
        |    ПрисоединенныеФайлы.ПрисоединенныйФайл = &ПрисоединенныйФайл";         
        Запрос.УстановитьПараметр("ПрисоединенныйФайл", Номенклатура);         
        Результат = Запрос.Выполнить();
        Если НЕ Результат.Пустой() Тогда
            Выборка = Результат.Выбрать();
            Выборка.Следующий(); // Получаем двоичные данные катинки
            Возврат Новый Картинка(Выборка.ХранимыйФайл.Получить(), Истина);
        Иначе // Если данные отсутствуют, получаем стандартное изображение из
              // дополнительного макета внешнего отчета
            Возврат Неопределено
        КонецЕсли;
    КонецЕсли;
    
    Возврат КартинкаПоумолчанию;
    
КонецФункции

Проблема в следующем, с недавних пор прайс стал просто зависать(возможно это связанно с увеличением картинок) пробовал подождать 3-4 часа, все равно что то формировал.

Замер производительности показывает, что все отрабатывает быстро. Весь код отрабатывается в районе 10с. то есть дальше код не выполняется, идет обработка на уровне платформы, насколько я понял.
1 Fragster
 
гуру
11.10.17
16:49
ну а закомментировать-то вывод картинки пробовал?
2 onetone
 
11.10.17
16:50
(1) Если честно, то нет. Что то не приходило в голову. Сейчас буду пробовать.
3 lodger
 
11.10.17
16:51
зачем вам 20мпих картинки в прайслисте? суйте миниатюры и ссылку на фулсайз.
4 onetone
 
11.10.17
17:03
(3) Привью то откуда брать? А ссылка там и так выводится на картинки в я.диск.
5 onetone
 
11.10.17
17:07
(3 Отдельно создать для товаров привью и его пихать в прайс?
6 onetone
 
11.10.17
20:28
(1) Без картинок все работает как надо.
7 kittystark
 
11.10.17
20:56
у тебя получается запрос на каждую картинку отдельно, по сути в цикле для каждой строки

лучше выбрать одним запросом сразу - связав левым соединением по номенклатуре и в наборе данных чтоб сидело ХранимыйФайл,  а в цикле от него уже делать ХранимыйФайл.Получить()
8 onetone
 
11.10.17
21:22
(7) Спасибо за подсказку, согласен, так быстрее будет.

Но по оптимизации там тоже беда, самая трудозатратная строчка кода:
Рис.Картинка = Рисунок;

85% времени уходить на нее из всего модуля.

3% уходить на как раз выполнение запроса.
9 onetone
 
12.10.17
23:41
В общем проблема была похоже в объема этих картинок, сделал привьюшки, по 200х100 и прайс стал формироваться очень быстро