При работе с веб-клиентом 1С:Предприятие 8.3 разработчики часто сталкиваются с необходимостью расширить стандартный функционал с помощью собственных JavaScript-скриптов. Типичный сценарий: при анализе страницы в браузере видна ссылка вида scripts?sysver=8.3.15.1565, однако попытки найти соответствующую папку scripts в каталоге установки сервера (особенно на ОС Linux/CentOS) не приносят результата. В этой статье мы разберем внутреннюю архитектуру платформы и выясним, как правильно интегрировать свой код, не пытаясь "взломать" программные файлы 1С.
Проанализируем структуру платформы 1С. В отличие от классических веб-приложений, где статические файлы (JS, CSS, изображения) лежат в открытом виде в директориях веб-сервера, 1С использует механизм динамической генерации контента. Запрос к scripts обрабатывается не файловой системой, а специальным модулем расширения веб-сервера (например, mod_1c20.so для Apache или isapi_1c83.dll для IIS).
Сами исходные коды JavaScript упакованы внутри бинарных ресурсов платформы. В случае CentOS они "зашиты" в библиотеки, такие как core83.so или другие файлы ресурсов в директории /opt/1cv8/x86_64/.... При обращении клиента расширение веб-сервера извлекает нужные скрипты из бинарного файла, формирует общий пакет и отдает его браузеру. Именно поэтому команда locate или поиск по файловой системе ничего не находят.
Если нам нужно запустить свой скрипт (например, для работы с WebSocket по адресу 127.0.0.1:15739), наиболее правильным и безопасным методом в рамках идеологии 1С является использование объекта ПолеHTMLДокумента. Рассмотрим, как это реализовать по шагам.
Во-первых, создадим на управляемой форме реквизит с типом Строка (неограниченной длины) и перетащим его на форму, установив вид Поле HTML документа. Во-вторых, программно сформируем HTML-контент, включающий наш JavaScript.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекстHTML =
"<html>
|<head>
|<script>
| function connectWebSocket() {
| var socket = new WebSocket('ws://127.0.0.1:15739');
| socket.onopen = function() {
| console.log('Соединение установлено');
| };
| socket.onmessage = function(event) {
| // Передаем данные обратно в 1С
| window.external.onEvent1C(event.data);
| };
| }
|</script>
|</head>
|<body onload='connectWebSocket()'>
| <h1>WebSocket Bridge Active</h1>
|</body>
|</html>";
ЭтаФорма.РеквизитПолеHTML = ТекстHTML;
КонецПроцедуры
Для взаимодействия JavaScript с кодом 1С используем событие ПриНажатии или специализированные обработчики, доступные в ПолеHTMLДокумента. Важно помнить, что в веб-клиенте такой скрипт будет работать в контексте безопасности браузера пользователя. Для реализации нестандартных интерфейсных сценариев в веб-клиенте подойдёт пример использования поля HTML документа для расширения возможностей ввода.
Если задача стоит более глобально — например, внедрить скрипт во все страницы веб-клиента без изменения конфигурации 1С, мы можем воспользоваться возможностями самого веб-сервера Apache, установленного на CentOS. Разберем ситуацию, когда мы хотим добавить <script src="..."> в поток данных.
Для этого в конфигурационном файле Apache (обычно это /etc/httpd/conf/httpd.conf или файл в conf.d) можно использовать модуль mod_substitute. Проанализируем пример настройки:
<Location "/your_1c_base">
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|</head>|<script src='/my_scripts/custom.js'></script></head>|ni"
</Location>
В данном случае сам файл custom.js должен физически располагаться в папке, к которой у Apache есть доступ (например, /var/www/html/my_scripts/). При каждом запросе страницы веб-клиента Apache будет находить тег </head> и вставлять перед ним ссылку на ваш скрипт. Это позволяет "подмешивать" свой код в среду выполнения 1С, однако следует соблюдать осторожность, чтобы не нарушить работу стандартных функций платформы.
Рассмотрим ситуацию, когда JavaScript в браузере не обладает достаточными правами для работы с локальным оборудованием или специфическими портами. В этом случае вместо правки JS-скриптов правильнее будет разработать внешнюю компоненту. Для Linux (CentOS) компоненты пишутся на языке C++ или Rust и компилируются в .so файлы.
Внешняя компонента работает непосредственно в контексте процесса 1С и может использовать любые системные библиотеки для работы с WebSocket. Выясним преимущества этого подхода: он не зависит от браузера, стабильно работает в тонком клиенте и позволяет передавать данные в 1С через события (ВнешнееСобытие). При необходимости можно воспользоваться готовой внешней компонентой WebSocket-клиента для 1С.
Проанализируем версию платформы, указанную в вопросе (8.3.15). На тот момент встроенных средств для прямой работы с протоколом ws:// в языке 1С практически не было. Однако, начиная с версии 8.3.18, в платформе появился объект InternetConnection и расширенная поддержка протоколов связи. Если у вас есть возможность обновить платформу, рекомендуем рассмотреть использование штатных механизмов HTTPСоединение или новых объектов для работы с асинхронными запросами, что может избавить от необходимости внедрения чистого JavaScript.
Подведем итог нашему исследованию. Пытаться найти физическую папку scripts на сервере 1С бесполезно — она виртуальна. Для решения задачи подключения по WebSocket мы рекомендуем:
Помните, что любое вмешательство в работу стандартных скриптов 1С через веб-сервер может привести к трудноуловимым ошибкам при обновлении платформы, так как структура внутренних JS-библиотек меняется от версии к версии.