Записать картинку из ХранилищаЗначений в файл, Управляемые формы
Всем привет. Нужно банально сохранить картинку на диск. Сломал мозг, прочитал кучу топиков. Что я делаю не так?
Получаю файл размером 0.
Картинка реально есть.
Конфигурация УТ 11.4, Картинки хранятся в справочнике НоменклатураПрисоединенныеФайлы, в котором насколько понимаю нужно брать реквизит "ФайлХранилище"
Получаю файл размером 0.
Картинка реально есть.
Конфигурация УТ 11.4, Картинки хранятся в справочнике НоменклатураПрисоединенныеФайлы, в котором насколько понимаю нужно брать реквизит "ФайлХранилище"
&НаСервере
Функция Команда1НаСервере()
спрСсылка = справочники.Номенклатура.НайтиПоКоду("0001");
хранилище = спрСсылка.ФайлКартинки.ФайлХранилище;
АдресКартинки = ПоместитьВоВременноеХранилище(хранилище.Получить(), УникальныйИдентификатор);
возврат АдресКартинки ;
КонецФункции
&НаКлиенте
Процедура Команда1(Команда)
адресКартинки = Команда1НаСервере();
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(адресКартинки));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры
ПоказатьПо теме из базы знаний
Найденные решения
(1) Используйте встроенные механизмы конфигурации.
ПрисоединенныеФайлыКлиент.... считается устаревшей в УТ11.4.
Используйте РаботаСФайлами.
Вот простой пример:
ПрисоединенныеФайлыКлиент.... считается устаревшей в УТ11.4.
Используйте РаботаСФайлами.
Вот простой пример:
&НаКлиенте
Процедура Команда1(Команда)
ФайлКартинки = ПолучитьСсылуФайлаКартинки();
ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры
&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
Возврат Номенклатура.ФайлКартинки;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Используйте встроенные механизмы конфигурации.
ПрисоединенныеФайлыКлиент.... считается устаревшей в УТ11.4.
Используйте РаботаСФайлами.
Вот простой пример:
ПрисоединенныеФайлыКлиент.... считается устаревшей в УТ11.4.
Используйте РаботаСФайлами.
Вот простой пример:
&НаКлиенте
Процедура Команда1(Команда)
ФайлКартинки = ПолучитьСсылуФайлаКартинки();
ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры
&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
Возврат Номенклатура.ФайлКартинки;
КонецФункции
Показать
(4)
Переделал ваш способ на работу только на сервере, иначе проблемно получить все картинки.
&НаКлиенте
Процедура Команда1(Команда)
ФайлКартинки = ПолучитьСсылуФайлаКартинки();
ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры
&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
Возврат Номенклатура.ФайлКартинки;
КонецФункции
ПоказатьПроцедура Команда1(Команда)
ФайлКартинки = ПолучитьСсылуФайлаКартинки();
ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ФайлКартинки);
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла("jpg"));
ИзображениеНоменклатуры.Записать(ФайлНаДиске.ПолноеИмя);
КонецПроцедуры
&НаСервере
Функция ПолучитьСсылуФайлаКартинки()
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
Возврат Номенклатура.ФайлКартинки;
КонецФункции
Переделал ваш способ на работу только на сервере, иначе проблемно получить все картинки.
&НаСервере
Процедура ВыгрузитьИзображения(ПутьКФайлу)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка,
| НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение,
| НоменклатураПрисоединенныеФайлы.ВладелецФайла.ФайлКартинки КАК ФайлКартинки
|ИЗ
| Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы";
ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
Для Каждого Строка из ТаблицаЗначений Цикл
Если ЗначениеЗаполнено(Строка.ФайлКартинки) Тогда
ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Строка.ФайлКартинки);
ИзображениеНоменклатуры = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
ФайлНаДиске = Новый Файл(ПолучитьИмяВременногоФайла(Строка.Расширение));
ИзображениеНоменклатуры.Записать(ПутьКФайлу + "/" + ФайлНаДиске.Имя);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
Вот пример:
1. На форме списка сделан дин.список с присоединенными файлами (например при активизации строки номенклатуры выводится список присоединенных файлов).
Заполнение списка с файлами происходит отбором:
Код запроса для дин.списка с файлами примерно следующий:
Основная таблица: Справочник.ИдентификаторыОбъектовМетаданных
Динм.считывание (да)
Автозаполнение полей (да)
2. При клике на файле появляется меню в котором можно выбрать пункт Сохранить Файл. При этом вызывается следующий обработчик:
Это код с рабочей системы, но примеры есть и на ИТС.
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];
ДвДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
Попытка
ДвДанные.Записать(ИмяФайла);
ПоказатьПредупреждение(,"Файл записан!");
Исключение
ПоказатьПредупреждение(,"Ошибка: " + ОписаниеОшибки() + ", записи файла. Файл не записан!");
КонецПопытки;
КонецПроцедуры
ПоказатьЭто код с рабочей системы, но примеры есть и на ИТС.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот