Как реализовать редактирование и хранение форматированного текста с таблицами в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации договорной работы или согласовании сложной документации разработчики часто сталкиваются с задачей: предоставить пользователю возможность писать произвольный текст, выделять отдельные фрагменты стилями (полужирный, курсив, подчеркивание), а также вставлять и форматировать таблицы прямо в интерфейсе программы. Рассмотрим особенности реализации такого функционала и выясним, почему стандартных механизмов платформы бывает недостаточно.

Ограничения стандартных объектов платформы

Прежде чем приступать к проектированию архитектуры решения, проанализируем поведение встроенных средств платформы 1С:Предприятие, которые разработчики обычно пробуют использовать в первую очередь:

  1. Объект «ФорматированныйДокумент». Этот элемент управления предназначен для работы с форматированным текстом, однако в нем отсутствует штатный интерактивный интерфейс для вставки, разметки и настройки таблиц (добавление строк, объединение ячеек, настройка границ). Даже если загрузить в него готовую HTML-таблицу, интерактивно изменять ее структуру пользователь не сможет, а при повторном сохранении исходная сложная верстка и стили могут быть искажены платформенным парсером.
  2. Объект «ТабличныйДокумент». Табличный документ отлично справляется с сеткой строк и колонок, однако его ячейка не поддерживает смешанное оформление внутри одного текстового блока (rich text). Если применить начертание шрифта или цвет к ячейке, они распространяются на весь текст целиком. Выделить одно конкретное слово полужирным шрифтом или подчеркиванием внутри абзаца в табличном документе невозможно.
  3. Внешние редакторы (MS Word / Excel). Открытие локальных офисных программ через COM-соединение или запуск приложений создает зависимость от установленного на рабочем месте софта, снижает быстродействие и неудобно пользователям из-за необходимости постоянной выгрузки и обратной загрузки файлов в информационную базу.

Основное решение: использование элемента «Поле HTML документа»

Разберем наиболее надежный и гибкий способ решения задачи — использование реквизита формы с типом элемента управления ПолеHTMLДокумента. Современные версии платформы 1С:Предприятие 8.3 используют встроенный движок на базе Chromium, что гарантирует поддержку стандартов HTML5, CSS3 и выполнение клиентского JavaScript без оглядки на версию системного браузера операционной системы.

Для создания полноценного редактора разберем процесс по шагам:

  1. Размещаем на управляемой форме элемент с видом ПолеHTMLДокумента.
  2. Подготавливаем локальный HTML-шаблон с подключенной открытой библиотекой визуального WYSIWYG-редактора (например, TinyMCE, CKEditor, Summernote или Quill), в которой из коробки реализована работа с таблицами, стилями текста и выравниванием.
  3. Загружаем HTML-оболочку в поле документа при открытии формы.
  4. Организуем двусторонний обмен данными между платформой 1С и веб-редактором через вызовы JavaScript.

Инициализация и передача данных в веб-редактор

Рассмотрим, как программно загрузить редактор и передать в него сохраненный текст договора. Для этого на стороне 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 = Окно.ПолучитьСодержимое();
    КонецЕсли;
КонецПроцедуры

Для хранения полученных данных в информационной базе подходят два варианта в зависимости от ожидаемого размера текстов:

  1. Реквизит типа «Строка» неограниченной длины. Наиболее простой вариант, удобный для прямого чтения, поиска подстрок и вывода данных на клиенте.
  2. Реквизит типа «ХранилищеЗначения». Используется при работе с большими объемами информации, когда необходимо хранить сжатые двоичные данные или исходные файлы в формате HTML/DOCX без перегрузки основных таблиц базы.

Альтернативный вариант: интеграция с веб-офисом

Если специфика бизнес-процесса требует стопроцентной совместимости со сложными шаблонами Microsoft Word, колонтитулами, альбомными ориентациями отдельных страниц и нумерацией разделов, рекомендуется применить интеграцию с офисными серверами (OnlyOffice или Collabora Online).

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

Особенности вывода на печать

Обратите внимание на формирование печатных форм. Стандартный метод ТабличныйДокумент.Прочитать() при передаче HTML-кода со сложными таблицами и inline-стилями CSS может выводить разметку некорректно. Для вывода на печать и сохранения в PDF документа со сложными таблицами рекомендуется выполнять прямую печать из ПоляHTMLДокумента средствами JavaScript (метод window.print()) либо использовать серверные утилиты конвертации HTML в PDF.

← На главную