Установить html 1с форматированный документ
Итак нам надо загрузить html-страницы с сайта. В качестве исходных данных имеем текстовый файл с ссылками на страницы, необходимо загрузить эти страницы в элементы справочника 1с конфигурации. Во время загрузки надо предусмотреть сохранение картинок в конфигурации 1с, а не опираться на их доступность на сайте-источнике.
Для хранения html-страниц в конфигурации был выбран объект встроенного языка ФорматированныйДокумент. В конфигурации находится справочник «Элементы» с реквизитом «Описание» (тип ХранилищеЗначения), в котором будет храниться форматированный документ.
Пользователю в форме списка справочника доступна кнопка загрузки страниц. По данной кнопке происходит передача текстового файла с ссылками на сервер и отдается управление в общий модуль ОбменССайтомСервер. Каждая строка текстового файла воспринимается как ссылка. Чтение текстового файла можно посмотреть в функции ЗагрузитьОбъектыИзСсылокФайла().
Хочу остановиться подробнее на самом алгоритме загрузки html-страницы. Саму загрузку по ссылке производит функция ЗагрузитьССайта, которая возвращает форматированный документ. Для того чтобы сформировать форматированный документ используется метод УстановитьHTML. Для вызова этого метода нам необходимо наличие текстовой строки, которая содержит HTML и структуру вложений. В структуре вложений ключ структуры это название картинки, а в значении хранится сама картинка.
Код получения форматированного документа:
Конфигурацию, демонстрирующую решение данной задачи можно скачать
html_to_1C.cf (17,0 KiB, 6 396 скачиваний)
Если будут предложения по оптимизации кода обхода html-кода пишите в комментарии.
UPD: Добавлено приведение строки в нижний регистр. При загрузке страницы используется кеш картинок, параметр КешКартинок имеет тип соответствие и дополняется во время разбора ссылки в случае необходимости. Спасибо Александру за дельные советы в комментариях.
1. Забыли учесть то, что теги могут быть написаны как в нижнем регистре, так и в ВЕРХНЕМ (проверки для поиска тэга img и атрибута src).
2. Обычно отдельные элементы дизайна страниц одного и того же сайта повторяются, соответственно, повысить эффективность скачивания нескольких страниц одного и того же сайта подряд можно добавив кэширование картинок в соответствии, в котором ключем будет URL картинки, а значением — путь к временному файлу скачанной картинки.
Александр, спасибо большое за указание на неточности. По первому пункту надо добавить использование ВРег() в условиях.
Кеширование картинок во время скачивания сделать в соответствии так же реально, так как сервер файл отрабатывает за один вызов и не надо будет думать про сохранение переменной на сервере между вызовами клиента.
Спасибо.
Обновил пост. Спасибо.
На своих данных с такой ситуацией не сталкивался. Интересный момент. Спасибо за дополнение
О некоторых проблемах в работе метода ФорматированныйДокумент.УстановитьHTML(), в результате которых теряется форматирование текста, уже было известно, когда я с ними столкнулся. Решения в интернете не нашлось, но мне очень хотелось использовать этот объект и метод. О том как я решил данную проблему, и как реализовал некоторые функции по работе с объектом ФорматированныйДокумент читайте в этой статье.
Хотел бы поделиться опытом работы с объектом ФорматированныйДокумент, потому что решение искал довольно долго (несколько часов), а в инете не нашел ничего, кроме описания самой проблемы (
Небольшое предисловие.
Решение проблемы
Как оказалось проблема в следующем: если в свойстве style='некое css форматирование' блока параграфа, который ФорматированныйОбъект использует для хранения текста, последнее css свойство не закрыто символом ";" то метод УстновитьHTML() игнорирует все форматирование. При этом либо метод ПолучитьHTML() иногда читает html не закрывая последнее свойство css точкой с запятой, либо объект ФорматированныйДокумент странным, непонятным образом хранит html-форматирование. Получается, что при вызове метода ПрочитатьHTML и за ним УстановитьHTML, даже никак не меняя текст HTML, можно потерять форматирование некоторых блоков (я проверял).
Такой код, после применения метода УстановитьHTML(), не будет размещать текст в центре, потому что css-свойство "text-align" блока не было закрыто символом ";":
Если же добавить символ ";", то метод УстановитьHTML() отработает корректно, и текст будет размещен в центре:
Для меня важно было сохранить выравнивание текста, поэтому я применил следующий код:
Вы же конечно можете использовать более универсальные конструкции, зная в чем проблема работы метода.
Приложение
Функция "СклеитьДокументы (Документ1, Документ2)" возвращает ФорматированныйДокумент содержащий оба документа, следующие друг за другом.
Функция "ВклеитьДокумент (Документ1, Документ2)" возвращает ФорматированныйДокумент содержащий оба документа, соединенные построчно (к каждой строке Документа1 приписывается соответстующая строка Документа2, и дописывается остаток текста болльшего из них).
Начиная с версии 8.2.11 в платформе появился новый объект – Форматированный документ. Так как не нашел на Инфостарте ни одного упоминания об этой функциональности, решил опубликовать небольшую статейку о том, что это за объект и какой функционал он добавляет.
Начиная с версии 8.2.11 в платформе появился новый объект – Форматированный документ. Так как не нашел на Инфостарте ни одного упоминания об этой функциональности, решил опубликовать небольшую статейку о том, что это за объект и какой функционал он добавляет.
Прошу учесть, что это моя первая публикация. Итак, начнем…
Предназначение
Форматированный документ предназначен для оформление текста. Его можно выделить жирным, подчеркнуть , увеличить / уменьшить шрифт, центрировать и т.д. Также можно добавить картинку. Т.е. в 1С теперь можно отформатировать текст, примерно, как в MS Word и др. подобным программам. Это может быть удобно при оформлении различных договоров или, например, при редактировании электронного письма. Таким образом, у нас есть возможность привести текстовый документ в тот вид, который мы пожелаем.
В синтакс-помощнике есть описание.
Объект ФорматированныйДокумент (FormattedDocument) имеет одноименный тип данных, который поддерживает функционирование данного объекта и имеет следующие методы:
Вставить (Insert)
Добавить (Add)
Записать (Write)
ПолучитьHTML (GetHTML)
ПолучитьЗакладкуКонца (GetEndBookmark)
ПолучитьЗакладкуНачала (GetBeginBookmark)
ПолучитьЗакладкуПоПозиции (GetPositionBookmark)
ПолучитьПозициюПоЗакладке (GetBookmarkPosition)
ПолучитьТекст (GetText)
Удалить (Delete)
УстановитьHTML (SetHTML)
Доступен во всех типах приложения: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Нельзя указать новый тип данных в качестве типа реквизита.
Есть одна важная особенность этого типа. Нельзя задавать тип «Форматированный документ» для реквизита объекта (справочника, документа и др.). Но есть возможность указывать его для реквизитов формы.
Возникает вопрос, как же нам сохранить те изменения при форматировании текста, которые сделал пользователь? Для этого применяется специальный объект «ХранилищеЗначения», который может содержать в себе любой тип данных, в том числе и «форматированный документ». Таким образом, в базе данных сам объект будет храниться как «Хранилище значения», далее при открытии формы необходимо будет извлечь объект из хранилища, отобразить его на форме используя тип «ФорматированныйДокумент». Если пользователь решит сохранить изменения, то при записи объекта нужно снова взять объект «форматированный документ» и записать его в хранилище.
Пример работы
Возьмем за основу каркасную конфигурацию, создадим в ней справочники «Контрагенты» и «Договоры». Установим справочник «Договоры» подчиненным справочнику «Контрагенты» и создадим реквизит «Текст» с типом ХранилищеЗначения.
Создадим форму элемента справочника «Договоры» и добавим на нее новый реквизит, который назовем «ТекстДоговора», укажем тип данных «ФорматированныйДокумент». Обратите внимание, что реквизит «Текст» с типом «ХранилищеЗначения» на форму поместить нельзя.
Создадим также командную панель (меню) содержащую необходимые кнопки для управления форматированным документом. Для этого надо добавить в форму «Группа – Командная панель» и указать в свойстве «Источник команд» реквизит формы «ТекстДоговора» с типом ФорматированныйДокумент.
Запускаем отладчик, проверяем, что у нас получилось…
Все бы хорошо, но есть некоторые проблемы:
Во-первых, если ввести текст и отформатировать его должным образом, то признак модифицированности для формы не возникает. Таким образом, случайно нажав на кнопку закрытия формы, система не задавая вопросов закрывает ее без всякого сохранения.
Для того чтобы подобные неприятности не случались, необходимо установить флаг у свойства «Сохраняемые данные» реквизита формы «ТекстДоговора». В результате, при любом изменении данных в реквизите «ТекстДоговора», будет устанавливаться признак модифицированности формы, а при ее закрытии система спросит: «Сохранить изменения?».
Во-вторых. Попытаемся закрыть форму и сохранить введенные данные. Заново открыв сохраненный договор, видим что текст введенный в форму договора отсутствует. Почему так происходит?
Все дело в том, что мы делаем изменения в реквизите формы, который у нас никак не связан с реквизитом объекта. Давайте настроим связь между реквизитом формы «Текст договора» с типом данных «ФорматированныйДокумент» и реквизитом объекта «Текст» с типом «ХранилищеЗначения».
Пропишем эту связь программно в модуле формы. Опишем алгоритм.
- При открытии формы, необходимо будет обратиться к реквизиту объекта «Текст», чтобы прочитать из него данные и записать их в форматированный документ «Текст договора».
- При записи объекта, берем содержимое форматированного документа и помещаем его в реквизит объекта «Текст» с типом «ХранилищеЗначения».
Таким образом у нас будет возникать эффект, что все изменения производимые пользователем, будут сохраняться в базе данных.
Нам понадобятся следующие обработчики событий:
оно удобно тем, что при ошибочном внесении изменений в данные формы, можно нажать кнопку «Перечитать» и вернутся к исходным данным.
- событие ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Т.к. реквизит Текст у нас имеет тип «ХранилищеЗначений», надо учесть нюансы работы с ним… В случае чтения объекта используем метод Получить(), а в случае записи используем конструктор объекта Новый ХранилищеЗначения(, ).
На этом пока всё. В следующий раз попробую рассказать про использование шаблонов для вставки параметров в текст форматированного документа, например, вместо %Контрагент% вставлять наименование контрагента.
При работе с клиентами возникла задача: использовать форматированный документ. Итак, существует справочник, в нем табличная часть. Для каждой строки требуется ввести описание, причем описание имеет тип форматированный документ. Потребовалось организовать печать табличной части справочника с описанием для каждой строки. Тип данных "Форматированный документ" не может выводится в табличный документ, поэтому пришлось организовывать печать через Microsoft Word.
Постановка задачи
При работе с клиентами возникла задача: использовать форматированный документ. Итак, существует справочник, в нем табличная часть. Для каждой строки требуется ввести описание, причем описание имеет тип форматированный документ. Потребовалось организовать печать табличной части справочника с описанием для каждой строки. Тип данных "Форматированный документ" не может выводится в табличный документ, поэтому пришлось организовывать печать через Microsoft Word. Для этого требуется:
- Сформировать html-файл. Сохранить его во временные файлы, создать временный каталог и выгрузить туда картинки и прочие файлы.
- Открыть html с помощью Microsoft Word и сохранить в pdf.
Все это требуется сделать программно.
1. Формирование временного файла html.
Один из самых простых, но определяющих внешний вид печатной формы этап. Вот пример формирования простого файла html:
Из типа данных "Форматированный документ" легко получить html строку и вставить её в html файл. Причем это можно сделать и с учетом картинок. Вот пример кода:
В html-документ можно передавать данные с учетом форматирования. В Microsoft Word существуют свои особенности. Так например следующая конструкция формирует строку курсивом и шрифтом "Times New Roman":
2. Открытие html с помощью Microsoft Word и сохранение в pdf
Средствами Microsoft Word возможно сохранение файла html в другие форматы (в том числе в pdf). Для данной операции использовалась следующая конструкция:
Мы рассмотрим некоторые особенности и возможности подключения сторонних визуальных html редакторов на javascript - TinyMCE, CK Editor.
С помощью приложенной обработки Вы сможете попробовать в действии полноценный и удобный визуальный html редактор, а при желании перенести подобный функционал к себе.
Что может предложить платформа 1С? В платформе 1С есть встроенный редактор - форматированный документ. На наш скромный взгляд, использование типового встроенного редактора обладает рядом ограничений и не позволяет довольно комфортно проводить визуальное редактирования документа.
Краткое описание возможностей примера:
- пример выполнен в форме внешней обработки на управляемых формах;
- добавлен переключатель между двумя типами редакторов;
- для демонстрации минимальных возможностей взаимодействия добавлены две команды: для получения и установки кода 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 документ) :
4. Для использования в веб клиенте библиотеки этих редакторов необходимо разместить вручную в каталоге веб сервера, настроить разрешение на доступ к этим директориям. Для выгрузки необходимых файлов в обработке реализована команда "выгрузить библиотеки для веб".
5. Как в веб клиенте (браузере) выполнить JS?
- для ie : Элементы.ПолеHTMLДокумента.Документ.parentWindow.eval(JS);
- для других : Элементы.ПолеHTMLДокумента.Документ.defaultView.eval(JS);
Специальные предложения
(27)
1. В 8.3.15.1565 используется движок webkit. Поэтому надо заменить
Элементы.ПолеHTMLДокумента.Документ.parentWindow (для ie)
на
Элементы.ПолеHTMLДокумента.Документ.defaultView (для других браузеров)
Ну или написать такую конструкцию:
2. Видимо в этой версии отрубили вызов функции eval - некоторые говорят так "eval is evil"
3. Вызвать надо так
4. Либо поставить заглушку:
в код страницы html добавить js
(3) Denchik1388, принципиальной разницы в интеграции этих редакторов нет. Однако, стоит обратить на версии браузеров (про совместимость можно узнать на официальных ресурсах) с очень древними будут очевидно проблемы.
Если же используете web-клиента для 1С, то тут естественно есть определенные особенности как в работе приложения, так и с доступом к библиотекам.
И спасибо за 5й пункт, я не знал, пришлось пользоваться так ЭлементыФормы.Браузер.Navigate("javascript: " + JS_Код)
Написал почтовик, и использовал тип поля "ФорматированныйДокумент". Ну ни вкакую Таблицы не хочет ни рисовать ни вставлять. Получать получает нормальный текст входящего письма.
Данное решение нужно будет фундаментально дописывать для моего случая?
1. Форматированный документ не умеет работать достаточной гибкостью с таблицами. В текущей обработке используются: поле HTML и Java-Script фреймворк (TinyMCE или CK Editor).
Данный функционал я использовал, когда для 1С и конфигурации ERP в рамках улучшения CRM писал обработку замену "Outlook" для работы с MS-Exchange Server (через веб сервисы)
2. Зависит от того что вы хотите реализовать. Если процесс работы выглядит следующим образом: передать на форму html код, потом вернуть редактируемый результат, то не сложно, на мой взгляд.
(7)Хотелось бы:
1. Набор команд форматирования текста исходящего письма
2. вставка и копирование текста включая таблицы ссылки картинки а также их форматирование.
Можно ли получить эту форму которая у вас приведена в последнем скриншоте?
судя по всему ничего не получишь, 159 скачали, но воспользоваться думаю не смогли и спрашивать не стали даж тут .
(14)
1. Пример рабочий, никаких котов в мешке.
2. Вы сами скачивали и пробовали, чтобы делать такие выводы? Или это все голословно?
(15) проверил в другой конф - работает, прощу извинить
в упп в управляемом режиме - не работает, видимо надо режим совместимости мешает
(8) Я делал проект почтовый клиент для Outlook взаимодействующий через rest API.
Просьб много и пожалуй в ближайшее время я выложу этот клиент из 1С, только придется его доработать под ресурс инфостарт.
Почему возникает ошибка?
Использование синхронных методов на клиенте запрещено
(9) У тебя наверное режим конфы такой включен, публикации уже 100 лет, раньше было так.
переделай на "НачатьПолученияКаталогаВременныхФайлов"
Пытался устанавливать код HTML в редактор при открытие формы, но не получается, т.к. HTML поле не успевает создаться (пишет ошибку в Элементы.СодержаниеHTML.Документ.parentWindow.eval("tinyMCE.activeEditor.setContent('"+html+"');");)
Может быть есть способ как-то дожидаться HTML поля? Или, тупо, ждать некоторое время перед запуском ПроверитьИнициализироватьБиблиотеки() ?
писал коммент, уже по существу, написало в итоге ответ - на модерации и . исчезло.
хотел сообщить момент.
поиграл с TinyMCE последней версией, все красиво, работает, но есть но, которое сводит все это на НЕТ в моем случае.
копируем часть таблицы excel вставляем в TinyMCE - формат теряется (объем потери зависит от настройки TinyMCE), на сайте TinyMCE в примерах все красиво - спрашивает вам сохранить формат или без. также есть фак где пишут как после 2014 года такое замутить, но проблема в том, что по факу и правда вставляет похоже по формату, но далеко не все. пока не посмотрел исходный код страницы TinyMCE с полным примером. оказалось, там они используют плагин PowerPaste который премиум, и на секунду замрите, стоимость его на своем сервере (одна штука) . 1800$. казалось бы. простое поле HTML документа копи пастит таблицы офиса один к одному, без таких вот премиальных плагинов.
поэтому, не смотря на всю заманчивость, красоту и удобство, остаюсь на простом поле HTML с кнопками своими .
ну или подскажите как такое безобразие обойти.
Читайте также: