Pull to refresh

Внешнее воздействие на веб-клиент 1С: Предприятие

Reading time 4 min
Views 8.2K

Внешнее воздействие на веб-клиент 1С: Предприятие


Описанный метод позволяет организовать контейнер средствами html и JavaScript и поместить в него веб-клиент 1С. При этом контейнеру доступно управление веб-клиентом, как на уровне алгоритмов, так и на уровне управления стилями. Подход отрабатывался на 1С версии 8.2.18.96.

Настройка на стороне веб-сервера

Каждый веб-клиент 1С работает с опубликованной на веб-сервере информационной базой. Для более полной интеграции контейнер, в который будет встроен веб-клиент, необходимо создавать на этом же сервере. Это позволит избежать проблем с безопасностью, связанных с кросс-доменными обращениями. Например, Silverlight и Flash не позволяют обращаться к контенту других сайтов, если не настроены соответствующие политики в виде xml-файлов. Post-запросы между доменами также могут быть затруднительными.

Настройка Apache хранится в файле conf/httpd.conf

Расположение файла в Far

Изменить нужно значение путей. Ниже приведены значения для пути c:/Apache.www — в нем хранятся ссылки на информационные базы 1С.

DocumentRoot "C:/Apache.www"
<Directory "C:/Apache.www">


Предварительная настройка

Проект Html-файла лучше начать с готового шаблона, где прописаны стили на все случаи браузеров. Весьма достойный шаблон находится по адресу html5boilerplate.com

Поместить его следует в корневой каталог документов, который был указан при настройке веб-браузера. За домашнюю страницу сейчас отвечает файл index.html — его нужно править.

На всякий случай выставляем режим совместимости браузера — совместимость с самым последним:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">


Используемый шаблон работает с jQuery.

Запуск веб-клиента 1С будет происходить в IFrame внутри index.html. Первая кнопка будет отвечать за запуск приложения 1С App, вторая — за запуск приложения NetBridge.

<div id="container">
    <button id="appButton">Приложение 1</button>
    <button id="netBridgeButton">Приложение 2</button>
    <iframe id="iframe"/>
</div>


Обработчик нажатий на кнопки выглядит таким образом:

$(document).ready(function () {
    $("#appButton").click(function () {
        $("#iframe").attr("src", "App/ru_RU/?N=Администратор");
    });

    $("#netBridgeButton").click(function () {
        $("#iframe").attr("src", "NetBridge/ru_RU/?N=Сергей");
    });
...


На этом этапе можно воздействовать на параметры запуска веб-клиента. Например, передать имя пользователя (N=Администратор) и пароль.

Реакция на события веб-клиента

Первое событие, которое необходимо отловить — это событие, когда веб-клиент 1С загрузился и готов к использованию.

IFrame реализует событие onload, на которое можно подписаться. Проблема заключается в том, что для веб-клиента onload может вызываться до 3х раз. такой вызов связан с перенаправлениями, например, веб-клиент 1С перенаправляет веб-клиент с учетом языка пользователя. Опытным путем удалось установить, что последний вызов onload связан с появлением объекта WebUI в веб-клиенте. Но процесс инициализации 1С на этом не закончен. На этом этапе не подгружены нужные библиотеки и не создан интерфейс главной формы. За признак создания главного интерфейса можно взять момент, когда переменная initialized станет равна true.

К переменным веб-клиента 1С можно обращаться через конструкцию:

cw = $("#iframe").get(0).contentWindow;


Обработчики будут выглядить так:

$(document).ready(function () {
    ...
    $('#iframe').load(function () {
        //Вызовы происходят несколько раз. Они связаны с переадресацией на ru_RU, например
        if ("WebUI" in $("#iframe").get(0).contentWindow) {
            var cw = $("#iframe").get(0).contentWindow;

            setTimeout(function () {
                desktopLoadedComplete();
            }, 50);
        }
    });
});


В результате цепочки событий будет вызвана функция desktopLoadedComplete:

desktopLoadedComplete = function () {
    var cw = $("#iframe").get(0).contentWindow;
    if ($("#iframe").get(0).contentWindow.Web.Application.initialized) {
         //alert(cw.Web.Common.Version);
         themes = cw.winManager.controls["themes"];
         themes.setListener(handleEvents);

         $('span.themeLink', $("#iframe").contents()).css('text-decoration', 'line-through');
    }
    else {
         setTimeout(function () {
             desktopLoadedComplete();
        }, 50);
    }
}


В desktopLoadedComplelte можно воздействовать на форму 1С. Например, сделать буквы выбора разделов зачеркнутыми. Для этого подойдет конструкция jQuery:

$('span.themeLink', $("#iframe").contents()).css('text-decoration', 'line-through');


Измененный дизайн веб-клиента 1С

За окно разделов отвечает объект winManager.controls[«themes»] типа WebUI.ThemesPanel. Этот тип наследован от WebUI.NavigationControl, который в свою очередь наследован от WebUI.Control и Web.Events.EventsBase.

Опытным путем удалось подключиться к событию переключения раздела. Выглядит это так:

themes = cw.winManager.controls["themes"];
themes.setListener(handleEvents);


В обработчик событий handleEvents поступает несколько параметров, среди которых — источник события, код события. Для анализа переключения разделов обработчик будет таким:

handleEvents = function (sender, eventId, data0) {
    var cw = $("#iframe").get(0).contentWindow;
    if (eventId == cw.Web.Events.UIThemeButtonClickedEvent) {
        alert("eventId = Web.Events.UIThemeButtonClickedEvent");

        cw.winManager.handleEvents(sender, eventId, data0);
    }
}


При переключении раздела будет вызвано диалоговое окно и передано управление родному обработчику событий 1С.

Выводы

Html, JavaScript и jQuery предоставляют мощные средства для управления веб-клиентом 1С извне. Доступны передача параметров (логин, пароль), управление оформлением и стилями, подписка на события. Веб-клиент 1С содержит мощный фреймворк, который требует долгого времени, чтобы разобраться с ним.

В статье не охвачена операция вызова серверных и клиентских процедур, но такая возможность теоретически есть.

Статья интересна также при использовании поля HTML на веб-клиенте без предложенной технологии. Так как в этом случае вся инфраструктура 1С также доступна через родительское окно. В теории при вызове в таком контексте серверных процедур можно организовать взаимодействие между пользовательским html-кодом и родными элементами управления 1С. Такой вариант — альтернатива использованию WebBrowser Control, что означает отвязку от Windows.

Исходный код веб-сайта: web-site.zip (86,88 kb)
Tags:
Hubs:
+5
Comments 0
Comments Leave a comment

Articles