Внешнее воздействие на веб-клиент 1С: Предприятие
Описанный метод позволяет организовать контейнер средствами html и JavaScript и поместить в него веб-клиент 1С. При этом контейнеру доступно управление веб-клиентом, как на уровне алгоритмов, так и на уровне управления стилями. Подход отрабатывался на 1С версии 8.2.18.96.
Настройка на стороне веб-сервера
Каждый веб-клиент 1С работает с опубликованной на веб-сервере информационной базой. Для более полной интеграции контейнер, в который будет встроен веб-клиент, необходимо создавать на этом же сервере. Это позволит избежать проблем с безопасностью, связанных с кросс-доменными обращениями. Например, Silverlight и Flash не позволяют обращаться к контенту других сайтов, если не настроены соответствующие политики в виде xml-файлов. Post-запросы между доменами также могут быть затруднительными.
Настройка Apache хранится в файле conf/httpd.conf
Изменить нужно значение путей. Ниже приведены значения для пути 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');
За окно разделов отвечает объект 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)
Автор: Elisy