Добрый день, возникла такая проблема.

Формируется прайс-лист с картинками формата jpg. В коде картинка сжимается в размере (чтобы красиво в строке отображалось). После чего прайс сохраняется в Excel. И при попытке увеличить картинку качество картинки ужасно плохим становится. Я помню еще с курса школы что есть растровые и векторные изображения, пытался в формате svg фотку в прайс выводить, но она даже не отображается)

Может кто сталкивался с подобной задачей и как-то решил?
---
Вот как получилось:

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

```1c
    Функция ВыгрузитьРезультатСКДПоМакету(МакетКомпоновки, ВнешниеНаборыДанных = Неопределено, ВыводВДерево = Ложь) Экспорт

    ДокументРезультат = Новый ТабличныйДокумент;

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

    //Создаем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    Если ВнешниеНаборыДанных = Неопределено Тогда
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
    Иначе
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,Истина);
    КонецЕсли;

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

    ТабличныйДокумент = Новый ТабличныйДокумент;

    Макет = ЭтотОбъект.ПолучитьМакет("МакетДляЭкселя");

    Область = Макет.ПолучитьОбласть("Шапка");
    ТабличныйДокумент.Вывести(Область);
    ТабличныйДокумент.НачатьАвтоГруппировкуСтрок();
    ОбходДереваДетально(Результат, ТабличныйДокумент, Макет); //обходим дерево рекурсивной процедурой и заполняем ТД
    ТабличныйДокумент.ЗакончитьАвтоГруппировкуСтрок();

    Возврат ТабличныйДокумент;

    КонецФункции
```

```1c
    Процедура ОбходДереваДетально(ПереданноеДер, ТабДок, Макет)

    Для Каждого Строка Из ПереданноеДер.Строки Цикл

    Если НЕ ЗначениеЗаполнено(Строка.КоллекцияНоменклатуры) Тогда
    Продолжить;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда //Если номенклатура не заполнена, считаем что это группировка
    Область = Макет.ПолучитьОбласть("Группировка");
    ЗаполнитьЗначенияСвойств(Область.Параметры, Строка, "КоллекцияНоменклатуры");
    РодительЕсть = ЗначениеЗаполнено(Строка.Родитель);
    УровеньГруппировки = ?(РодительЕсть, 2, 1);
    ТабДок.Вывести(Область, УровеньГруппировки, ?(РодительЕсть,Строка.Родитель.КоллекцияНоменклатуры, Строка.КоллекцияНоменклатуры), Истина);
    КонецЕсли;

    Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
    Область = Макет.ПолучитьОбласть("Строка");
    ЗаполнитьЗначенияСвойств(Область.Параметры, Строка);
    ДД = РаботаСФайлами.ДвоичныеДанныеФайла(Строка.Картинка,Ложь);
    Картинка = Новый Картинка(ДД);
    Область.Рисунки.D1.Картинка = Картинка;
    ТабДок.Вывести(Область, 3, Строка.Родитель.КоллекцияНоменклатуры, Истина);
    КонецЕсли;

    Если Строка.Строки.Количество()>0 Тогда

    ОбходДереваДетально(Строка, ТабДок, Макет);

    КонецЕсли;

    КонецЦикла;

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

Ну и потом на клиенте прописать сохранение таб дока в эксель файл. Таким образом картинки изначально сохраняются в размер картинки который будет в макете, а при растягивании не теряют качество.
---
Попробуй не сжимать картинку, а выводить в размере с признаком масштабирования пропорционально.
---
Так я вроде как и указываю ширину и высоту картинки
---
Кусок кода, где выводишь картинку можешь выложить?
---
```1c
    // Инициализация процессора компоновки
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборы,ДанныеРасшифровки,Истина);

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

    ПараметрВыводитьКартинки = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек.ПользовательскиеНастройки, "ВыводитьКартинки");
    ВыводитьКартинки = ПараметрВыводитьКартинки.Значение;
    Если ВыводитьКартинки Тогда
    ВывестиКартинкиВТабДок(ДокументРезультат, ДанныеРасшифровки); //Вывод картинок
    КонецЕсли;
