Имя: Пароль:
1C
1С v8
Вставить картинку в поле HTML документа - как?
,
0 tciban
 
11.11.20
12:53
Делаю некую задачу на обычных формах. В рамках нее надо редактировать сообщение в поле HTML документа на форме, делать красиво разными шрифтами и т.п. И главное - вставлять картинки, скриншоты! С получением картинки из буфера разобрался быстро, а вот грамотно вставить в HTML никак не могу!

Как делаю: Получаю картинку, она лежит в переменной Картинка. Проверял, выводил на форму - там она, лежит. Затем
ТекстКомментарий = ЭлементыФормы.НовыйКомментарий.ПолучитьТекст();
СсылкаНаКартинку = ПоместитьВоВременноеХранилище(Картинка, ЭтаФорма.КлючУникальности);
ТекстКомментария = СтрЗаменить(ТекстКомментария, "src=""" + Вложение.Ключ + """", "src=""" + СсылкаНаКартинку + """");

Получаю следующее (это сторока HTML в которой про картинку после замены):
<p> <br><img height="23" src="e1cib/tempstorage/186615f7-e3bc-4654-b63f-4dcd6542c75b?seanceId=698424ef-61ea-428c-9f9b-77cff42c2d03" style="border:none;" width="99"/> <br><img height="23" src="e1cib/tempstorage/3c1994ff-3d2f-4380-b8bc-47908b59bc3a?seanceId=698424ef-61ea-428c-9f9b-77cff42c2d03" style="border:none;" width="99"/></p>
ЭлементыФормы.НовыйКомментарий.УстановитьТекст(ТекстКомментария);

В поле форме НовыйКомментарий вместо картинки квадратик черный с крестиком.

ЧЯДНТ? (Что я делаю не так?)
1 acht
 
11.11.20
12:56
Второй параметр у ПоместитьВоВременноеХранилище
2 tciban
 
11.11.20
12:57
(1) Сначала было без него. Чт ос ним, что без него - эффект один и тот же
3 tciban
 
11.11.20
13:09
Я в инетах нашел только 3 способа отображения картинки в HTML - в SRC присваиваем путь к файлу с картинкой, в SRC пишем Base64Строка
типа СтрокаКартинки = "data:image/jpeg;base64,"+Base64Строка(Стр.Значение.ПолучитьДвоичныеДанные());
И в SRC пишем ссылку - адрес хранилища. Но последнее не работает!

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

Зачем подробно пишу? Потому что такой вопрос возник - смотрел конфу ITIL prof Там у них картинки вставляются вовсе некоим 4-м способом (правда там все на УФ). Там у них делается для HTML строка следующего вида: <img height="41" src="img_c9bca569_2d00_40eb_b579_59b2d8377f7f" style="border:none;" width="40"/>
При том сначала в тэге написано img_1 и т.д., а img_c9bca569_2d00_40eb_b579_59b2d8377f7f генерится как "img_" + СтрЗаменить(Новый УникальныйИдентификатор(), "-", "_");

Казалось бы - такого способа нет, но картинка в HTML выводиться! КАК?
4 ДенисЧ
 
11.11.20
13:11
5 acht
 
11.11.20
13:15
(2) > Чт ос ним, что без него
Прочитай внимательно СП, пожалуйста.
6 tciban
 
11.11.20
13:21
(4) Там все не по русски. И в HTML я не умею, не нужно было никогда раньше. Скажи простыми словам?

(5) Второй параметр - что с ним не так? EBL формы я сгенерил раенее если что.
Процедура ПриОткрытии()
    ЭтаФорма.КлючУникальности = Новый УникальныйИдентификатор;
7 tciban
 
11.11.20
13:24
EBL - УИД
8 tciban
 
11.11.20
14:43
Коллеги! Неужели никто ничего не может сказать? Ну наверняка ж все просто как всегда, только я туплю сильно видимо.
9 Dzenn
 
гуру
11.11.20
15:32
Просто вставляй картинку в хтмл как строку двоичных данных Base64 и всё. Самый простой и всегда работающий вариант.

Что-то типа такого:

<img src="data:image/jpg;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0j
vb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAA
Re8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0Cc
guWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7"/>
10 tciban
 
11.11.20
15:46
(9) Это у меня получается, это я умею уже дня 3 как :) Но хочется понять почему не работает другой способ!
11 Dzenn
 
гуру
11.11.20
16:08
(10) потому что хранилище значений 1С не является "родным" источником данных для хтмл, и поэтому не нужно мучать этих животных, пытаясь их скрестить )
12 tciban
 
12.11.20
07:33
(11) Это конечно верная мысль, но в интернете полно примеров именно с таким способом, т.е. оно работает. Но только не у меня. Вот и хочется понять почему!
13 ДенисЧ
 
12.11.20
07:36
(12) Есть подозрение, что оно работало на старом движке (эксплорер). А на новом (вебкит) уже не работает
14 tciban
 
12.11.20
07:50
(13) Да, возможно все дело в этом. Короче всю ночь не спал, ворочался, думал и решил ну его нафик, буду вставлять двоичными данными. И в таком виде и буду возвращать в ИТИЛ. Все равно картинку в отдельном виде нигде не надо, важно ее в тексте видеть. Попробуем так.

Но все равно непонятно как они в ИТИЛе картинки в HTML поле отображают...
15 tciban
 
12.11.20
08:00
Братцы! Может кто ссылку даст где про аналогичную задачу - вставка картинок в HTML поле в 1С? Может попадалось кому на глаза?
16 Dzenn
 
гуру
12.11.20
09:51
(15)     ДвоичныеДанные = ХранилищеЗначений.Получить();
    ДанныеСтрокой = Base64Строка(ДвоичныеДанные);
    Ответ = "data:image/jpg;base64," + ДанныеСтрокой;
17 tciban
 
12.11.20
09:58
(16) Я так и делаю. Мне интересно - через ссылку, адрес хранилища как картинку вывести. А так я давно умею и практикую не хуже Дзюбы ;)
18 Dzenn
 
гуру
12.11.20
10:07
(17) в твоём случае из (1) я думаю, что ссылка на хранилище должна выглядеть не  src="e1cib/tempstorage/3c1994ff-3d2f-4380-b8bc-47908b59bc3a?seanceId=698424ef-61ea-428c-9f9b-77cff42c2d03", а  src="e1cib/tempstorage/3c1994ff-3d2f-4380-b8bc-47908b59bc3a".
19 yzimin
 
12.11.20
10:25
Была подобная задача для сторонней системы отдавать картинки и PDF печатные формы основной базы. Делал через http-сервис, затем в итоге потребовалось и в основной базе выводить картинки в html-документе, в итоге так и использовали этот http-сервис "сами для себя"

src="ПутьДоБазы/api/hs/Навание_HTTP_сервиса/" + Формат([Номенклатура.Артикул], "ЧГ=0")

Сам http-сервис
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type", "image/jpeg");
...
Ответ.УстановитьТелоИзДвоичныхДанных(Выборка.ДвоичныеДанныеФайла.Получить());
20 tciban
 
12.11.20
11:00
(18) Спасибо за идею, сейчас попробую!
21 tciban
 
12.11.20
11:01
(19) У меня условие - через web сервис. Никаких HTTP :(
22 ДенисЧ
 
12.11.20
11:03
(21) Мзвините, а веб-сервисы работают через ftp? А может, через gopher:// ?
23 tciban
 
12.11.20
11:16
(22) Эх, не силен я в этом пока :(
24 Kassern
 
12.11.20
11:24
(21) А в чем проблема передачи ДД через веб сервис?
Первая же ссылка на это дело... http://1centerprise8.blogspot.com/2015/10/veb-servis-i-fajly.html
25 tciban
 
12.11.20
11:44
(24) Не-не! у меня нет (пока) проблем с передачей двоичных данных. У меня проблемы с редактированием HTML поля в обычных формах.
26 Kassern
 
12.11.20
13:56
(25) Я вообще не понимаю зачем плодить одинаковые темы, просто загуглить "полеhtmlдокумента добавить картинку" и на первой же странице есть ссылка на статью на мисте. где все расписано...
Для ленивых вот ссылка
Как вставить изображение в поле HTML документа
а вот решение
ДД=Новый ДвоичныеДанные(ПутьДоКартинки);
    СтрокаНТМL="
    |<!DOCTYPE html>
    |<html>
    |<center>
    |";
    СтрокаНТМL=СтрокаНТМL+"
    |<img src=""data:image/jpeg;base64,
    |";
    СтрокаНТМL=СтрокаНТМL+Base64Строка(ДД);
    СтрокаНТМL=СтрокаНТМL+"
    |"" style=""max-width:100%; height:auto""; align-items:center; alt="""" />
    |</center>
    |</html>
    |";
    ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(СтрокаНТМL);
27 Dzenn
 
гуру
13.11.20
09:58
Кстати, вот сейчас нашёл, во вполне себе типовом коде: https://prnt.sc/vif6ff
Что подтверждает то, что 1С для вывода картинок тоже использует base64
28 tciban
 
13.11.20
10:01
(26) А ты думаешь я не гуглил? Я, думаешь, сразу сюда писать кинулся? Нет, сначала 2 дня искал, пробовал... Ну не получилось, не нашел, бывает. И да, именно из этой ссылки я взял преобразование в строку base64.

Но вопрос то был не об этом!
29 tciban
 
13.11.20
10:02
(28) Видимо и нет иного способа...
30 tciban
 
13.11.20
10:17
Что интересное заметил - если взять объект ФорматированныйДокумент (ФД), установить в него текст HTML с внедренными туда через base64 картинками, то если потом получить с AL обратно HTML текст он вернет его уже без base64 картинок заменив их на <img src=img_1> и т.д. а картинки вернет в массиве структур где ключ img_1 (2, 3 и т.д.), а значение - картинка в хранилище.
31 Kassern
 
13.11.20
11:23
(30) Только что протестил на УФ, все норм отрабатывает с временным хранилищем. На ОФ такое не проканало, так что юзай base64
Вот рабочий код для УФ
АдресВХ = ПоместитьВоВременноеХранилище(Новый Картинка(ДД));
АдресКартинки = "<!DOCTYPE html><html><head></head><body><p><img src=" + АдресВХ + "></img></p></body></html>";
32 Дык ё
 
13.11.20
12:17
(31) для УФ так делать тоже не надо. помещение в хранилище, в отличие от base64, это + серверный вызов.
33 Kassern
 
13.11.20
12:28
(29) Танцуй, вот тебе решение для ОФ без base64. А строило только немного погуглить возможности html и добавить немножко фантазии...
АдресВХ = ПоместитьВоВременноеХранилище(Новый Картинка(ПутьДоКартинки));
АдресКартинки = "<!DOCTYPE html><html><head><base href=""e1c://server/localhost/test/""></base></head><body><p><img src=" + АдресВХ + "></img></p></body></html>";
ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(АдресКартинки)
34 Kassern
 
13.11.20
12:29
(33) всего то надо было объяснить html докумнту где у тебя база лежит, чтобы подцеплять картинки. В УФ html документ изначально знает путь до базы
35 Kassern
 
13.11.20
12:30
(28) плохо гуглил видимо(
36 Kassern
 
13.11.20
12:40
(32) Насчет серверного вызова я в курсе, но мы же не знаем всю подноготную ТС, ему base64 чем-то не угодил, хотел через временное хранилище сделать, вот я и написал ему вариант как это сделать
37 Kassern
 
13.11.20
12:50
(33) Можно вообще без временного хранилища обойтись, если и оно не устраивает, а просто указать каталог с картинками.
АдресКартинки = "<!DOCTYPE html><html><head><base href=""D:/picture/""></base></head><body><p><img src=""test_image.jpg""></img></p></body></html>";
ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(АдресКартинки);
38 Сергиус
 
13.11.20
13:02
(0)<div><img src="file:\\\<ПутьКФайлу>"</div>
39 tciban
 
13.11.20
13:14
(33) Ага! Вот теперь понятно! Пригодится :)
(35) Ну бывает, я старался но вот...
(36) Ну серверный или нет - пофиг, я на ОФ вынужден делать.
(37) Не, куаталог с картинками - это наверное самый худший вариант

А в целом - спасибо огромное!!!
Закон Брукера: Даже маленькая практика стоит большой теории.