Часто при разработке возникает задача создать функционал для ведения базы знаний, инструкций или просто хранения статей прямо в 1С. Основное требование к такому функционалу — возможность не просто вводить текст, но и форматировать его, а также вставлять изображения, как в привычном текстовом редакторе типа MS Word. Давайте разберем, какие инструменты предоставляет платформа 1С для решения этой задачи и какой из них выбрать.
Проанализируем несколько подходов, от самых современных и рекомендуемых до более сложных и специфических, чтобы вы могли выбрать оптимальный вариант для вашего проекта.
Это наиболее современный и предпочтительный способ для создания текстового редактора в управляемых формах. Он специально разработан для работы с форматированным текстом и изображениями и обеспечивает хороший баланс между функциональностью и простотой реализации.
Как это работает?
Элемент ФорматированныйДокумент позволяет пользователю редактировать текст, применяя к нему стили (жирный, курсив, подчеркнутый), создавать списки, выравнивать абзацы и, что самое важное, вставлять картинки прямо в текст. Изображения при этом кодируются в формат Base64 и становятся частью HTML-представления документа.
Разберем по шагам реализацию:
СтатьяHTML с типом «ХранилищеЗначения» или «Строка» неограниченной длины. ХранилищеЗначения предпочтительнее для больших объемов данных.ФорматированныйДокумент. Назовем его, например, РедакторСтатьи.Посмотрим на пример кода для загрузки и сохранения данных:
Для загрузки данных из базы в редактор при открытии формы используем обработчик ПриСозданииНаСервере.
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, что это не новая запись и данные есть
Если НЕ Объект.ЭтоНовый() И ЗначениеЗаполнено(Объект.СтатьяHTML) Тогда
// Получаем HTML-строку из хранилища
HTMLПредставление = Объект.СтатьяHTML.Получить();
Если HTMLПредставление <> Неопределено Тогда
// Загружаем HTML в наш реквизит формы
ЭтаФорма.РедакторСтатьи.УстановитьHTML(HTMLПредставление);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для сохранения данных из редактора в базу данных используем обработчик ПередЗаписьюНаСервере.
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Получаем содержимое редактора в виде HTML-строки
HTMLПредставление = ЭтаФорма.РедакторСтатьи.ПолучитьHTML();
// Помещаем полученную строку в хранилище значения
ТекущийОбъект.СтатьяHTML = Новый ХранилищеЗначения(HTMLПредставление);
КонецПроцедуры
Итог: Этот метод является золотым стандартом для данной задачи в современных конфигурациях. Он прост в настройке, не требует внешних компонент и отлично работает как в толстом, так и в тонком клиенте.
Это еще один хороший вариант, который был популярен до появления ФорматированногоДокумента. Он также позволяет отображать и редактировать HTML-содержимое.
Ключевые особенности:
РежимРедактирования).В отличие от ФорматированногоДокумента, работа с получением и установкой HTML может быть менее очевидной. Чаще всего поле HTML-документа привязывают напрямую к реквизиту формы с типом «Строка», и платформа сама заботится о передаче данных. Но для надежности и контроля лучше использовать программные методы.
Этот способ все еще актуален, но если вы начинаете разработку с нуля на современной платформе, ФорматированныйДокумент будет более удобным выбором.
Этот вариант подходит, если вам нужна структура, больше похожая на Excel, чем на Word. Он позволяет размещать текст и картинки в ячейках, но не предоставляет возможности свободного "перетекания" текста, как в обычном документе.
Как было отмечено в обсуждении, при попытке использовать этот элемент возникает проблема с сохранением. Данные из него не сохраняются автоматически, даже если поле связано с реквизитом. Решение — ручное сохранение в ХранилищеЗначения.
Разберем по шагам:
ДанныеТаблицы с типом ХранилищеЗначения.ТабличныйДокумент с типом ТабличныйДокумент и разместите его на форме.Пример кода для загрузки и сохранения:
Загрузка данных при открытии формы:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если НЕ Объект.ЭтоНовый() И ТипЗнч(Объект.ДанныеТаблицы) = Тип("ХранилищеЗначения") Тогда
ПолученныйТабДок = Объект.ДанныеТаблицы.Получить();
Если ПолученныйТабДок <> Неопределено Тогда
// Копируем содержимое в наш реквизит формы
// Прямое присваивание может не сработать, копирование надежнее
ОбластьТабДок = ПолученныйТабДок.ПолучитьОбласть("R1C1:" + "R" + ПолученныйТабДок.ВысотаТаблицы + "C" + ПолученныйТабДок.ШиринаТаблицы);
ЭтаФорма.ТабличныйДокумент.ВставитьОбласть(ОбластьТабДок, ЭтаФорма.ТабличныйДокумент.Область("R1C1"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Сохранение данных перед записью объекта:
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Помещаем объект табличного документа из реквизита формы в хранилище
ТекущийОбъект.ДанныеТаблицы = Новый ХранилищеЗначения(ЭтаФорма.ТабличныйДокумент);
КонецПроцедуры
Итог: Этот метод стоит использовать, только если вам нужна строгая табличная структура. Для создания статей он неудобен.
Это самый мощный, но и самый проблемный метод. Он заключается во встраивании полноценного редактора Microsoft Word прямо в форму 1С.
Преимущества:
Недостатки:
ХранилищеЗначения.Вывод: В современных реалиях этот подход считается устаревшим и не рекомендуется к использованию, за исключением очень специфических случаев, когда требуется 100% совместимость с форматами Word и его функционалом.
Для создания базы знаний или любого другого функционала, где требуется редактирование форматированного текста с картинками, однозначно выбирайте ФорматированныйДокумент. Это современный, поддерживаемый платформой и наиболее простой в реализации способ, который покрывает 99% всех потребностей в этой области.