```

И сама процедура вывода картинок:

```1c
    Процедура ВывестиКартинкиВТабДок(ДокументРезультат, ДанныеРасшифровки)

    КоличествоСтрок = ДокументРезультат.ВысотаТаблицы;
    КоличествоКолонок = ДокументРезультат.ШиринаТаблицы;

    Для СтрокаДокумента = 1 По КоличествоСтрок Цикл
    Для КолонкаДокумента = 1 По КоличествоКолонок Цикл

    Область = ДокументРезультат.Область(СтрокаДокумента,КолонкаДокумента);
    Расшифровка = Область.Расшифровка;

    Если ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
    ПоляРасшифровки = ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля();
    НайденноеПоле = ПоляРасшифровки.Найти("Картинка");
    Если НЕ НайденноеПоле = Неопределено Тогда

    ХранимыйФайл = НайденноеПоле.Значение;
    Если ТипЗнч(ХранимыйФайл) = Тип("СправочникСсылка.НоменклатураПрисоединенныеФайлы") И ЗначениеЗаполнено(ХранимыйФайл) Тогда

    ДД = РаботаСФайлами.ДвоичныеДанныеФайла(ХранимыйФайл,Ложь);
    Картинка = Новый Картинка(ДД);

    Попытка
    Размер = ДД.Размер();
    Исключение
    Размер = 0;
    Картинка = Новый Картинка;
    КонецПопытки;

    МаксимальныйРазмер = 40000;
    Если Размер > МаксимальныйРазмер Тогда
    ОбрабатываемаяКартинка = Новый ОбрабатываемаяКартинка(Картинка);
    Попытка
    Если Картинка.ПлотностьПоВертикали() >= 150 Тогда
    ОбрабатываемаяКартинка.УстановитьПлотность(72, 72);
    КонецЕсли;
    Исключение

    КонецПопытки;
    //ОбрабатываемаяКартинка.Масштабировать(Макс(10,Окр(100*МаксимальныйРазмер/Размер)));
    //Ширина = Картинка.Ширина();
    //МаксимальнаяШирина = 120;

    Высота = Картинка.Высота();
    МаксимальнаяВысота = 100;
    Попытка
    Если Высота > МаксимальнаяВысота Тогда

    ОбрабатываемаяКартинка.УстановитьРазмер(Окр(Картинка.Ширина()/Высота*МаксимальнаяВысота),МаксимальнаяВысота);
    КонецЕсли;

    //Если Ширина > МаксимальнаяШирина Тогда
    // ОбрабатываемаяКартинка.УстановитьРазмер(МаксимальнаяШирина,Окр(Картинка.Высота()/Ширина*МаксимальнаяШирина));
    //КонецЕсли;
    Картинка = ОбрабатываемаяКартинка.ПолучитьКартинку();
    Исключение

    КонецПопытки;
    КонецЕсли;

    КартинкаВДокументе = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    КартинкаВДокументе.Картинка = Картинка;
    КартинкаВДокументе.РазмерКартинки = РазмерКартинки.Пропорционально;
    //КартинкаВДокументе.ГраницаСверху = Ложь;
    //КартинкаВДокументе.ГраницаСлева = Ложь;
    //КартинкаВДокументе.ГраницаСнизу = Ложь;
    //КартинкаВДокументе.ГраницаСправа = Ложь;

    Область.ВысотаСтроки = 70;
    КартинкаВДокументе.Расположить(Область);

    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры
```
---
Я сделал тестовую обработку где сразу в эксель сохраняю. Но не с помощью СКД. Просто запрос, макет, заполнение ТД и сохранение в эксель. Картинки получаются маленькие, но их можно растягивать как угодно и качество не ухудшается. То есть размер изменился, а разрешение - нет. Только вот как теперь это в отчете реализовать, голову ломаю.

По сути путь сохранения в файл нужно на клиенте выбрать, формирование СКД это уже модуль объекта отчета, и как я понимаю мне необходимо создать свой макет и его заполнять результатом СКД, после чего сохранить сразу в эксель. Вот сижу гуглю уже несколько дней, мои знания программного СКД оставляют желать лучшего.
---
Если так, то переопределять процедуру вывода СКД, формировать по результатам эксель на сервере, а потом готовый файл кидать на клиента.
---
Если убрать вот этот кусок, где картинка жмется

```1c
    МаксимальныйРазмер = 40000;
    Если Размер > МаксимальныйРазмер Тогда
    ОбрабатываемаяКартинка = Новый ОбрабатываемаяКартинка(Картинка);
    Попытка
    Если Картинка.ПлотностьПоВертикали() >= 150 Тогда
    ОбрабатываемаяКартинка.УстановитьПлотность(72, 72);
    КонецЕсли;
    Исключение

    КонецПопытки;
    //ОбрабатываемаяКартинка.Масштабировать(Макс(10,Окр(100*МаксимальныйРазмер/Размер)));
    //Ширина = Картинка.Ширина();
    //МаксимальнаяШирина = 120;

    Высота = Картинка.Высота();
    МаксимальнаяВысота = 100;
    Попытка
    Если Высота > МаксимальнаяВысота Тогда

    ОбрабатываемаяКартинка.УстановитьРазмер(Окр(Картинка.Ширина()/Высота*МаксимальнаяВысота),МаксимальнаяВысота);
    КонецЕсли;

    //Если Ширина > МаксимальнаяШирина Тогда
    // ОбрабатываемаяКартинка.УстановитьРазмер(МаксимальнаяШирина,Окр(Картинка.Высота()/Ширина*МаксимальнаяШирина));
    //КонецЕсли;
    Картинка = ОбрабатываемаяКартинка.ПолучитьКартинку();
    Исключение

    КонецПопытки;
    КонецЕсли;
```

И добавить

```1c
    КартинкаВДокументе = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    КартинкаВДокументе.Картинка = Картинка;
    КартинкаВДокументе.РазмерКартинки = РазмерКартинки.Пропорционально;
    КартинкаВДокументе.Высота = 100;
```
---
Да я и так и так уже пробовал менять этот кусок кода. Все одинаково. После сохранения в эксель, при растягивании картинка теряет качество(
---
Вот как получилось:

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

```1c
    Функция ВыгрузитьРезультатСКДПоМакету(МакетКомпоновки, ВнешниеНаборыДанных = Неопределено, ВыводВДерево = Ложь) Экспорт

    ДокументРезультат = Новый ТабличныйДокумент;

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

    //Создаем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    Если ВнешниеНаборыДанных = Неопределено Тогда
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
    Иначе
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,Истина);
    КонецЕсли;

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

    ТабличныйДокумент = Новый ТабличныйДокумент;

    Макет = ЭтотОбъект.ПолучитьМакет("МакетДляЭкселя");

    Область = Макет.ПолучитьОбласть("Шапка");
    ТабличныйДокумент.Вывести(Область);
    ТабличныйДокумент.НачатьАвтоГруппировкуСтрок();
    ОбходДереваДетально(Результат, ТабличныйДокумент, Макет); //обходим дерево рекурсивной процедурой и заполняем ТД
    ТабличныйДокумент.ЗакончитьАвтоГруппировкуСтрок();

    Возврат ТабличныйДокумент;

    КонецФункции
```

```1c
    Процедура ОбходДереваДетально(ПереданноеДер, ТабДок, Макет)

    Для Каждого Строка Из ПереданноеДер.Строки Цикл

    Если НЕ ЗначениеЗаполнено(Строка.КоллекцияНоменклатуры) Тогда
    Продолжить;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда //Если номенклатура не заполнена, считаем что это группировка
    Область = Макет.ПолучитьОбласть("Группировка");
    ЗаполнитьЗначенияСвойств(Область.Параметры, Строка, "КоллекцияНоменклатуры");
    РодительЕсть = ЗначениеЗаполнено(Строка.Родитель);
    УровеньГруппировки = ?(РодительЕсть, 2, 1);
    ТабДок.Вывести(Область, УровеньГруппировки, ?(РодительЕсть,Строка.Родитель.КоллекцияНоменклатуры, Строка.КоллекцияНоменклатуры), Истина);
    КонецЕсли;

    Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
    Область = Макет.ПолучитьОбласть("Строка");
    ЗаполнитьЗначенияСвойств(Область.Параметры, Строка);
    ДД = РаботаСФайлами.ДвоичныеДанныеФайла(Строка.Картинка,Ложь);
    Картинка = Новый Картинка(ДД);
    Область.Рисунки.D1.Картинка = Картинка;
    ТабДок.Вывести(Область, 3, Строка.Родитель.КоллекцияНоменклатуры, Истина);
    КонецЕсли;

    Если Строка.Строки.Количество()>0 Тогда

    ОбходДереваДетально(Строка, ТабДок, Макет);

    КонецЕсли;

    КонецЦикла;

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

Ну и потом на клиенте прописать сохранение таб дока в эксель файл. Таким образом картинки изначально сохраняются в размер картинки который будет в макете, а при растягивании не теряют качество.