Введение
Данная статья описывает хранение форматированного текста с картинками в обычном текстовом поле.
1С учетная система построенная на таблицах, в которых удобно хранить текст и числа, но не очень удобно хранить форматированное описание.
Мы для учета задач реализовали удобное хранение описания в 1С в формате HTML. В платформе есть объект Форматированный документ, но хранить его можно только в поле хранилище значений. Также мы внедрим картинки в HTML. Для внедрения картинок воспользуемся кодированием данных в base64 и внедрением их в текст HTML http://ru.wikipedia.org/wiki/Data:_URL
Дальнейшее описание актуально для управляемых форм.
Создаем структуру данных.
В базе для хранения описания добавляем текстовое поле неограниченной длины.В нём описание в формате HTML. Для примера назовём его ОписаниеHTML.
Настраиваем форму
-
На форме добавляем реквизит ФорматированныйДокумент с типом ФорматированныйДокумент. Хотя хранение и подразумевается в формате HTML, но редактировать удобнее в специализированной форме.
-
У реквизита ФорматированныйДокумент устанавиваем флаг “Сохраняемые данные” - чтобы платформа при закрытии предлагала сохранить изменения.
-
Добавляем элемент формы связанный с реквизитом ФорматированныйДокумент
-
Добавляем командную панель и связываем её с ФорматированнымДокументом
Пишем код
Для ФорматированногоДокумента пропишем процедуру “ПриИзменении” - нам нужно сохранить все изменения в текстовое поле. Кроме того - нам нужно встроить картинки в 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);
КонецПроцедуры
Известные баги
-
Вывод в поле HTML документа в windows осуществляется через Internet Explorer, который официально не поддерживает вставку изображений более 80 кб. По факту работает.
-
Метод ПолучитьHTML добавляет в стили overflow:hidden. Что приводит к невозможности прокрутить данные в поле HTML документа. Лечится просто - СтрЗаменить(ОписаниеHTML,”overflow:hidden”, “”). В 8.3 это исправлено.
-
Таблиц нет.
-
Оформление вложенных списков ломается при вызове УстановитьHTML
-
Картинки из буфера обмена не вставляются.
Вопросы производительности
В нашей базе данный механизм используется для хранения задач и загрузки писем из почты по техподдержке. Форма с 20 скриншотами работает быстро. Можно дополнительно обсуждать вопрос занимаемого места, но при нашем количестве данных перенос вложенных изображений в отдельное хранилище не имеет смысла.
Итак, что у нас получилось
В поле ОписаниеHTML у нас хранится как форматированное описание, так и картинка, при этом если нам нужен только просмотр - нам даже нет необходимости загружать данные в форматированный документ - достаточно просто для поля ОписаниеHTML на управляемой форме указать вид - Поле HTML документа. Также при необходимости можно легко сохранить данные в HTML и передать в другую систему.
Что можно сделать ещё
Ещё к этому можно добавить систему комментирования с отображением комментариев единым списком.
А ещё можно сделать вставки JavaScript в 1С.