Рассмотрим достаточно распространенную задачу, с которой сталкиваются разработчики 1С: необходимость дать пользователю возможность редактировать HTML-документ непосредственно в режиме Предприятия. Многие по привычке пытаются использовать метод УстановитьРежим, но сталкиваются с тем, что программа падает с ошибкой. Разберем по шагам, почему это происходит, и проанализируем доступные способы решения этой проблемы.
Выясним причину ошибки при вызове метода установки режима. Ошибка возникает из-за архитектурных различий интерфейсов платформы 1С. Элемент формы «Поле HTML документа» в управляемом приложении (УФ) изначально спроектирован платформой исключительно для просмотра содержимого.
Метод УстановитьРежим(РежимПоляHTMLДокумента.Редактирование) и автоматически появляющаяся панель форматирования текста были доступны только в старом интерфейсе обычных форм (ОФ). В современных управляемых формах программно сделать это поле редактируемым стандартными средствами самой платформы 1С просто невозможно. Тем не менее, выход есть, и мы подробно рассмотрим несколько обходных путей.
Проанализируем первый и самый быстрый способ сделать HTML-поле редактируемым. Суть этого лайфхака заключается во взаимодействии с внутренним браузерным движком, который платформа 1С использует для отображения HTML.
Устанавливая специальный HTML-атрибут contentEditable=true в тег body, мы даем команду самому браузерному движку разрешить пользователю менять текст страницы напрямую. Платформа 1С в этот момент выступает лишь контейнером, а всю работу по вводу и форматированию текста берет на себя веб-ядро.
Посмотрим на пример кода, который программно подменяет стандартные теги в тексте письма, добавляя нужный нам атрибут:
Если Найти(ТекстПисьма, "<body") <> 0 Или Найти(ТекстПисьма, "<BODY") <> 0 Тогда
ТекстПисьма = СтрЗаменить(ТекстПисьма, "<body", "<body contentEditable=true");
ТекстПисьма = СтрЗаменить(ТекстПисьма, "<BODY", "<BODY contentEditable=true");
Иначе
ТекстПисьма = СтрЗаменить(ТекстПисьма, "<html>", "<html><body contentEditable=true>");
ТекстПисьма = СтрЗаменить(ТекстПисьма, "</html>", "</body></html>");
ТекстПисьма = СтрЗаменить(ТекстПисьма, "<HTML>", "<HTML><BODY contentEditable=true>");
ТекстПисьма = СтрЗаменить(ТекстПисьма, "</HTML>", "</BODY></HTML>");
КонецЕсли;
Важный технический нюанс: Учитывайте версию платформы 1С, на которой работает ваша конфигурация. Начиная с версии 8.3.14, фирма 1С перевела поле HTML на всех операционных системах на единый современный движок WebKit (тот же, что используется в Google Chrome). В нем атрибут contentEditable отрабатывает идеально. Если же ваша база работает на старых версиях платформы под Windows (где использовался движок Internet Explorer), для корректной работы может потребоваться добавление метатега X-UA-Compatible со значением IE=edge.
Рассмотрим альтернативный вариант решения задачи стандартными средствами управляемых форм. Если вам нужно просто дать пользователю ввести красиво отформатированный текст, лучше использовать встроенный тип данных ФорматированныйДокумент.
Этот объект специально создан для работы с обогащенным текстом (с картинками, шрифтами, цветами) в управляемом приложении. Он предоставляет готовую панель управления шрифтами и стилями. При необходимости можно ознакомиться с практическими примерами в материале о возможностях форматированного документа в 1С.
Ограничения метода: Этот объект имеет ряд ограничений по сравнению с чистым HTML. Например, исторически в нем существуют сложности со сложными таблицами и сложной веб-версткой. Если ваш исходный HTML содержит сложную табличную структуру или специфические CSS-стили, ФорматированныйДокумент может отобразить их некорректно или вовсе потерять при конвертации.
Разберем самый продвинутый и профессиональный метод, который применяют, когда возможностей 1С не хватает. Поскольку ФорматированныйДокумент ограничен, а режим contentEditable не дает пользователю кнопок для форматирования (жирный текст, списки, вставка картинок), мы можем встроить в поле HTML сторонний визуальный редактор (WYSIWYG). В качестве готового решения подойдёт расширяемый WYSIWYG-редактор форматированного текста для управляемых форм.
Поле HTML документа программно загружается не просто текст, а полноценная веб-страница с подключенными скриптами этого редактора.Подведем итог: если вам нужно быстро дать возможность править простой текст — используйте лайфхак с contentEditable. Если нужен стандартный интерфейс без сложной верстки — переходите на ФорматированныйДокумент. А если требуется профессиональная работа с таблицами и CSS — интегрируйте JS-редакторы.