Здравствуйте, товарищи - специалисты.
У меня возникли трудность с выводом картинки на печатную форму.
На основе ПолучениеКартинки , я попытался решить данную задачу.
Не получилось.
Возможно я чего то упускаю.
Подскажите пож-та. Ниже выкладаю код запроса.
&НаКлиенте
Процедура Печать(Команда)
ТД = ПечатьПЛ();
КонецПроцедуры
&НаСервере
Функция ПечатьПЛ()
ТабДок = Новый ТабличныйДокумент;
Макет = Обработки.ПрайсЛист.ПолучитьМакет("Макет");
Товары = Макет.ПолучитьОбласть("Данные");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование,
| ВЫБОР
| КОГДА ЦенаПродажиСрезПоследних.ТипТорговли = ЗНАЧЕНИЕ(Перечисление.ТипТорговли.Оптовая)
| ТОГДА ЦенаПродажиСрезПоследних.ЦенаПродажи
| ИНАЧЕ 0
| КОНЕЦ КАК ЦенаОптовая,
| ВЫБОР
| КОГДА ЦенаПродажиСрезПоследних.ТипТорговли = ЗНАЧЕНИЕ(Перечисление.ТипТорговли.Розничная)
| ТОГДА ЦенаПродажиСрезПоследних.ЦенаПродажи
| ИНАЧЕ 0
| КОНЕЦ КАК ЦенаРозничная,
| Номенклатура.ТипПродукции.Картинка.Файл КАК ТипПродукцииКартинкаФайл,
| Номенклатура.Фирма КАК Фирма,
| Номенклатура.ТипПродукции КАК ТипПродукции,
| Номенклатура.Размер КАК Размер,
| Номенклатура.Артикуль КАК Артикуль
|ИЗ
| РегистрСведений.ЦенаПродажи.СрезПоследних КАК ЦенаПродажиСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО ЦенаПродажиСрезПоследних.Продукция = Номенклатура.Ссылка";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Товары.Параметры.Заполнить(Выборка);
Данные = Выборка.ТипПродукцииКартинкаФайл.Получить();
Если ТипЗнч(Данные) = Тип("Картинка") Тогда
лкКартинка = Данные;
ИначеЕсли ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
лкКартинка = Новый Картинка(Данные, Ложь);
КонецЕсли;
Для каждого ТекРисунок из Товары.Рисунки Цикл
Если ТекРисунок.Имя = "КартинкаТовара" Тогда
ТекРисунок.Картинка = лкКартинка;
КонецЕсли;
КонецЦикла;
ТабДок.Вывести(Товары);
КонецЦикла;
Возврат ТабДок;
КонецФункции
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ХЗ = Новый ХранилищеЗначения(Выборка.ТипПродукцииКартинкаФайл);
Данные = ХЗ.Получить();
Если ТипЗнч(Данные) = Тип("Картинка") Тогда
лкКартинка = Новый Картинка(Данные, Ложь);
КонецЕсли;
Если ТипЗнч(Данные) = Тип("ХранилищеЗначения") Тогда
лкКартинка1 = Новый Картинка(лкКартинка);
КонецЕсли;
//мРис = Товары.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
//мРис.Картинка = лкКартинка1;
//мРис.РазмерКартинки = РазмерКартинки.Пропорционально;
Для Каждого ТекРисунок Из Товары.Рисунки Цикл
Если ТекРисунок.Имя = "КартинкаТовара" Тогда
ТекРисунок.Картинка = лкКартинка1;
ТекРисунок.РазмерКартинки=РазмерКартинки.Пропорционально;
КонецЕсли;
КонецЦикла;
Товары.Параметры.Заполнить(Выборка);
КонецЦикла;
Возврат ТабДок;
Показать
Сделал так, ошибок нет, но результат печати - пустой.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Товары.Параметры.Заполнить(Выборка);
ХЗ = Новый ХранилищеЗначения(Выборка.ТипПродукцииКартинкаФайл);
Данные = ХЗ.Получить();
Если ТипЗнч(Данные) = Тип("Картинка") Тогда
лкКартинка = Новый Картинка(Данные);
Иначе
лКартинка = Данные
КонецЕсли;
Если НЕ лКартинка = Неопределено Тогда
Для Каждого ТекКартинка Из Товары.Рисунки Цикл
Если ТекКартинка.Имя = "КартинкаТовара" Тогда
Попытка
ТекКартинка.Картинка = лКартинка;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ТабДок.Вывести(Товары);
КонецЦикла;
Показать
{Обработка.ПрайсЛист.Форма.Форма.Форма(56)}: Ошибка при установке значения атрибута контекста (Картинка): Несоответствие типов
(17)Я создал табличную часть и запрос хочу для начала вывести данные в табличной части, а потому уже заняться печатью.
У меня проблема в том, что я не могу получить картинку из хранилища.
ХЗ = Новый ХранилищеЗначения(Выборка.ТипПродукцииКартинкаФайл);
Данные = ХЗ.Получить();
Какой тип данных у вас в результате запроса Выборка.ТипПродукцииКартинкаФайл ?
P.S.
Меня терзают смутные сомнения, вы нечто-помещаете в хранилище, и тут же из него это нечто получаете.
(25) ну, - это вообще у тебя ссылка на справочник.
Судя по всему, в этом справочнике, есть реквизит "файл", с типом хранилище значения.
Вот именно оттуда тебе надо получить двоичные данные, и сделать из них картинку
ДД = ВыборкаДетальныеЗаписи.Картинка.Файл.Получить();
Картинка = Новый Картинка(ДД);
P.S.
Причем не факт, что картинка именно там расположена...в типовых, там еще много вариаций может быть в зависимости от настроек, и в регистре сведений, и вообще в томах на диске.
так у тебя даже в отладчике, ссылка пустая..откуда картинке материализоваться то.
ну и прочитай мой постскриптум...
ты должен быть уверен, что в твоих выгребаемых данных вообще картинка присутствует. Она может хранится в другом месте.
Если вдруг кому интересно решение:
При условии, что у Вас в реквизите с типом "ХранилищеЗначения" точно записана картинка, то примерный код у меня вышел вот такой:
// Проверям наличие данных в реквизите с типом ХранилищеЗначения
// Если данных нет, берем из макета область без картинки, если есть, берем область с расположенной на ней пустой картинкой.
ЕстьШапкаДокумента = ЛОЖЬ;
Если НЕ ДанныеДокументов.Организация.ФайлШапкаДокументов.Получить() = Неопределено Тогда
Область_Шапка = Макет.ПолучитьОбласть("Шапка_ШапкаДокумента");
ЕстьШапкаДокумента = ИСТИНА;
Иначе
Область_Шапка = Макет.ПолучитьОбласть("Шапка");
КонецЕсли;
// Если картинка была, то выводим ее из двоичных данных в макет в объект картинки с именем "ШапкаДокумента"
Если ЕстьШапкаДокумента Тогда
ВремКартинка = Новый Картинка(ДанныеДокументов.Организация.ФайлШапкаДокументов.Получить() ,ИСТИНА);
Область_Шапка.Рисунки.ШапкаДокумента.Картинка = ВремКартинка;
КонецЕсли;