Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
04 июн 2023, 03:58

Проблема с вставкой открытой картинки в реквизит формы типа ХранилищеДанных

Автор ktu78, 17 сен 2015, 13:46

0 Пользователей и 1 гость просматривают эту тему.

ktu78

Добрый день, коллеги.
Подскажите пожалуйста.
У меня есть справочник Номенклатура, управляемая форма - форма элемента.
Задача в чем - нужно открыть файл картинки с изображением товара и вставить в табличную часть справочника, в поле СодержимоеФайла, имеющее тип "ХранилищеЗначений".
Этот тип не отображается на форме. В конструкторе формы выдает "Недоступен в данной форме"

Я создал команду на форме, а те в табличной части и написал код:

&НаКлиенте
Процедура ОткрытьФайл(Команда)
   
   // открываем файл картинки для каждой строки
   Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
   Текст = "ru = ""Фото товара""";
    Фильтр = НСтр(Текст)+"(*.jpg)|*.jpg*";

   
   
   ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.Заголовок = "Выберите файл шаблона";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        Файл = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла);
      //добавление строки в табличную часть документа
      Элементы.ПрикрепленныеФайлы.ДобавитьСтроку();
      Строка=Элементы.ПрикрепленныеФайлы.ТекущиеДанные;
      Строка.НаименованиеФайла=Файл.ИмяБезРасширения;
      Строка.РасширениеФайла=Файл.Расширение;
      Объект.Картинка = Файл.Имя;
      ОткрытыйФайл = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла);
      ДобавьКартинку(ОткрытыйФайл);
   КонецЕсли;   

КонецПроцедуры


&НаСервере
Процедура ДобавьКартинку(ОткрытыйФайл)
    Картинка = РеквизитФормыВЗначение("СодержимоеФайла");
    Объект.Картинка =  Новый ХранилищеЗначения(ОткрытыйФайл);
    ЗначениеВРеквизитФормы(Картинка, "СодержимоеФайла");
КонецПроцедуры

Подскажите, как записать открытую картинку в реквизит табличной части "СодержимоеФайла". Заранее благодарен. Удачи Вам в Вашем деле!

Kironten

https://helpf.pro/faq83/view/1563.html

Работа с изображениями (картинками) в интерфейсе Такси

Рассмотрим алгоритм работы с файлами и картинками в новом интерфейсе 1С:Предприятие 8.3 "Такси".

Во-первых, почему я решил написать эту статью: Новая концепция 1С - отказ от модальных окон, следовательно все методы и объекты, которые порождали открытие модальных окон в новом интерфейсе работать не смогут, точнее смогут, только если в свойствах конфигурации разрешить модальные окна.

Рассмотрим алгоритм работы с файлами и картинками в новом интерфейсе 1С:Предприятие 8.3 "Такси".

Во-первых, почему я решил написать эту статью: Новая концепция 1С - отказ от модальных окон, следовательно все методы и объекты, которые порождали открытие модальных окон в новом интерфейсе работать не смогут, точнее смогут, только если в свойствах конфигурации разрешить модальные окна.

Однако, если разрешить модальные окна, то мы столкнемся с проблемами при работе в web-клиенте.

Во-вторых, о работе с картинками в управляемых формах часто спрашивают.

Итак, задача: в справочнике "Товары" необходимо сохранять и отображать в форме фотографию товара.

Исходная конфигурация не содержит ничего, кроме самого справочника с товарами, выкладывать ее не буду, просто создайте пустую конфигурацию в 8.3.

Для хранения самого графического файла, в справочнике создадим реквизит "ДанныеКартинки", с типом "Хранилище значений".

Если планируете выгружать картинку (файл) из информационной базы обратно в файловую систему, то добавьте еще реквизит, который будет хранить исходное имя файла и его тип.

Далее, займемся формой. Как видно на картинке, реквизит с типом хранилище значений в форме недоступен.

Как будем отображать картинку в форме? Нет, не декорацией с типом "картинка". А в виде реквизита формы с типом "строка". Да, да! Это очевидно, и странно, что мало кто об этом догадывается сам. ;)

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

Добавим реквизит формы с именем "СсылкаНаКартинку", тип "строка", длина не ограничена. И поместим его в реквизиты формы.

По умолчанию, строка в форме будет выглядеть как поле ввода, нам нужно поменять это, в свойствах элемента формы. Выберем в свойстве "Вид" "Поле картинки".

Интерфейсная часть готова. Займемся кодингом. Создадим команду формы "ВыбратьФайлКартинки", в виде кнопки расположим ее на форме.

В модуле опишем обработчик события "Действие" для созданной команды формы:

Код 1C v 8.3 &НаКлиенте
Процедура ВыбратьФайлКартинки(Команда)
//Создаем оповещение, именно процедура "ОбработатьВыборФайла" будет вызвана при закрытии окна выбора файла
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
//Открываем интерактивно окно для выбора файла
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

Пару комментариев к вышеописанному коду:

Если бы мы не обращали внимание на режим модальности приложения, то могли вполне использовать метод "ПоместитьФайл", однако цель статьи показать работу с файлами именно в таком режиме.

Метод НачатьПомещениеФайла помещает выбранный файл во временное хранилище (если выбор файла был произведен) и вызывает процедуру "ОбработатьВыборФайла" в этом же модуле.

Обращаю внимание на выделенный "УникальныйИдентификатор", этим свойством мы связали временное хранилище с текущей формой. В противном случае файл в хранилище помещен будет, но само хранилище при серверном вызовет будет уничтожено, а нам оно еще понадобится, для записи файла в реквизит справочника.

Опишем процедуру "ОбработатьВыборФайла":

Код 1C v 8.3 &НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
СсылкаНаКартинку = Адрес;
КонецПроцедуры

Если пользователь не отказался от выбора файла, то в реквизит формы "СсылкаНаКартинку" помещаем адрес во временном хранилище, куда были помещены данные картинки.

Вуаля!

Так, осталось теперь при записи элемента справочника записать данные из временного хранилища в реквизит элемента справочника. Описываем событие ПередЗаписьюНаСервере:

Код 1C v 8.3 &НаСервере
Процедура Перед3аписьюНаСервере(Отказ, ТекущийОбьект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
ТекущийОбьект.ДанныеКартинки = Новый ХранилищеЗначения( ПолучитьИзВремеиногоХранилища(СсылкаНаКартинку) );
КонецЕсли;
КонецПроцедуры

Проверяем в реквизите формы у нас что? Если адрес временного хранилища, пишем данные в реквизит элемента справочника, обращаясь к "ТекущийОбъект", "ТекущийОбъект" - это сконвертированные данные формы, которые пишутся в базу в этот момент времени.

Осталось описать открытие формы, для отображения картинки уже сохраненной в реквизите элемента справочника.

Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеКартинки");
КонецПроцедуры

Автор: Павел Чистов Скачать архив DT


ktu78


Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск