Имя: Пароль:
1C
 
УФ. Вывод картинки номенклатуры в отчете на СКД
0 Max Street
 
18.02.16
11:31
Привет.

Есть готовый отчет "ПрайсЛист", в котором для каждой строки рядом с номенклатурой выводится соответствующая картинка. Алгоритм вывода картинки находится в процедуре ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

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

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

Процедура ВывестиИзображениеЭлементаНоменклатуры(ТД, ЭлементСправочника, Область, ШиринаКолонкиИзображения)
    
    Если ЭлементСправочника.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
        СтуктураРег = РегистрыСведений.ПрисоединенныеФайлы.Получить(Новый Структура("ПрисоединенныйФайл", ЭлементСправочника));
        ДанныеКартинки = СтуктураРег.ХранимыйФайл.Получить();
    Иначе
        ДанныеКартинки = ?(ЗначениеЗаполнено(ЭлементСправочника.Том.ПолныйПутьWindows), ЭлементСправочника.Том.ПолныйПутьWindows, ЭлементСправочника.Том.ПолныйПутьLinux)
        + ЭлементСправочника.ПутьКФайлу;
    КонецЕсли;
    Рисунок = ВывестиИзображениеВОбластиТД(ДанныеКартинки, ТД, Область);
    Область.АвтоВысотаСтроки = Ложь;
    Область.ВысотаСтроки = ШиринаКолонкиИзображения * 1.31 / 0.3759;
    Область.Расшифровка = ЭлементСправочника;
    Рисунок.ЦветЛинии = Область.ЦветРамки;
    
КонецПроцедуры

Функция ВывестиИзображениеВОбластиТД(ДанныеКартинки, ТД, Область)
    
    Изображение = ТД.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    Изображение.РазмерКартинки = РазмерКартинки.АвтоРазмер;
    Индекс = ТД.Рисунки.Индекс(Изображение);
    ТД.Рисунки[Индекс].Картинка = Новый Картинка(ДанныеКартинки, Истина);
    ТД.Рисунки[Индекс].Расположить(Область);
    
    Возврат ТД.Рисунки[Индекс];
    
КонецФункции

Функция ВернутьЗначениеПараметраНастройкиСКД(КоллекцияЭлементовНастройки, ИмяНастройки, ЗначениеПоУмолчанию = Неопределено)
    
    Настройка = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяНастройки);
    Если Настройка = Неопределено Тогда
        Возврат ЗначениеПоУмолчанию;
    КонецЕсли;
    НастрокаПоИД = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Настройка.ИдентификаторПользовательскойНастройки);
    Если НастрокаПоИД = Неопределено Тогда
        Возврат ЗначениеПоУмолчанию;
    Конецесли;
    Если Не ЗначениеЗаполнено(НастрокаПоИД.Значение) Тогда
        Если Не ЗначениеПоУмолчанию = Неопределено Тогда
            НастрокаПоИД.Значение = ЗначениеПоУмолчанию;
        КонецЕсли;
    КонецЕсли;
    
    Возврат ?(НастрокаПоИД.Использование, НастрокаПоИД.Значение, ЗначениеПоУмолчанию);
    
КонецФункции


Проблема в том, что строки, содержащие картинки, опускаются в самый низ отчета, т.е. выводятся последними строками отчета.
Помогите, пожалуйста, это исправить
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший