Отчет по товарам на складах с Изображениями номенклатуры (пример, как вывести картинку СКД)

Опубликовал L M (lm-alex) в раздел Программирование - Практика программирования

Маленький пример, как вывести изображение номенклатуры в отчет СКД

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

Условия:

  1. В запросе всегда выводим поле Основное изображение из Номенклатуры,

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

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

                Рисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;
                Рисунок.ВыводитьНаПечать = Истина;
 
                Рисунок.Расположить(Область.ТекущаяОбласть);
 
                ТабДок.ВставитьОбласть(Область.ТекущаяОбласть,ТабДок.Область("R"+Формат(с,"ЧГ=0")+"C"+Формат(к,"ЧГ=0")));
 
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецЕсли;
 
//************************

Думаю тут все понятно, из элементов формы обрабатываем только Даты, в параметры.

Настроить макет просто: В макетах в СКД выбираем добавить макет поля, выбираем ячейку и добавляем только один параметр в расшифровку как называется у нас поле в запросе с изображением, на картинке видно.


(Бывает глючит: тогда делаем поле тип не "Текст", а "Параметр" и задаем одинаковое имя для "Параметра" и "Параметра расшифровки". По умолчанию он напишет : Представление(ИмяПараметра)) стираем Представление и меняем тип поля на Текст и остается только один параметр Расшифровки.

В настройках всегда используем рядом с номенклатурой поле изображения.

Ну вот как то так.

PS: Эта публикация полностью бесплатна и свободна, т.к. это не готовый продукт, а простой пример решения задачи

Всем удачной работы.

от 20.04.2012 - По просьбе одного из участников форума, была добавлена функция открытия изображения по клику.

Скачать файлы

Наименование Файл Версия Размер
Отчет по товаром с изображением (небольшой пример)
.erf 20,08Kb
20.04.12
189
.erf 20,08Kb 189 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Антон (anton.fly7) 134 21.10.11 16:53 Сейчас в теме
2. Fomix (fomix) 21 24.10.11 12:52 Сейчас в теме
Большое спасибо за пример отчета. Все получилось! Пример рабочий 100%.
3. L M (lm-alex) 126 24.10.11 13:47 Сейчас в теме
4. Fomix (fomix) 21 24.10.11 17:33 Сейчас в теме
Пытаюсь самостоятельно создать произвольный отчет из справочника Номенклатура (номенклатура+фото). Схема готова, но при создании поля в макете картинка параметра отличается от той, что в вашем отчете. Вместо прочерка стоит "лупа". Все перепробовал не получается! См. приложение.
При попытке поменять запрос в вашем отчете, запрашивает пароль на модуль. Он почему-то с паролем! А что там может такого быть... не пойму! Спасибо за ответ!
Прикрепленные файлы:
5. L M (lm-alex) 126 24.10.11 17:40 Сейчас в теме
Пароль?! Странно.. вообще там нет в модуле ничего, но пароль и вправду был, снял. могу кинуть на мыло файл...
На счет этой ошибки я описывал ситуацию...
Надо сначала сделать вывод ячейки Параметр и Задать имя параметра и параметра расшифровки например "ОсновноеИзображение", в выражении что у вас на картинке указываем Поле от куда будет заполняться параметр..
тк имена совпадают он будет одной строчкой... потом меняем вывод обратно на текст и получится как у меня... Не понимаю почему так надо делать, возможно какой то глюк платформы.
6. Fomix (fomix) 21 25.10.11 09:43 Сейчас в теме
Да уж! Шаманство помогло. Смог самостоятельно сделать простой отчет. Еще раз спасибо!
7. L M (lm-alex) 126 25.10.11 09:45 Сейчас в теме
Пожалуйста.
Не без этого,пришлось голову поломать, а так в принципе все просто.)
8. Nick K (Nick5k) 26.10.11 10:56 Сейчас в теме
Скачать пока рейтинга не хватает, если можно выслать на мейл nick5k@mail.ru
9. Андрей Сериков (sai-2010) 31.10.11 09:43 Сейчас в теме
Спасибо автору!
Отличная обработка!
Все посто и красиво.
Спасибо
10. Алексей (AlexeyK1) 14 12.12.11 11:08 Сейчас в теме
lm-alex пишет:
На счет этой ошибки я описывал ситуацию...
Надо сначала сделать вывод ячейки Параметр и Задать имя параметра и параметра расшифровки например "ОсновноеИзображение", в выражении что у вас на картинке указываем Поле от куда будет заполняться параметр..
тк имена совпадают он будет одной строчкой... потом меняем вывод обратно на текст и получится как у меня... Не понимаю почему так надо делать, возможно какой то глюк платформы.


понять бы в чем причина такого шаманства потому что на 8.2 так же приходится шаманить
12. L M (lm-alex) 126 13.01.12 16:44 Сейчас в теме
13. Evgeniy (Evgeniy) 80 25.02.12 13:42 Сейчас в теме
Думал только мне не повезло с извращенцами, которые хотят продажи видеть с картинками товаров, а нет.
Таких индивидуумов хватает:)

Автор спасибо за труд.
За 10 минут осилил отчет с картинками, на примере твоего шаблона.
14. L M (lm-alex) 126 27.02.12 16:10 Сейчас в теме
за 6 Лет на рынке с франчами и не такое повидаешь...)) Всегда пожалуйста. Пользуйтесь на здоровье.
15. admin admin (master-adm) 18.04.12 10:14 Сейчас в теме
(3) lm-alex, киньте ссылку отчета на мэйл master-adm@mail.ru, пробую ваш сценарий на 1c 8.2, ругани платформы нет, но и не выводит картинку
16. BobaG (bobaG) 62 16.05.12 13:49 Сейчас в теме
17. treblinka (Tomy82) 16.05.12 13:52 Сейчас в теме
lm-alex, ЧЕЛОВЕЧИЩЕ!
СПАСИБО, ДРУГ, ЗА ЭТОТ КОММЕНТАРИЙ!
ТЫ ДАЖЕ НЕ ПРЕДСТАВЛЯЕШЬ КАК ТЫ ПОМОГ ЧЕЛОВЕЧЕСТВУ В ЛИЦЕ МЕНЯ! :)
Настроить макет просто: В макетах в СКД выбираем добавить макет поля, выбираем ячейку и добавляем только один параметр в расшифровку как называется у нас поле в запросе с изображением, на картинке видно. (Бывает глючит: тогда делаем поле тип не Текст а параметр и задаем одинаковое имя Параметра и Параметра расшифровки, по умолчанию он напишет : Представление(ИмяПараметра)) стираем Представление и меняем тип поля на Текст и остается только один параметр Расшифровки.

Я два дня не могу понять почему не получается!
сначала на своём примере - думал, сам туплю! потом накачал кучу отчётов с выводом картинки - убиваю макеты, сам делаю макет, опять не получается!
заметил, что иконки разные в "Параметры макета" "Имя параметра" - но не думал, что в них дело!
Причём один тестовый отчёт как-то получился, но сам дурак - не просёк в чём дело и где копать!

Спасибо тебе, коллега! удачи и успехов!
Ваще мега помог!
не могу сдержать эмоций!

если кому-то потребуется - у меня глюкнуло на Вин7 Проф, 8.2.15.301, 11.0.7.21, файловый вариант

сейчас проверил - всё алле зер гут!
18. L M (lm-alex) 126 16.05.12 14:08 Сейчас в теме
Бывает)) 1С Волшебная программа..
Всегда рад стараться! Спасибо за комментарии)
19. Петр Мамонов (pedroo) 27.08.12 01:05 Сейчас в теме
20. Петр Мамонов (pedroo) 28.08.12 00:44 Сейчас в теме
22. Артём В (kip989) 24.01.13 08:48 Сейчас в теме
23. jarik Vashenko (jarik1409) 20.03.13 13:34 Сейчас в теме
Доброго времени суток!У меня такой вопрос: как добавить логотип фирмы в отчет!
Извините если не по теме!!!!
24. L M (lm-alex) 126 20.03.13 14:32 Сейчас в теме
При выводе уже данных сформированных СКД, ПолеТабличногоДокумента, что на форме, не обязательно должно быть пустым. Ну вот.. Если посмотреть по коду, где выводим отчет, там есть такие строки:
Результат = ЭлементыФормы.Результат;
Результат.Очистить();

