Визуальный html редактор на управляемых формах




Мы рассмотрим некоторые особенности и возможности подключения сторонних визуальных html редакторов на javascript — TinyMCE, CK Editor.
С помощью приложенной обработки Вы сможете попробовать в действии полноценный и удобный визуальный html редактор, а при желании перенести подобный функционал к себе.

На текущий момент самыми популярными и «живыми» html визуальными редакторами являются TinyMCE и CK Editor — они обладают широкой функциональностью и наличием большого количества плагинов. Скачать текущие сборки этих редакторов можно с официальных сайтов.

Что может предложить платформа 1С? В платформе 1С есть встроенный редактор — форматированный документ. На наш скромный взгляд, использование типового встроенного редактора обладает рядом ограничений и не позволяет довольно комфортно проводить визуальное редактирования документа. 

Где использовать данный функционал? Одна из основных сфер использования html редакторов в конфигурациях, работающих с почтовыми сообщениями, — различные help desk, CRM и др.

Краткое описание возможностей примера: 

  • пример выполнен в форме внешней обработки на управляемых формах;
  • добавлен переключатель между двумя типами редакторов;
  • для демонстрации минимальных возможностей взаимодействия добавлены две команды: для получения и установки кода html;
  • реализовано разделение кода между тонким и веб клиентом. 

Особенности и советы.

1. Как узнать количество картинок и получить массив картинок на html странице? Используйте объект document и свойство images. Массив ссылок на картинки находится в document.images[], количество ссылок на картинки можно получить из document.images.length.

2. Некоторые команды для CK Editor на JS:

вставить контент: CKEDITOR.instances.editor1.setData(str);  // не забываем удалить в строке str переносы строк

получить контент: CKEDITOR.instances.editor1.getData();

получить выделенный текст: CKEDITOR.instances.editor1.getSelection().getSelectedText();

3. Некоторые команды для TinyMCE:

вставить контент: tinyMCE.activeEditor.setContent(‘str‘); // не забываем удалить в строке str переносы строк

получить контентtinyMCE.activeEditor.getContent();

вставить картинку (или другой тег в html документ)

var ed = tinyMCE.get('editor1');        // get editor instance
var newNode = ed.getDoc().createElement ( "img" );// create img node
newNode.src = "путь";                           // add src attribute
newNode.alt="это картинка";
newNode.width="100";
newNode.height="100";
ed.execCommand('mceInsertContent', false, newNode.outerHTML);

4. Для использования в веб клиенте библиотеки этих редакторов необходимо разместить вручную в каталоге веб сервера, настроить разрешение на доступ к этим директориям. Для выгрузки необходимых файлов в обработке реализована команда «выгрузить библиотеки для веб».

5. Как в веб клиенте (браузере) выполнить JS?

  • для ie: Элементы.ПолеHTMLДокумента.Документ.parentWindow.eval(JS);
  • для других: Элементы.ПолеHTMLДокумента.Документ.defaultView.eval(JS);

39 Comments

  1. fvadim

    В первом предложении должно быть ‘javascript’

    jscript != javascript

    Reply
  2. ivanov660

    (1) fvadim, спс, поправил опечатку

    Reply
  3. Foxtrot1388

    CKEDITOR не работает у меня через citrix

    Reply
  4. Foxtrot1388

    И спасибо за 5й пункт, я не знал, пришлось пользоваться так ЭлементыФормы.Браузер.Navigate(«javascript: » + JS_Код)

    Reply
  5. ivanov660

    (3) Denchik1388, принципиальной разницы в интеграции этих редакторов нет. Однако, стоит обратить на версии браузеров (про совместимость можно узнать на официальных ресурсах) с очень древними будут очевидно проблемы.

    Если же используете web-клиента для 1С, то тут естественно есть определенные особенности как в работе приложения, так и с доступом к библиотекам.

    Reply
  6. grrus

    Написал почтовик, и использовал тип поля «ФорматированныйДокумент». Ну ни вкакую Таблицы не хочет ни рисовать ни вставлять. Получать получает нормальный текст входящего письма.

    Данное решение нужно будет фундаментально дописывать для моего случая?

    Reply
  7. ivanov660

    1. Форматированный документ не умеет работать достаточной гибкостью с таблицами. В текущей обработке используются: поле HTML и Java-Script фреймворк (TinyMCE или CK Editor).

    Данный функционал я использовал, когда для 1С и конфигурации ERP в рамках улучшения CRM писал обработку замену «Outlook» для работы с MS-Exchange Server (через веб сервисы)

    Данное решение нужно будет фундаментально дописывать для моего случая?

    2. Зависит от того что вы хотите реализовать. Если процесс работы выглядит следующим образом: передать на форму html код, потом вернуть редактируемый результат, то не сложно, на мой взгляд.

    Reply
  8. grrus

    (7)Хотелось бы:

    1. Набор команд форматирования текста исходящего письма

    2. вставка и копирование текста включая таблицы ссылки картинки а также их форматирование.

    Можно ли получить эту форму которая у вас приведена в последнем скриншоте?

    Reply
  9. grrus

    Почему возникает ошибка?

    Использование синхронных методов на клиенте запрещено

    Reply
  10. Boneman

    (9) У тебя наверное режим конфы такой включен, публикации уже 100 лет, раньше было так.

    переделай на «НачатьПолученияКаталогаВременныхФайлов»

    Reply
  11. DasIsFantastich

    Пытался устанавливать код HTML в редактор при открытие формы, но не получается, т.к. HTML поле не успевает создаться (пишет ошибку в Элементы.СодержаниеHTML.Документ.parentWindow.eval(«tinyMCE.activeEditor.setContent(‘»+html+»‘);»);)

    Может быть есть способ как-то дожидаться HTML поля? Или, тупо, ждать некоторое время перед запуском ПроверитьИнициализироватьБиблиотеки() ?

    Reply
  12. DasIsFantastich

    А, может, в 8-ке есть какое-нибудь предопределенное событие, типа «ПослеЗагрузкиФормы()»?

    Reply
  13. DasIsFantastich

    (11) (12) пока решил всё через ПодключитьОбработчикОжидания()

    Надеюсь будет работать везде…

    Reply
  14. Udod141516

    (8)

    Можно ли получить эту форму которая у вас приведена в последнем скриншоте?

    судя по всему ничего не получишь, 159 скачали, но воспользоваться думаю не смогли и спрашивать не стали даж тут …

    Reply
  15. ivanov660

    (14)

    1. Пример рабочий, никаких котов в мешке.

    2. Вы сами скачивали и пробовали, чтобы делать такие выводы? Или это все голословно?

    Reply
  16. ivanov660

    (8) Я делал проект почтовый клиент для Outlook взаимодействующий через rest API.

    Просьб много и пожалуй в ближайшее время я выложу этот клиент из 1С, только придется его доработать под ресурс инфостарт.

    Reply
  17. Udod141516

    (15) проверил в другой конф — работает, прощу извинить

    в упп в управляемом режиме — не работает, видимо надо режим совместимости мешает

    Reply
  18. Udod141516

    на примере TinyMCE позанимался тут не много по мотивам данной статьи, но время прошло, так что страница инициализации другая как понимаете (разобраться не долго), на последней версии. что могу сказать — работает, базовый функционал. на сайте TinyMCE и поиском много информации, все настраивается. удручает только один (или много, но мне конкретно запал один) момент, вставка скопированных таблиц excel. ведь так просто без напряга совсем в простом Поле HTML документа взял и скопи-пасти — результат один к одному без всяких приблуд и танцев. но только не для TinyMCE. вставляться будет таблица с другим форматом. на сайте TinyMCE есть демо, где при вставке такого спрашивается — вставить с форматом или нет, долго разбирался, они пишут в своем ФАКе как это делать, но это не работает (работает частично — часть формата сохраняет, страница ФАКа http://non-stop-ext.blogspot.com/2014/05/paste-excel-data-into-tinymce.html), пока не открыл исходный код демо страницы и увидел инициализацию TinyMCE на ней, так вот там PowerPaste (Premium Plugin) вместо типового Paste, который стоит на оф.странице от 1800$ за один сервер в варианте свой хост… как то не вариант совсем, пахнет от TinyMCE в этом случае не совсем хорошо. кому этого не надо — то добро пожаловать. а кто подскажет как без премиум плагина нормально вставлять таблицы с форматированием — огромное спасибо!

    а пока что типовое поле HTML которое умеет многое само по себе (и без премиальных плагинов) + кнопки форматирования…

    Reply
  19. Udod141516

    писал коммент, уже по существу, написало в итоге ответ — на модерации и … исчезло.

    хотел сообщить момент.

    поиграл с TinyMCE последней версией, все красиво, работает, но есть но, которое сводит все это на НЕТ в моем случае.

    копируем часть таблицы excel вставляем в TinyMCE — формат теряется (объем потери зависит от настройки TinyMCE), на сайте TinyMCE в примерах все красиво — спрашивает вам сохранить формат или без. также есть фак где пишут как после 2014 года такое замутить, но проблема в том, что по факу и правда вставляет похоже по формату, но далеко не все. пока не посмотрел исходный код страницы TinyMCE с полным примером. оказалось, там они используют плагин PowerPaste который премиум, и на секунду замрите, стоимость его на своем сервере (одна штука) … 1800$. казалось бы. простое поле HTML документа копи пастит таблицы офиса один к одному, без таких вот премиальных плагинов…

    поэтому, не смотря на всю заманчивость, красоту и удобство, остаюсь на простом поле HTML с кнопками своими …

    ну или подскажите как такое безобразие обойти.

    Reply
  20. NewLifeMan

    А есть решение для обычных форм?

    Reply
  21. ivanov660

    (20) HTML поведение не отличается в управляемых и обычных формах, т.к. сейчас используют API IE. Поэтому просто адаптируйте код к обычным формам по аналогии.

    С обычными формами не работаю.

    Reply
  22. NewLifeMan

    (21)

    Спасибо, а у вас есть возможность скинуть на почту (smolinskyalexey@gmail.com) или в ЛС обработку?

    Reply
  23. FB_2108343735891044

    В чем причина? http://prntscr.com/m8tyu5

    Reply
  24. ROM_1C

    Режут CSS стили, если понял то только можна редактировать сухой html(((

    Reply
  25. JIeHIH

    (23)

    Удалось решить проблему?

    Reply
  26. portal80

    (25) Поднимайте версию платформы до последней и работайте с WEBkit, а не с дикобразом IE

    Reply
  27. vladdt

    Удалось кому-то решить проблему с ошибкой: Метод объекта не обнаружен (eval)?

    Платформа (8.3.15.1565)

    Reply
  28. ivanov660

    (27)

    1. В 8.3.15.1565 используется движок webkit. Поэтому надо заменить

    Элементы.ПолеHTMLДокумента.Документ.parentWindow (для ie)

    на

    Элементы.ПолеHTMLДокумента.Документ.defaultView (для других браузеров)

    Ну или написать такую конструкцию:

    Если Элементы.ПолеHTMLДокумента.Документ.parentWindow=Неопределено Тогда
    Элементы.ПолеHTMLДокумента.Документ.defaultView…..
    Иначе
    Элементы.ПолеHTMLДокумента.Документ.parentWindow
    КонецЕсли;
    

    2. Видимо в этой версии отрубили вызов функции eval — некоторые говорят так «eval is evil»

    3. Вызвать надо так

    Элементы.ПолеHTMLДокумента.Документ.defaultView.MyFunction(
    

    4. Либо поставить заглушку:

    в код страницы html добавить js

    <sc ript type=»text/javascript»>
    function exec(script)
    {
    eval(script);
    }
    </sc ript>
    

    а в 1С делать так:

    Элементы.ПолеHTMLДокумента.Документ.defaultView.exec(myJS_string);
    
    Reply
  29. vladdt

    (28)

    defaultView.MyFunction(

    по п. 3 имеется в виду

    Элементы.Body.Документ.defaultView.MyFunction(«CKEDITOR.instances.editor1.setData( ‘»+html+»‘, function()…

    если да, то тоже не работает

    Reply
  30. fvadim

    (29) я сделал через п.4 (28), работает

    Reply
  31. ivanov660

    (29) по MyFunction подразумевается кастомная функция, а не типовая, но Вы разобрались ниже.

    Reply
  32. vladdt

    Дико извиняюсь, я не столь прошарен в джаваскриптах. Можно просто выложить рабочий вариант обработки для WEBkit?

    Reply
  33. vladdt

    Как оказалось кнопка «Установить HTML» делает совсем не то, что требуется. А требуется вставить в текущую позицию в тексте редактируемого с помощью CKEditor документа элемент типа ссылка с параметрами определяемыми в тексте 1С.

    Reply
  34. vladdt

    https://ckeditor.com/docs/ckeditor4/latest/examples/api.html

    Нашел в описании, можно сделать через API

    Осталось выяснить как это сделать.

    Reply
  35. ivanov660

    (32)Если появится свободное время попробую обновить обработку.

    Однако, не забывайте, что цель данной статьи в демонстрации примера как интегрировать сторонний JS-редактор.

    Немного практики и терпения, и я думаю что у вас все получится)

    Reply
  36. vladdt

    А вот, как это делается:

    CkEditor = Элементы.Body.Документ.defaultView.CKEDITOR.instances.editor1;
    Если CkEditor.mode = «wysiwyg» Тогда
    CkEditor.insertHtml(«<p>Наша ссылка 123</p>»);
    КонецЕсли;
    Reply
  37. vladdt

    Так, теперь с картинками засада. Картинки хранятся в базе в виде структуры с картинками (наследие форматированного документа). Обычно, спокойненько помещались во временное хранилище а в текст документа вставлялась ссылка. CKEDITOR ссылки на картинки формата «e1cib/tempstorage/96d2c4ab-397e-4d3d-87c2-556463249549?seanceId=ac85ecb6-e81d-4a8b-a0af-0d4b892e59d8» не понимает.

    Есть, конечно, способ сохранять на диск, но очень уж это не красиво по сравнению с предыдущим.

    Как же ему скормить эти картинки?

    Reply
  38. ivanov660

    (37)Попробуйте хранить текст самой картинки в теге html

    <img src=»data:image/gif;base64,R0lGODlhDQAMANUAAFRVVtHd74S192aZzHqVuLq0rvf39+zr6bXI4qizwufd­z5WhsmSt/5rC+r3Ezm1zeJiSjmum8tzm9bvZ/6bB5a6qpn+t5dvVzZK88+v8­/7vg/7DJ4P/99V5gY8zMzObm5ofD/6zQ/3Fua8fX69fm+vDy9OPi4czh/4SX­rJLC/////+7u7Wmt/87f9oG2/5Oku5mZmf///wAAAAAAAAAAAAAAAAAAAAAA­AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUADEALAAAAAANAAwAAAZT­wJhwSIwhDsUixZEkWhLNYeQVjYUYBIVKSCKeGIOCymCISTATISsCu5RKW1VA­kHKBUBDToRxTcUYNGhsdFR8GW0IqJS0ZDyIrh0kqCwBIVR4eTUEAOw==» />
    
    Reply
  39. vladdt

    (38) да, действительно, этот способ работает:

    Для Каждого Элемент Из Вложения Цикл
    
    АдресВХ = «data:image;base64,» + Base64Строка(Элемент.Значение.ПолучитьДвоичныеДанные());
    HTMLТекст = СтрЗаменить(HTMLТекст, Элемент.Ключ, АдресВХ);
    
    КонецЦикла; 

    Но, возникла следующая проблема: Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Причем, работа ведется в тонком клиенте. Может кто-то сталкивался уже с таким?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *