Версия для печати темы (https://pro1c.org.ua/index.php?s=14e1cbb27b14aabd9c319b7f8b5e5c8a&showtopic=67501)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Фото в отчете номенклатуры

Автор: burza 08.03.24, 10:10

Здравствуйте. Задача стоит вывести всю номен с ее фото в отчет. У меня ошибка где-то . Когда вывожу один товар всё ок, а когда все то картинка растягиваеться на всю номен а не отдельно на каждую строку.Что не так подскажите?

Запрос

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Номенклатура.ФайлКартинки КАК ФайлКартинки
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.КатегорияНоменклатуры.Родитель.Наименование = &Наименование

И сам модуль
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // отключаем стандартный вывод отчета - будем выводить программно         
    Настройки = КомпоновщикНастроек.Настройки;// Получаем настройки отчета  
    
    //ketr
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
    
    ПараметрПериод = НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаОстатка"));
    Если ПараметрПериод <> Неопределено
        И ПараметрПериод.Использование
        И ЗначениеЗаполнено(ПараметрПериод.Значение) Тогда
        
        ПараметрПериод.Значение = КонецДня(ПараметрПериод.Значение);
    КонецЕсли;

     ПараметрыОтчета = ПодготовитьПараметрыОтчета(НастройкиОтчета);

    //ketr
    
    
    // Устанавливаем настройки отбора в соответствии с пользовательскими настройками
    ТаблицаОтборов = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
    Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл        
        НайденнаяПользовательскаяНастройка =
            ТаблицаОтборов.Найти(ЭлементОтбора.ИдентификаторПользовательскойНастройки);        
        Если НайденнаяПользовательскаяНастройка <> Неопределено Тогда
            ЭлементОтбора.ВидСравнения = НайденнаяПользовательскаяНастройка.ВидСравнения;
            ЭлементОтбора.Использование = НайденнаяПользовательскаяНастройка.Использование;
            ЭлементОтбора.ПравоеЗначение = НайденнаяПользовательскаяНастройка.ПравоеЗначение;
        КонецЕсли;        
    КонецЦикла;
    
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; // Создаем данные расшифровки             
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; // Создаем компоновщик макета        
    // Инициализируем макет компоновки используя схему компоновки данных
    // и созданные ранее настройки и данные расшифровки
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
    
    // Скомпонуем результат
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ДокументРезультат.Очистить();
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);    
    //....
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    

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

                        КонецЕсли;
                                            
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;              
        КонецЦикла;  
        
        Если Рисунок <> Неопределено  Тогда
            ТекОбласть = ДокументРезультат.Область(стПерв, Кл, Ст-1,Кл);
            Если  Ст - стПерв = 1 Тогда
                ТекОбласть.ВысотаСтроки = 20.5*9;
            Иначе
                ТекОбласть.ВысотаСтроки = 20.5*9/ (Ст - стПерв);
            КонецЕсли;
            
            Рис = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
            Рис.РазмерКартинки = РазмерКартинки.Пропорционально;
            Рис.Картинка = Рис1;
            Рис.Расположить(ТекОбласть);
        КонецЕсли;

    КонецЦикла;
            
КонецПроцедуры

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


burza @ Сегодня, 10:01 * ,
сам отчет https://pro1c.org.ua/redirect.php?https://dropmefiles.com.ua/ua/zN8hv52w

Автор: burza 08.03.24, 12:17

burza @ Сегодня, 10:10 * ,
Никто не знает?))

Автор: alex_shkut 19.03.24, 15:13

burza @ 08.03.24, 12:17 * ,
Знает:
Для ячейки справа от Номенклатура определите имя: ОбластьКартинка, всуньте туда свою картинку.
За размеры пока не парьтесь - потом подгоните.

ЭтикеткаОбласть         = Макет.ПолучитьОбласть("Шапка|Столбец");
ОбластьКартинка            = ЭтикеткаОбласть.Области.ОбластьКартинка;
РисунокКартинка            = ЭтикеткаОбласть.Рисунки.Изображение;

РисунокКартинка.Расположить(ОбластьКартинка);

Если НЕ СтрокаИзСписка.Номенклатура.ОсновноеИзображение.Пустая() Тогда
        ЭтикеткаОбласть.Рисунки.Изображение.Картинка = СтрокаИзСписка.Номенклатура.ОсновноеИзображение.Хранилище.Получить();
Иначе
    ЭтикеткаОбласть.Рисунки.Изображение.Картинка = мПустаяКартинка;
КонецЕсли;


Думаю, разберетесь... В свойствах Картинки на макете ставь Пропорционально.

burza @ 08.03.24, 12:17 * ,
Я бы не парился с СКД ради такого отчета, но все же:
ТекОбласть = ДокументРезультат.Область(стПерв, Кл, Ст-1,Кл);


попробуйте заменить на:
ТекОбласть = ДокументРезультат.Область(ОбластьКартинки);


Вы растягиваете область изображения на всю высоту отчета, а надо создавать отдельную область для каждой строки.
Там еще будут приколы, но мы разберемся...

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua