gifts2017

Удобное хранение форматированного текста

Опубликовал Max (fotov) в раздел Программирование - Практика программирования

Как сохранить форматирование с картинками в строковом поле 1С

Введение

Данная статья описывает хранение форматированного текста с картинками в обычном текстовом поле.

1С учетная система построенная на таблицах, в которых удобно хранить текст и числа, но не очень удобно хранить форматированное описание.

Мы для учета задач реализовали удобное хранение описания в 1С в формате HTML. В платформе есть объект Форматированный документ, но хранить его можно только в поле хранилище значений. Также мы внедрим картинки в HTML. Для внедрения картинок воспользуемся кодированием данных в base64 и внедрением их в текст HTML http://ru.wikipedia.org/wiki/Data:_URL

Дальнейшее описание актуально для управляемых форм.

Создаем структуру данных.

В базе для хранения описания добавляем текстовое поле неограниченной длины.В нём описание в формате HTML. Для примера назовём его ОписаниеHTML.

Настраиваем форму

  1. На форме добавляем реквизит ФорматированныйДокумент с типом ФорматированныйДокумент. Хотя хранение и подразумевается в формате HTML, но редактировать удобнее в специализированной форме.

  2. У реквизита ФорматированныйДокумент устанавиваем флаг “Сохраняемые данные” - чтобы платформа при закрытии предлагала сохранить изменения.

  3. Добавляем элемент формы связанный с реквизитом ФорматированныйДокумент

  4. Добавляем командную панель и связываем её с ФорматированнымДокументом

Пишем код

Для ФорматированногоДокумента пропишем процедуру “ПриИзменении” - нам нужно сохранить все изменения в текстовое поле. Кроме того - нам нужно встроить картинки в HTML.

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

Для загрузки в форматированный документ данных при открытии из HTML напишем процедуру

&НаСервере
Процедура УстановитьHTMLвФорматированныйДокумент(Знач пТекстHTML)

лкВложения = Новый Структура;
 лкПрефикс = "

 
 Пока Найти(пТекстHTML, лкПрефикс) > 0 Цикл
 
 лкНачалоКартинки = Найти(пТекстHTML, лкПрефикс) + СтрДлина(лкПрефикс);
 лкBase64ДанныеКартинки = Сред(пТекстHTML, лкНачалоКартинки);
 лкBase64ДанныеКартинки = Лев(лкBase64ДанныеКартинки, Найти(лкBase64ДанныеКартинки, "'") - 1);
 
 лкКодСоответствия = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
 лкКартинка = Новый Картинка(Base64Значение(лкBase64ДанныеКартинки));
 лкВложения.Вставить(лкКодСоответствия, лкКартинка);
 
 пТекстHTML = СтрЗаменить(пТекстHTML, лкПрефикс + лкBase64ДанныеКартинки + "'",
 "

 
 КонецЦикла;
 
 ФорматированныйДокумент.УстановитьHTML(пТекстHTML, лкВложения);

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

 

И вызов процедуры ПриСозданииНаСервере

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 УстановитьHTMLвФорматированныйДокумент(Объект.ОписаниеHTML);
КонецПроцедуры
 


Известные баги

  1. Вывод в поле HTML документа в windows осуществляется через Internet Explorer, который официально не поддерживает вставку изображений более 80 кб. По факту работает.

  2. Метод ПолучитьHTML добавляет в стили overflow:hidden. Что приводит к невозможности прокрутить данные в поле HTML документа. Лечится просто - СтрЗаменить(ОписаниеHTML,”overflow:hidden”, “”). В 8.3 это исправлено.

  3. Таблиц нет.

  4. Оформление вложенных списков ломается при вызове УстановитьHTML

  5. Картинки из буфера обмена не вставляются.

Вопросы производительности

В нашей базе данный механизм используется для хранения задач и загрузки писем из почты по техподдержке. Форма с 20 скриншотами работает быстро. Можно дополнительно обсуждать вопрос занимаемого места, но при нашем количестве данных перенос вложенных изображений в отдельное хранилище не имеет смысла.

Итак, что у нас получилось

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

Что можно сделать ещё

Ещё к этому можно добавить систему комментирования с отображением комментариев единым списком.

А ещё можно сделать вставки JavaScript в 1С.


Скачать файлы

Наименование Файл Версия Размер
Демонстрационная конфигурация 56
.cf 9,17Kb
15.04.14
56
.cf 9,17Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Андрей Калугин (Kalugin_Adrey) 31.03.15 09:39
А как бы Вы организовали поиск по этим текстам большой длинны? :)
2. Серёжка Шеянов (CepeLLlka) 26.05.15 09:06
Вроде в описании написано - "Данная статья описывает хранение форматированного текста с картинками в обычном текстовом поле."

Хранится не в поле наверное.. Поле на форме.. А хранится в реквизите..


А если в тексте будут просто кавычки использоваться? Мы всё что после них будем пытаться перекодировать в двоичные данные из Base64?

А вообще спасибо.. Мне помогло и пригодилось. Ставлю лайк.
3. Pashkaa (Pashkaa) 13.08.15 08:11
У меня у одного в браузере приведенные для примера процедуры отображаются не полностью.

Например не понятно чему равен лкПрефикс

лкВложения = Новый Структура;
лкПрефикс = "

Пока Найти(пТекстHTML, лкПрефикс) > 0 Цикл
4. Виталий Онянов (Tavalik) 07.10.15 12:47
Спасибо, все работает.

Только у вас в описаниях процедур всё связанное с тегами img потерялось. Видать из-за особенностей движка сайта.

Из-за этого пришлось конфигурацию качать, чтобы посмотреть полный текст процедур.
5. Виталий Васильев (orfos) 05.08.16 10:39