Хранение изображения и редактирование HTML документа (8.3.19 управляемые формы)

12.04.22

Разработка - Механизмы платформы 1С

Стояла задача использовать Форматированный документ для хранения и редактирования HTML документа и при этом сохранять картинки для HTML без использования base64.

На Инфостарте и в СЕТИ предлагают использовать base64 для хранения картинок в HTML документе. Это решение имеет ограничение на длину строки и при большом количестве картинок начинаются "тормоза" при сохранении и открытии веб документа.

Предлагается для редактора использовать Форматированный документ и хранить его в хранилище. При формирования HTML документа используется объект ПотокВПамяти, который позволяет сохранять картинки из форматированного документа в файл (ключевой момент) и по веб ссылке отображать картнку на веб форме.

Фрагмент кода: ИмяФайла (уникальное) = КлючЗначение.Ключ+"_"+Объект.Ссылка.УникальныйИдентификатор()+".jpg" позволяет ограничить количество временных файлов для открытых ссылок, т.е для  всех пользовательских сеансов используется один и тот временный файл для конкретной картинки и позволяет избежать "затирания" файлов картинки.

Код для понимания несложный, описывать, думаю, не нужно.

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
 ФорматДокумент = ТекущийОбъект.НовостиВХранилище.Получить();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьРежимРедактирования(Команда)  
    Если НЕ Элементы.ФорматДокумент.ТолькоПросмотр Тогда
        Элементы.ФорматДокумент.ТолькоПросмотр=Истина;
    Иначе
        Элементы.ФорматДокумент.ТолькоПросмотр=ложь;
    КонецЕсли;

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЗаполнитьХТМЛНаСервере( ) ; 
    Если НЕ РольДоступна("ПолныеПрава") Тогда 
        Отказ=Истина;
    КонецЕсли;  
    
КонецПроцедуры 

&НаСервере
Процедура ЗаполнитьХТМЛНаСервере( ) 
    HTML_String = "";
    СтруктураКартинок = Новый Структура;    
    ФорматДокумент.ПолучитьHTML(HTML_String, СтруктураКартинок);  
    КаталогКартинок=КаталогВременныхФайлов();
    
    Для каждого КлючЗначение из СтруктураКартинок Цикл 
        Стрим = Новый ПотокВПамяти;
        КлючЗначение.Значение.Записать(Стрим);
        Бинарник = Стрим.ЗакрытьИПолучитьДвоичныеДанные();  
        ИмяФайла = КлючЗначение.Ключ+"_"+Объект.Ссылка.УникальныйИдентификатор()+".jpg"; 
        
        Бинарник.Записать(КаталогКартинок+ИмяФайла);   
        HTML_String=СтрЗаменить(HTML_String,КлючЗначение.Ключ,"http://localhost/SL/PicturesTemp/"+ИмяФайла); 
    КонецЦикла; 

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

&НаКлиенте
Процедура HTML_StringПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    Если ДанныеСобытия.Свойство("href") И ЗначениеЗаполнено(ДанныеСобытия.href) Тогда
        ИмяОткрываемойСтраницы = СокрЛП(ДанныеСобытия.href);
        Протокол = ВРег(СтрЛевДоСимвола(ИмяОткрываемойСтраницы, ":"));
        Если Протокол <> "HTTP" И Протокол <> "HTTPS" И Протокол <> "E1C" Тогда
            Возврат; // Не ссылка
        КонецЕсли;
        
        ПерейтиПоСсылке(ИмяОткрываемойСтраницы);         
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры  

&НаКлиенте
Процедура ПерейтиПоСсылке(Ссылка) Экспорт
    
    #Если ТолстыйКлиентОбычноеПриложение Тогда
        ЗапуститьПриложение(Ссылка);
    #Иначе
        ПерейтиПоНавигационнойСсылке(Ссылка);
    #КонецЕсли
    
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция СтрЛевДоСимвола(Строка, Разделитель, Остаток = Неопределено)
    Позиция = СтрНайти(Строка, Разделитель);
    Если Позиция = 0 Тогда
        СтрокаДоТочки = Строка;
        Остаток = "";
    Иначе
        СтрокаДоТочки = Лев(Строка, Позиция - 1);
        Остаток = Сред(Строка, Позиция + СтрДлина(Разделитель));
    КонецЕсли;
    Возврат СтрокаДоТочки;
КонецФункции 

&НаКлиенте
Процедура GetHTML(Команда) 
    ЗаполнитьХТМЛНаСервере( );
КонецПроцедуры

 

Форматированный документ редактор HTML документа сохранение картинки ПотокВПамяти

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2648    dsdred    16    

59

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    6118    dsdred    59    

86

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    6021    YA_418728146    25    

68

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7113    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19214    SeiOkami    46    

119

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12932    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    9540    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6575    sebekerga    54    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1293 12.04.22 11:55 Сейчас в теме
"http://localhost/SL/PicturesTemp/" - с помощью чего опубликовано?
2. vit59 57 12.04.22 11:57 Сейчас в теме
3. malikov_pro 1293 12.04.22 12:39 Сейчас в теме
(2)
В какой момент чистится временная папка (в том числе при работе нескольких пользователей)?
Как загружается картинка?
Сам использую NGINX и беру файл из тома хранения, https://infostart.ru/1c/articles/1448298/, если опишете подобное для IIS то думаю сообщество оценит положительно.
4. пользователь 12.04.22 13:09
Сообщение было скрыто модератором.
...
5. axae 109 18.04.22 12:53 Сейчас в теме
А чем не устроила в форматированном документе обычная навигационная ссылка на изображение в регистр сведений? Она работает вполне себе быстро
Оставьте свое сообщение