Хранение изображения и редактирование 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    3163    dsdred    16    

65

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

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

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

24.01.2024    7333    YA_418728146    25    

69

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

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

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

11.12.2023    7670    dsdred    36    

115

1С-ная магия

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

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

06.10.2023    20034    SeiOkami    46    

124

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

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

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

14.09.2023    13945    human_new    27    

77

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

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

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

28.08.2023    10303    YA_418728146    7    

148

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

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

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

20.08.2023    6974    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1303 12.04.22 11:55 Сейчас в теме
"http://localhost/SL/PicturesTemp/" - с помощью чего опубликовано?
2. vit59 58 12.04.22 11:57 Сейчас в теме
3. malikov_pro 1303 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 Сейчас в теме
А чем не устроила в форматированном документе обычная навигационная ссылка на изображение в регистр сведений? Она работает вполне себе быстро
Оставьте свое сообщение