При автоматизации договорной работы или согласовании сложной документации разработчики часто сталкиваются с задачей: предоставить пользователю возможность писать произвольный текст, выделять отдельные фрагменты стилями (полужирный, курсив, подчеркивание), а также вставлять и форматировать таблицы прямо в интерфейсе программы. Рассмотрим особенности реализации такого функционала и выясним, почему стандартных механизмов платформы бывает недостаточно.
Прежде чем приступать к проектированию архитектуры решения, проанализируем поведение встроенных средств платформы 1С:Предприятие, которые разработчики обычно пробуют использовать в первую очередь:
Разберем наиболее надежный и гибкий способ решения задачи — использование реквизита формы с типом элемента управления ПолеHTMLДокумента. Современные версии платформы 1С:Предприятие 8.3 используют встроенный движок на базе Chromium, что гарантирует поддержку стандартов HTML5, CSS3 и выполнение клиентского JavaScript без оглядки на версию системного браузера операционной системы.
Для создания полноценного редактора разберем процесс по шагам:
ПолеHTMLДокумента.Рассмотрим, как программно загрузить редактор и передать в него сохраненный текст договора. Для этого на стороне 1С подготавливается HTML-каркас, который помещается в строковый реквизит формы, связанный с полем HTML.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ТекстДоговораHTML - реквизит объекта или реквизит формы типа "Строка"
// Получаем ранее сохраненный HTML из базы или устанавливаем значение по умолчанию
Если ПустаяСтрока(Объект.ТекстДоговораHTML) Тогда
Объект.ТекстДоговораHTML = "<p>Введите текст договора...</p>";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИнициализироватьРедактор();
КонецПроцедуры
&НаКлиенте
Процедура ИнициализироватьРедактор()
// Загружаем HTML-шаблон редактора в реквизит, привязанный к Полю HTML документа
ТекстHTMLПоля = ПолучитьМакетРедактора();
КонецПроцедуры
После завершения загрузки страницы в поле HTML документа мы можем передать исходный текст в редактор через обращение к DOM-модели документа или вызов функции JavaScript. Разберем обработчик события поля HTML ДокументСформирован:
&НаКлиенте
Процедура ПолеHTMLДокументСформирован(Элемент)
ДокументHTML = Элементы.ПолеHTML.Документ;
Если ДокументHTML <> Неопределено Тогда
Окно = ДокументHTML.defaultView;
// Вызываем функцию JavaScript, объявленную в шаблоне редактора
Окно.УстановитьСодержимое(Объект.ТекстДоговораHTML);
КонецЕсли;
КонецПроцедуры
Перед записью документа необходимо считать итоговое содержимое страницы обратно в реквизит платформы 1С. Посмотрим, как извлечь сгенерированный HTML-код из визуального редактора:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ДокументHTML = Элементы.ПолеHTML.Документ;
Если ДокументHTML <> Неопределено Тогда
Окно = ДокументHTML.defaultView;
// Забираем итоговую разметку с таблицами и стилями
Объект.ТекстДоговораHTML = Окно.ПолучитьСодержимое();
КонецЕсли;
КонецПроцедуры
Для хранения полученных данных в информационной базе подходят два варианта в зависимости от ожидаемого размера текстов:
Если специфика бизнес-процесса требует стопроцентной совместимости со сложными шаблонами Microsoft Word, колонтитулами, альбомными ориентациями отдельных страниц и нумерацией разделов, рекомендуется применить интеграцию с офисными серверами (OnlyOffice или Collabora Online).
При таком подходе файл договора хранится в 1С как двоичные данные формата DOCX, а форма редактирования открывает защищенную сессию веб-редактора внутри того же ПоляHTMLДокумента или во внешнем окне по протоколу WOPI. Пользователь получает полноценный привычный функционал текстового процессора, а итоговый файл автоматически сохраняется в базу 1С по завершении сессии редактирования.
Обратите внимание на формирование печатных форм. Стандартный метод ТабличныйДокумент.Прочитать() при передаче HTML-кода со сложными таблицами и inline-стилями CSS может выводить разметку некорректно. Для вывода на печать и сохранения в PDF документа со сложными таблицами рекомендуется выполнять прямую печать из ПоляHTMLДокумента средствами JavaScript (метод window.print()) либо использовать серверные утилиты конвертации HTML в PDF.