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

Оптимальный способ отображения картинки в форме справочника УФ

Автор oooo800, 25 мар 2025, 09:08

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

oooo800

Самописная конфигурация, УФ, клиент-серверная; платформа 1С:Предприятие 8.3 8.3.26.1540.
Справочник, форма.
Нужно хранить картинку в ИБ И отображать ее на форме справочника.
На сегодня знаю 2 способа:
- через временное хранилище и поле картинки;
- через base64 (например) и html поле;

Есть какой-то "попрямее" способ ?

Например, загрузка из файла двоичных данных или той же строки Base64 в реквизит с типом "ХранилищеЗначений" или "Строка" и потом отображение содержимого в поле "Картинка", но без временного хранилища ?

Например: "загоняем" из файла двоичные данные (в виде строки) в реквизит справочника, потом используем конструктор
Новый Картинка(<ДвоичныеДанные>, <ПрозрачныйФон>)
Или может есть какие-то другие/оптимальные способы ?

Максим75

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

antoneus

Еще можно на форме отображать картинку через навигационную ссылку.

oooo800

Цитата: Максим75 от 25 мар 2025, 09:28отображение на клиенте надо сделать, на сервере нечего отображать. Поэтому и реализован механизм через Временное хранилище.
Когда нам надо получить какие-то данные из реквизита справочника, например, наименование, артикул, мы же не используем временное хранилище.
Чем двоичные данные в 16-ном или base64 представлении в строке не просто данные.
Мы также модем получить эту строку.
Вопрос в том, как потом ее содержимое "положить" на форму в виде картинки.
Или не понимаю, что есть временное хранилище.

Цитата: antoneus от 25 мар 2025, 09:32Еще можно на форме отображать картинку через навигационную ссылку.
По Вашему разумению, как оптимальнее, так или через хранилище значений и временное хранилище ?

antoneus

А что входит в критерии оптимальности?
Сама 1С на сайте итс пишет про навигационную ссылку.

Вот их пример.


oooo800

Цитата: antoneus от 25 мар 2025, 10:22А что входит в критерии оптимальности?

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

oooo800

oooo800, создан регистр сведений:
- измерение - ИзображениеУИ (ЛюбаяСсылка)
- ресурс - ИзображениеДвоичныеДанные (ХранилищеЗначения)

в форму элемента добавлены:
- реквизит ИзображениеАдресВХ (строка)
- элемент - Изображение (ПолеКартинки)

В модуле формы:
&НаКлиенте
Асинх Процедура ВыбратьКартинку()
    ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
    ПараметрыДиалога.Заголовок = "Выберите картинку";
    ПараметрыДиалога.Фильтр = "Все файлы изображений | *.jpg; *.png; *.bmp";
    ПараметрыДиалога.МножественныйВыбор = Ложь;

    ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога,УникальныйИдентификатор);
    Если ОписаниеФайла <> Неопределено Тогда
        Попытка
            ИзображениеАдресВХ = ОписаниеФайла.Адрес;
           
            ИнформацияОФайле = Новый Структура;
            ИнформацияОФайле.Вставить("Адрес", ИзображениеАдресВХ);
            ИнформацияОФайле.Вставить("Имя", ОписаниеФайла.СсылкаНаФайл.Имя);
            ИнформацияОФайле.Вставить("Расширение", ОписаниеФайла.СсылкаНаФайл.Расширение);
            ИнформацияОФайле.Вставить("Размер", ОписаниеФайла.СсылкаНаФайл.Размер());
           
        Исключение
            ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
            ПоказатьПредупреждение(,НСтр("ru = 'Операция не может быть выполнена по причине:'") + Символы.ПС + ТекстСообщения);
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    РегСведений = РегистрыСведений.Изображения.СоздатьМенеджерЗаписи();
    РегСведений.ИзображениеУИ = Объект.Ссылка;
    РегСведений.Прочитать();
    Если РегСведений.Выбран() Тогда
        ДвоичныеДанные = РегСведений.ИзображениеДвоичныеДанные.Получить();   
        ИзображениеАдресВХ = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    УдалитьИзВременногоХранилища(ИзображениеАдресВХ);
КонецПроцедуры

Все работает.

Но хотелось бы с навигационными ссылками.


Попроовал вот так, в:
"ПриСозданииНаСервере":
    М = Новый Массив;
    М.Добавить(Новый Структура("ИзображениеУИ", ТекущийОбъект.Ссылка));
    КлючЗаписи = Новый ("РегистрСведенийКлючЗаписи.Изображения", М);
    ИзображениеАдресВХ = ПолучитьНавигационнуюСсылку(КлючЗаписи, "ИзображениеУИ");

"ПриЗаписиНаСервере"
        ...
РегСведений.ИзображениеУИ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДвоичныеДанные");
        ...


Не сработало.
Что-то не так.

Можете сориентировать ?

antoneus

При создании на сервере

Ключ = РегистрыСведений.Изображения.СоздатьКлючЗаписи(Новый Структура("ИзображениеУИ", Объект.Ссылка));
ИзображениеАдресВХ = ПолучитьНавигационнуюСсылку(Ключ, "ИзображениеДвоичныеДанные");
Всё остальное оставить как было.

oooo800

А в "ПриЗаписиНаСервере"возможно тоже сделать через навигационную ссылку или нет ?

Или только через ПолучитьИзВременногоХранилища и МенеджерЗаписи регистра ?

antoneus


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

Рейтинг@Mail.ru

Поиск