Записать картинку из ХранилищаЗначений в файл, Управляемые формы

1. sys1c 11.12.18 18:43 Сейчас в теме
Всем привет. Нужно банально сохранить картинку на диск. Сломал мозг, прочитал кучу топиков. Что я делаю не так?
Получаю файл размером 0.
Картинка реально есть.
Конфигурация УТ 11.4, Картинки хранятся в справочнике НоменклатураПрисоединенныеФайлы, в котором насколько понимаю нужно брать реквизит "ФайлХранилище"


&НаСервере
Функция Команда1НаСервере()
	спрСсылка = справочники.Номенклатура.НайтиПоКоду("0001");
	хранилище = спрСсылка.ФайлКартинки.ФайлХранилище;
	
       АдресКартинки = ПоместитьВоВременноеХранилище(хранилище.Получить(), УникальныйИдентификатор);		
	
	возврат АдресКартинки ;
	
КонецФункции


&НаКлиенте
Процедура Команда1(Команда)
	адресКартинки = Команда1НаСервере();

	ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(адресКартинки));
	
	ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
	
	ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);

КонецПроцедуры
Показать
vld1973; acanta; +2 Ответить
По теме из базы знаний
Найденные решения
4. spacecraft 11.12.18 20:30 Сейчас в теме
(1) Используйте встроенные механизмы конфигурации.
ПрисоединенныеФайлыКлиент.... считается устаревшей в УТ11.4.
Используйте РаботаСФайлами.
Вот простой пример:
&НаКлиенте
Процедура Команда1(Команда)
	ФайлКартинки = ПолучитьСсылуФайлаКартинки();
	ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
	ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
    ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
    ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры

&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
	Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
	Возврат Номенклатура.ФайлКартинки;
КонецФункции
Показать
t278; vld1973; KoshevoyEN; qazaz2; Dimeron; segatron; SeregaSC; +7 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. spacecraft 11.12.18 20:30 Сейчас в теме
(1) Используйте встроенные механизмы конфигурации.
ПрисоединенныеФайлыКлиент.... считается устаревшей в УТ11.4.
Используйте РаботаСФайлами.
Вот простой пример:
&НаКлиенте
Процедура Команда1(Команда)
	ФайлКартинки = ПолучитьСсылуФайлаКартинки();
	ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
	ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
    ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
    ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры

&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
	Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
	Возврат Номенклатура.ФайлКартинки;
КонецФункции
Показать
t278; vld1973; KoshevoyEN; qazaz2; Dimeron; segatron; SeregaSC; +7 Ответить
5. KoshevoyEN 18.03.21 10:20 Сейчас в теме
(4)
&НаКлиенте
Процедура Команда1(Команда)
ФайлКартинки = ПолучитьСсылуФайлаКартинки();
ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры

&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
Возврат Номенклатура.ФайлКартинки;
КонецФункции
Показать



Переделал ваш способ на работу только на сервере, иначе проблемно получить все картинки.

&НаСервере
Процедура ВыгрузитьИзображения(ПутьКФайлу)
        
    Запрос = Новый Запрос;
            
        Запрос.Текст = "ВЫБРАТЬ
        |    НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка,
        |    НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.ФайлКартинки КАК ФайлКартинки
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы";
                
    ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
    
    Для Каждого Строка из ТаблицаЗначений Цикл
        Если ЗначениеЗаполнено(Строка.ФайлКартинки) Тогда
            ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Строка.ФайлКартинки);
            ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
            ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла(Строка.Расширение));
            ИзображениеНоменклатуры.Записать(ПутьКФайлу + "/" + ФайлНаДиске.Имя);
        КонецЕсли;
    КонецЦикла;
                
КонецПроцедуры
Показать
2. SlavaKron 11.12.18 20:06 Сейчас в теме
Возможно присоединенные файлы хранятся в Томах (на общей сетевой папке).
3. DarkUser 11.12.18 20:23 Сейчас в теме
Вот пример:

1. На форме списка сделан дин.список с присоединенными файлами (например при активизации строки номенклатуры выводится список присоединенных файлов).
Заполнение списка с файлами происходит отбором:
СписокФайлов.Параметры.УстановитьЗначениеПараметра("ВладелецФайлов",ТекущаяНоменклатура);


Код запроса для дин.списка с файлами примерно следующий:
ВЫБРАТЬ
	ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) КАК Ссылка,
	ЛОЖЬ КАК ПометкаУдаления,
	1 КАК ИндексКартинки,
	ВЫРАЗИТЬ("" КАК СТРОКА(150)) КАК Наименование,
	ВЫРАЗИТЬ("" КАК СТРОКА(10)) КАК Расширение,
	ВЫРАЗИТЬ("" КАК СТРОКА(500)) КАК Описание,
	ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) КАК Автор,
	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаСоздания,
	ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) КАК Отредактировал,
	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаРедактирования,
	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаИзменения,
	0 КАК Размер,
	ЛОЖЬ КАК ПодписанЭП,
	ЛОЖЬ КАК Зашифрован,
	-1 КАК НомерКартинкиПодписанЗашифрован,
	ЛОЖЬ КАК ФайлРедактируется,
	ЛОЖЬ КАК ФайлРедактируетТекущийПользователь,
	ЛОЖЬ КАК ФайлРедактируетДругойПользователь,
	НЕОПРЕДЕЛЕНО КАК Редактирует
ИЗ
	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных
Показать


Основная таблица: Справочник.ИдентификаторыОбъектовМетаданных
Динм.считывание (да)
Автозаполнение полей (да)

2. При клике на файле появляется меню в котором можно выбрать пункт Сохранить Файл. При этом вызывается следующий обработчик:

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


Это код с рабочей системы, но примеры есть и на ИТС.
6. vld1973 85 01.04.22 11:41 Сейчас в теме
Спасибо, сэкономили много времени на разбор типового кода
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот