Управляемые формы: Поле HTML Документа и веб-клиент

18.07.16

Разработка - Работа с интерфейсом

Взаимодействие javascript и интерфейса 1С дает огромные возможности для реализации нестандартных функций. Раньше можно было напрямую вызывать функции JavaScript через DOM объект document Поля HTML документа. В современных браузерах эта возможность ушла. Более того, в веб-клиенте появляется тип ВнешнийОбъект, который вообще нигде не описан. На Инфостарте были предложения вызывать JavaScript через fireEvent, но это очень неудобно. Предлагаю свой вариант решения.

Вступление

Взаимодействие javascript и интерфейса 1С дает огромные возможности для реализации нестандартных функций. Раньше можно было напрямую вызывать функции JavaScript через DOM объект document Поля HTML документа. В современных браузерах эта возможность ушла. Более того, в веб-клиенте появляется тип ВнешнийОбъект, который вообще нигде не описан. На Инфостарте были предложения вызывать JavaScript через fireEvent, но это очень неудобно. Предлагаю свой вариант решения.

С чего все началось

Разбираться с HTML полем меня сподвигло большое количество задач, в которых была необходимость реализовать интерактивные карты с мониторингом, маршрутизацией и т.д. Поскольку встроенными средствами 1С сделать это невозможно, то раньше использовал ActiveX компоненту собственного изготовления. На обычных формах все работало приемлимо, не считая, что решение и рядом не стояло с открытыми фреймворками типа OpenLayers. После появления управляемых форм, была попытка встроить все тот же ActiveX в HTML документ и разместить его в поле. Решение работает, но в виду ужесточения политики безопасности Microsoft, требовало изменения настроек безопасности на каждом клиенте, что в конечном счете оказалось неприемлимым. Вот тогда мы и поставили перед собой задачу, прикрутить к управляемым формам карты на основе Web-движков (Яндекс.Карты, OpenLayers и прочие Tile ориентированные движки).

Вариант 1. Работает в толстом клиенте, работает в тонком клиенте, не работает в веб-клиенте

Суть метода заключается в получении свойства parentWindow элемента формы ПолеHTMLДокумента. Выглядит примерно так:

<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    <script>
      function HelloWorld(FormLink)
      {
        FormLink.WebMapJavascriptAction("Hello from outside!");
        return "Hello world!";
      }
    </script>
  </head>
  <body>
  </body>
</html>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	WebКартаРеквизитФормыСтрока = Обработки.УНП_WEBКарта.ПолучитьМакет("HTMLМакет").ПолучитьТекст();
КонецПроцедуры

&НаКлиенте
Процедура WebКартаДокументСформирован(Элемент)
    Сообщить(Элементы.WebКарта.Документ.parentWindow.HelloWorld(ЭтаФорма));
КонецПроцедуры

&НаКлиенте
Процедура WebMapJavascriptAction(Переменная) Экспорт
    Сообщить(Переменная);
КонецПроцедуры

Все это прекрасно работает в толстом и тонком клиенте, но в веб-клиенте это работать не будет, так как в веб-клиенте у ПоляHTMLДокумента в свойстве Документ нет parentWindow.

Вариант 2. Работает в Толстом клиенте, тонком клиенте, веб-клиенте (проверено Chrome, IE, Edge)

Для реализации этого варианта необходимо немного исправить HTML макет. А именно:

<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=9" />    
  </head>
  <body>
  </body>
  <script>
    document.body.HelloWorld = function(FormLink)
    {
      FormLink.WebMapJavascriptAction("Hello from outside!");
      return "Hello world!";
    }
  </script>
</html>

И небольшие правки в коде формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПовторноеСрабатывание = Ложь;
	WebКартаРеквизитФормыСтрока = Обработки.УНП_WEBКарта.ПолучитьМакет("HTMLМакет").ПолучитьТекст();
КонецПроцедуры

&НаКлиенте
Процедура WebКартаДокументСформирован(Элемент)
    Если Не ПовторноеСрабатывание Тогда // В некоторых случаях, при подключении дополнительных библиотек,
                                        //событие может сработать повторно в уже загруженном документе
       ОбъектBody = Неопределено;

       Попытка
          ОбъектBody = Элементы.WebКарта.Документ.parentWindow.document.body;
       Исключение
       КонецПопытки;

       Если Не ЗначениеЗаполнено(ОбъектBody) Тогда
          Попытка
             ОбъектBody = Элементы.WebКарта.Документ.body;
          Исключение
          КонецПопытки;
       КонецЕсли;

       Если Не ЗначениеЗаполнено(ОбъектBody) Тогда
          Сообщить("Что-то пошло не так");
       Иначе
          Сообщить(ОбъектBody.HelloWorld(ЭтаФорма));
       КонецЕсли;
       
       ПовторноеСрабатывание = Истина;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура WebMapJavascriptAction(Переменная) Экспорт
    Сообщить(Переменная);
КонецПроцедуры

Таким образом для толстого и тонкого клиента мы оставляем все как и было, но для универсальности используем расширенный нами объект DOM body. В веб-клиенте элемент формы ПолеHTMLДокумента.Документ содержит тип ВнешнийОбъект, что на самом деле является COM реализацией элемента body по структуре DOM.

Теоретически можно написать функцию в body, которая вернет ссылку на window, и тогда можно вызывать глобальные функции.

Надеюсь кому-то поможет ;-)

ПолеHTMLДокумента веб-клиент Поле ХТМЛ документа HTML ВнешнийОбъект JavaScript

См. также

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    18247    25    6    

39

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    12917    mrXoxot    43    

114

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    6183    smielka    37    

98

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    13545    816    elcoan    47    

114

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    11221    160    acces969    31    

121

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    5066    kalyaka    6    

33

Работа с интерфейсом Программист Пользователь Платформа 1С v8.3 8.3.14 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Ещё с времен платформы 8.3.13 можно изменять цвет стилей интерфейса главного окна. Данное расширение позволит вам выбрать из подготовленных десятка стилей на свой вкус.

1 стартмани

01.07.2022    22993    370    rpgshnik    65    

93
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VitaliyCeban 464 18.07.16 14:13 Сейчас в теме
Более полное раскрытие вопроса http://infostart.ru/public/398366/
yaroslav.artem; McLer; Yashazz; compguru84; +4 Ответить
2. compguru84 95 18.07.16 15:12 Сейчас в теме
(1) VitaliyCeban, Согласен, defaultView будет работать в Веб-клиенте
3. Yashazz 4774 19.07.16 16:04 Сейчас в теме
А уж первым-то вариантом и вовсе в замшелые времена пользовались, безо всяких извратов с актив-иксом.
Я ещё в 2012-м году продемонстировал все эти приёмы на примере работы с API Яндекс-карт.

Баян, короче. Вы уж извините, уважаемый комп-гуру)))
compguru84; +1 Ответить
4. compguru84 95 19.07.16 17:11 Сейчас в теме
(3) Yashazz, Да бывает :-) Я, по правде говоря, за оригинальностью и не стремился )
5. adhocprog 1141 20.07.16 19:18 Сейчас в теме
Спасибо автору )
AlexK_2012; frkbvfnjh; compguru84; +3 Ответить
6. compguru84 95 20.07.16 20:09 Сейчас в теме
(5) adhocprog, Если поможет хотя бы одному человеку, значит не напрасен был мой труд :-)
7. kail_riss 10 22.02.18 15:54 Сейчас в теме
Добрый вечер.
Сделал макет в нем разместить текст как в статье, на форму добавил реквизит Док с типом строка, а на форму ДокФормы с типом Поле HTML документа. На Сервере читаю данные макета и пишу их в реквизиты Док. Когда нажимаю на кнопку ругается:
"{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(86)}: Метод объекта не обнаружен (HelloWorld)

Сообщить(Элементы.ДокФормы.Документ.parentWindow.HelloWorld(ЭтаФорма));"

Не передаю Поле HTML документа текст скрипта?
8. PopovaNat 28.06.18 12:13 Сейчас в теме
спасибо за статью, когда только начинаешь разбираться с html в 1с такие простые примеры помогают понять лучше
9. frkbvfnjh 802 13.09.19 13:43 Сейчас в теме
Спасибо, статься помогла! Описаны очень тонкие моменты, коротко и ясно.
10. maxcyb@yandex.ru 21.09.19 23:53 Сейчас в теме
"Теоретически можно написать функцию в body, которая вернет ссылку на window"

Как это сделать? Можно пример?
11. Urmas 16.06.22 09:57 Сейчас в теме
НеприемлЕмо писать "неприемлИмо".
Аж глаз режет. Поправьте, пожалуйста.
Andr0med; +1 Ответить
Оставьте свое сообщение