Как выполняется клиентский код в веб-клиенте 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Вопрос о том, что происходит с кодом на встроенном языке 1С при запуске в браузере, часто вызывает споры среди разработчиков. Многие ошибочно полагают, что 1С просто переписывает код на JavaScript. В этой статье мы подробно разберем внутреннюю кухню веб-клиента, проанализируем путь клиентского кода от конфигуратора до исполнения в браузере и выясним, почему возможности &НаКлиенте имеют определенные ограничения.

Эволюция механизмов исполнения: от трансляции к виртуальной машине

Рассмотрим историю развития технологий 1С для веба. На ранних этапах развития веб-клиента платформа действительно использовала механизм прямой трансляции (конвертации). Код, написанный разработчиком на встроенном языке, преобразовывался в эквивалентный код на JavaScript. Однако такой подход имел ряд существенных недостатков:

  1. Различия в поведении: Было крайне сложно добиться идентичного исполнения кода в тонком клиенте (где используется нативный интерпретатор) и в веб-клиенте (где работал транслированный JS).
  2. Производительность: Прямая трансляция не всегда позволяла эффективно оптимизировать выполнение сложных алгоритмов.
  3. Сложность поддержки: Любое изменение в синтаксисе встроенного языка требовало обновления правил трансляции для веб-клиента.

Проанализируем современную ситуацию. Начиная с определенных версий платформы 8.3, архитектура была унифицирована. Теперь веб-клиент работает по той же логике, что и тонкий клиент. Код компилируется в байт-код — промежуточное представление, которое не зависит от операционной системы или браузера. Этот байт-код передается на сторону клиента, где его исполняет специальный интерпретатор.

Как устроена виртуальная машина 1С внутри браузера

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

В состав этого фреймворка входит полноценная виртуальная машина (ВМ), написанная на JavaScript. Рассмотрим основные этапы ее работы:

  1. Загрузка байт-кода: Клиентские модули конфигурации (например, модули форм или команды) передаются с сервера в виде скомпилированного байт-кода.
  2. Интерпретация: Виртуальная машина на JS читает инструкции байт-кода и выполняет соответствующие операции. Если в коде встречается оператор Если...Тогда, ВМ обрабатывает его логику внутренними средствами, не превращая каждую проверку в отдельную конструкцию JS.
  3. Управление состоянием: ВМ хранит значения переменных, стек вызовов и контекст выполнения, обеспечивая изоляцию и предсказуемость кода.

Разберем пример простого условия, которое мы пишем в конфигураторе:


&НаКлиенте
Процедура ОбработкаКоманды(Команда)
    Переменная = 10;
    Если Переменная > 5 Тогда
        Сообщить("Значение больше пяти");
    КонецЕсли;
КонецПроцедуры

Этот код превратится в набор низкоуровневых команд (PUSH 10, STORE Переменная, LOAD Переменная, CMP 5, JMP_IF_LESS...), которые интерпретатор внутри 1cv8c.js будет последовательно обрабатывать. Именно поэтому поведение кода &НаКлиенте практически идентично во всех браузерах и в тонком клиенте.

Почему на клиенте отсутствуют некоторые типы данных?

Часто возникает вопрос: если в браузере работает мощная виртуальная машина, почему мы не можем использовать ТаблицаЗначений или Запрос непосредственно в клиентском коде? Выясним причины этих ограничений, которые продиктованы архитектурой клиент-серверного взаимодействия.

1. Экономия ресурсов браузера. Браузерные движки имеют лимиты на потребление оперативной памяти. Объект ТаблицаЗначений может содержать миллионы строк. Если позволить его создание на клиенте, это неизбежно приведет к «падению» вкладки браузера при попытке обработки больших массивов данных. Платформа принудительно ограничивает разработчика использованием объектов типа ДанныеФормыКоллекция, которые работают по принципу «ленивой загрузки» — на клиент передаются только те строки, которые видны пользователю.

2. Сериализация и трафик. Любой объект, передаваемый между сервером и веб-клиентом, должен быть сериализован (превращен в поток данных, обычно JSON или XDTO). Тяжелые объекты вроде ТаблицаЗначений крайне неэффективны для передачи по сети. Использование специализированных типов данных 1С позволяет оптимизировать этот процесс, передавая только дельту (изменения) данных.

Современные технологии: PWA и WebAssembly

Посмотрим на развитие веб-клиента в последних версиях платформы 8.3.18 и выше. 1С активно внедряет современные веб-стандарты, такие как PWA (Progressive Web Apps). Это позволяет «установить» веб-клиент как обычное приложение на рабочий стол. При этом техническая суть не меняется — внутри все так же работает виртуальная машина на JS, но она получает расширенные права доступа к локальным ресурсам компьютера через API браузера.

Проанализируем потенциал технологии WebAssembly (WASM). В будущем 1С может перенести критические узлы виртуальной машины с чистого JavaScript на WebAssembly. Это позволит выполнять байт-код 1С со скоростью, практически равной нативным приложениям, что окончательно сотрет разницу в производительности между веб-клиентом и тонким клиентом.

Безопасность и отладка клиентского кода

Рассмотрим вопрос защиты интеллектуальной собственности. Если клиентский код исполняется в браузере, можно ли его украсть? Платформа применяет несколько уровней защиты:

Механизм отладки в веб-клиенте также заслуживает внимания. Поскольку код исполняется внутри «черного ящика» виртуальной машины 1С в браузере, стандартные инструменты разработчика Chrome (DevTools) не покажут вам точки останова в 1С-ном коде. Отладка работает через специальный HTTP-канал: конфигуратор связывается с сессией веб-клиента, а виртуальная машина в браузере приостанавливает выполнение и передает значения переменных обратно в конфигуратор по запросу.

Взаимодействие с оборудованием через Native API

Поскольку веб-клиент работает в песочнице браузера, он не может напрямую вызывать DLL или работать с COM-объектами. Для решения этой задачи используется технология Native API. Разберем по шагам, как это работает:

  1. Разработчик подключает внешнюю компоненту, написанную по стандарту Native API.
  2. Берется специальная сборка компоненты для браузера (обычно это расширение или бинарный файл, взаимодействующий через специальное приложение-посредник).
  3. Виртуальная машина 1С через JavaScript-прослойку вызывает методы этой компоненты, обеспечивая работу с фискальными регистраторами, сканерами штрихкодов или принтерами этикеток.

Таким образом, хотя веб-клиент и накладывает определенные ограничения на использование системных ресурсов, архитектура с виртуальной машиной обеспечивает высокую кроссплатформенность и надежность исполнения бизнес-логики &НаКлиенте.

← На главную