Вот после этого можно вставить логотип в Результат.
Создайте макет, на нем создайте область, туда вставьте рисунок и его выводить в при формировании отчета.
Как то так:
Результат.Вывести(ПолучитьМакет("МакетЛоготип").ПолучитьОбласть("ОблЛоготип"));
25. jarik Vashenko (jarik1409) 20.03.13 15:24 Сейчас в теме
(24) lm-alex, Спасибо! А увас нету примерчика такого отчета?
26. L M (lm-alex) 126 20.03.13 15:33 Сейчас в теме
Сейчас на этом примере сделаю.
27. jarik Vashenko (jarik1409) 20.03.13 15:35 Сейчас в теме
28. L M (lm-alex) 126 20.03.13 15:54 Сейчас в теме
29. Микола Любарський (Agnat7) 26.03.13 17:26 Сейчас в теме
Доброго времени суток! Скиньте пожалуйста свой пример (Отчет по товарам на складах с Изображениями номенклатуры) в личку.
Agnat@mail.ru(28) lm-alex,
30. Константин (pikos) 31.05.13 13:24 Сейчас в теме
Если можно пришлите пожалуйста отчет с выводом картинки номенклатуры на pikos@nm.ru Заранее Вам благодарен!
31. Atom74 Atom74 (Atom74) 14 25.07.13 15:35 Сейчас в теме
Если можно пришлите пожалуйста отчет с выводом картинки номенклатуры на info@atom74.com Заранее Вам благодарен!
32. Slava Ivanov (Heiton007) 09.07.14 15:18 Сейчас в теме
Пришлите пожалуйста отчет с выводом картинки на Goth007@yandex.ru
33. Evgeniy_progger_1C (Evgeniy_begin_progger) 02.09.14 13:07 Сейчас в теме
Область = ТабДок.ПолучитьОбласть("R"+Формат(с,"ЧГ=0")+"C"+Формат(к,"ЧГ=0"));
ТекОбласть = ТабДок.Область("R"+Формат(с,"ЧГ=0")+"C"+Формат(к,"ЧГ=0"));
Расшифровка = ТекОбласть.Расшифровка;

Могли бы вы пояснить, откуда параметры области вы брали?
34. Evgeniy_progger_1C (Evgeniy_begin_progger) 02.09.14 13:08 Сейчас в теме
и еще вопрос: каким образом связывается номенклатура с правильной картинкой?
35. L M (lm-alex) 126 02.09.14 13:16 Сейчас в теме
36. L M (lm-alex) 126 02.09.14 13:20 Сейчас в теме
Evgeniy_progger_1C, Картинка хратится в реквизите Основное изображение, тип Хранилище значения. А область, я проверяю все ячейки табличного документа и уже заполяняю изображения. Это конечно не самый удачный метод, но на тот момент в голову ничего больше не пришло.
37. Evgeniy_progger_1C (Evgeniy_begin_progger) 02.09.14 13:41 Сейчас в теме
А сейчас есть что-нибудь новое?
Мне нужно в СКД макет добавить ячейку с картинками номенклатуры.
Так вот у меня вопрос: можно ли реализовать добавление путем изменения только процедуры кнопки сформировать?
38. L M (lm-alex) 126 02.09.14 14:07 Сейчас в теме
(37) Evgeniy_progger_1C, Можно не переписывать процедуру Кнопки сформировать. Все выше сказанное можно заполнять в Предопределенной процедуре ПриКомпоновкеРезультата() в модуле объекта Отчета. через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Я сам не делал, не было необходимости, http://help1c.com/faq/view/1234.html - тут что то похожее, но как то сложновато, ено смысл уловить можно.
39. Evgeniy_progger_1C (Evgeniy_begin_progger) 04.09.14 09:06 Сейчас в теме
(14) lm-alex, привет! у меня такая проблема:
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Что мы получаем в качестве элемента?
Это мне важно потому, что мне нужно достать из ХранилищаЗначений картинку, вот мой код:

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

ПроцессорВывода.НачатьВывод();

Пока Истина Цикл

ЭлементРезультата = ПроцессорКомпоновки.Следующий();

Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;

ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
Если ЭлементРезультата.ЗначенияПараметров.Количество() = 0 Тогда
Продолжить;
КонецЕсли;

Для Каждого ЭлементПараметра Из ЭлементРезультата.ЗначенияПараметров Цикл
Если ТипЗнч(ЭлементПараметра.Значение) = Тип("ХранилищеЗначения") Тогда
Изображение = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Изображение.РазмерКартинки = РазмерКартинки.АвтоРазмер;
Индекс = ДокументРезультат.Рисунки.Индекс(Изображение);
ДокументРезультат.Рисунки[Индекс].Картинка = Новый Картинка(ЭлементПараметра.Значение.Получить(), Истина);
ОбластьИзображение = ДокументРезультат.Область(ДокументРезультат.ВысотаТаблицы, 2);
ОбластьИзображение.АвтоВысотаСтроки = Ложь;
ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьИзображение);
ОбластьИзображение.ВысотаСтроки = ОбластьИзображение.Примечание.Высота - ОбластьИзображение.Примечание.Верх;
КонецЕсли;

КонецЦикла;

КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();

Но почему то тип значения ХранилищеЗначения он не определяет, и только 3 типа у ЭлементПараметра.Значение: Null, Число и идентификатор расшифровки компоновки значения.

Изображение - получаю в запросе, Номенклатура.ОсновноеИзображение
40. L M (lm-alex) 126 04.09.14 10:00 Сейчас в теме
(39) Evgeniy_progger_1C, Ну если ты решил идти таким путем, то тебе надо ловить картинтку не через расшифровку, а через параметр, и тип у реквизита СправочникСсылка.ХранилищеДополнительнойИнформации - а там уже хранилище. см вложение.
Прикрепленные файлы:
41. Evgeniy_progger_1C (Evgeniy_begin_progger) 04.09.14 11:43 Сейчас в теме
(40) lm-alex, выдает ошибку, если твой отчет запускаю:
Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине:
{ВнешнийОтчет.Товары.МодульОбъекта(33)}: Ошибка при установке значения атрибута контекста (Картинка)
Изображение.Картинка = ИзображениеТовара;
по причине:
Несоответствие типов

И он в строчке
ИзображениеТовара = ЭлементПараметра.Значение.Хранилище.Получить();
не получает изображение!
42. L M (lm-alex) 126 04.09.14 12:22 Сейчас в теме
(41) Evgeniy_progger_1C, Пользуйся отладчиком!, смотри какие принимают значения переменные, на какую позицию ругается, если там вообще картинка и тд. У меня все отработало.
43. Николай Шлепин (mudrak) 29.05.15 12:44 Сейчас в теме
(41)(41) Evgeniy_progger_1C, это ругается на отсутствующую картинку, надо проверку добавить. Например так, хоть и коряво:
Если ТипЗнч(ЭлементПараметра.Значение) = Тип("СправочникСсылка.ХранилищеДополнительнойИнформации") И ЗначениеЗаполнено(ЭлементПараметра.Значение.Хранилище) И ЭлементПараметра.Значение.ИмяФайла <> "" Тогда
44. Константин Юрин (kostyaomsk) 67 16.09.15 17:45 Сейчас в теме
Одно большое спасибо за мысль
В запросе всегда выводим поле Основное изображение из Номенклатуры
сам бы точно я не додумался :)