Как 1С выполняет код в веб-клиенте? Архитектура и внутренняя кухня

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

Многие разработчики, впервые открывшие инструменты разработчика (F12) в браузере при работе с веб-клиентом «1С:Предприятия», испытывают легкий шок. Вместо привычного структурированного кода они видят огромные файлы со сложной, практически нечитаемой структурой на JavaScript. Возникает закономерный вопрос: как именно встроенный язык 1С превращается в инструкции, понятные веб-браузеру? Действительно ли происходит прямая трансляция «1С в JS», или за этим скрывается более сложная инженерная архитектура? Давайте подробно разберем этот процесс, изучим историю развития технологии и заглянем во внутреннее устройство веб-клиента.

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

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

Однако этот подход быстро зашел в тупик по нескольким важным причинам:

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

Чтобы решить эти проблемы, архитектуру кардинально переработали. Выясним, как это устроено сейчас. Тонкий клиент компилирует встроенный язык 1С в промежуточный собственный байт-код. На стороне клиента этот байт-код интерпретируется и выполняется виртуальной машиной, написанной на C++. По этому же пути решили направить и веб-клиент.

В современном веб-клиенте схема работы выглядит следующим образом:

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

Такой подход позволил разработчикам платформы обеспечить 100% идентичность выполнения кода на любом клиенте. Виртуальная машина в браузере оперирует теми же абстракциями, типами данных и правилами, что и нативный тонкий клиент.

Почему в инструментах разработчика (F12) мы видим «дикий трэш»?

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

Изначально фирма 1С использовала собственный обфускатор, но размер загружаемого JS-кода оставался огромным (около 1,5 МБ), что негативно сказывалось на скорости первой загрузки веб-клиента. Впоследствии платформа перешла на промышленное решение — компилятор Google Closure Compiler в связке с библиотекой Google Closure Library.

Использование инструментов от Google дает несколько мощных преимуществ:

Обратной стороной такой оптимизации является полная нечитаемость кода для человека. Попытка отлаживать этот код напрямую через F12 без исходных Source Maps не имеет практического смысла.

Внутренняя структура веб-клиента

Посмотрим на внутреннее устройство веб-клиента. Это не единый монолитный файл, а сложнейшая модульная система, структурированная аналогично крупным приложениям на Java или .NET. Вся клиентская JavaScript-часть платформы разделена на четыре масштабных проекта:

Внутри самого веб-клиента можно выделить несколько ключевых логических подсистем:

  1. Управляемый интерфейс и элементы управления: Реализует отображение и поведение около 30 типов визуальных компонентов (кнопки, таблицы форм, динамические списки, декорации, диаграммы). Каждый элемент управления на сервере имеет своего JS-двойника на клиенте.
  2. Клиентская объектная модель: Описывает более 400 типов данных 1С на клиенте. Сюда входят такие структуры, как Структура, Массив, Соответствие, настройки компоновки данных, условное оформление и метаданные, доступные на клиенте.
  3. Интерпретатор встроенного языка (виртуальная машина байт-кода): Тот самый движок, который построчно выполняет скомпилированные инструкции вашей конфигурации.
  4. Расширения для браузеров: Специальные модули и плагины, позволяющие веб-клиенту выходить за рамки стандартной «песочницы» браузера. Они обеспечивают работу с локальными файлами на диске, криптографию, работу с торговым оборудованием и подключение внешних компонент.

Как передаются данные и команды между браузером и сервером?

Разберем по шагам, как происходит интерактивное взаимодействие пользователя с системой. Общение веб-клиента с сервером 1С строится по стандартному протоколу HTTP/HTTPS через веб-сервер (например, IIS или Apache), на котором опубликована информационная база.

Примечательно, что тонкий клиент при подключении через интернет (по HTTP) и веб-клиент используют абсолютно одинаковый набор веб-сервисов платформы для обмена данными. Данные форм, командный интерфейс и прикладные объекты сериализуются в оптимизированные JSON-подобные структуры данных, передаются в браузер и там разбираются клиентским JS-движком.

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

Если необходимо встроить веб-клиент 1С в сторонний сайт, разработчики могут использовать специальный Embedded WebClient API. С его помощью база 1С запускается внутри тега <iframe> на внешнем ресурсе, а обмен данными и командами между сайтом и 1С происходит через безопасный стандартный механизм postMessage в JavaScript и специализированный объект 1С ОкноВнешнегоСайта.

Ограничения производительности: почему код на клиенте должен быть «легким»?

Понимание архитектуры виртуальной машины объясняет ключевое правило разработки под управляемые формы: минимизируйте сложные вычисления на клиенте.

Выясним причину этого ограничения. Когда вы запускаете сложный алгоритм (например, большой цикл обработки данных или тяжелый расчет) в тонком клиенте, он выполняется виртуальной машиной, скомпилированной в быстрый нативный машинный код (C++). Когда тот же самый код запускается в веб-клиенте, он работает по принципу «двойной интерпретации»:

Движок браузера (JS) -> Интерпретирует виртуальную машину 1С (JS) -> Которая интерпретирует байт-код 1С.

Такой "сэндвич" из интерпретаторов снижает скорость математических расчетов и работы с коллекциями в веб-клиенте в несколько раз по сравнению с тонким клиентом. Именно поэтому стандарты разработки фирмы 1С требуют переносить любые сложные расчеты на сервер с помощью директив &НаСервере или &НаСервереБезКонтекста, оставляя клиентскому коду только интерактивные функции: открытие форм, вопросы пользователю, простейшие визуальные изменения и проверку заполнения реквизитов.

Разберем практический пример

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


&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТаблицы <> Неопределено Тогда
        СтрокаТаблицы.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
    КонецЕсли;
КонецПроцедуры

Давайте проанализируем, что происходит под капотом веб-клиента при выполнении этой процедуры:

  1. При открытии формы байт-код этой процедуры уже загружен в память виртуальной машины 1С в браузере и закэширован.
  2. Пользователь меняет число в поле «Количество» на веб-странице и нажимает Enter или переводит фокус.
  3. Стандартное событие браузера change перехватывается подсистемой элементов управления веб-клиента.
  4. Визуальный компонент передает управление виртуальной машине байт-кода 1С, указывая на обработчик изменения.
  5. Интерпретатор байт-кода начинает построчно выполнять инструкции. При обращении к Элементы.Товары.ТекущиеДанные виртуальная машина обращается к клиентской объектной модели, написанной на JS, которая находит нужный элемент в DOM-дереве страницы и возвращает структуру данных текущей строки.
  6. Происходит математическое умножение. Операция выполняется силами JS-интерпретатора.
  7. Результат записывается в свойство Сумма клиентской модели данных.
  8. Подсистема отображения (Data Binding) мгновенно реагирует на изменение модели данных и обновляет значение в соответствующем HTML-элементе input на экране пользователя без отправки запроса на сервер.

Благодаря такой сложной, но детально продуманной архитектуре, разработчики 1С могут писать код один раз, будучи уверенными, что он запустится и на Windows-компьютере в тонком клиенте, и на планшете iPad в Safari, и на смартфоне под управлением Android.

← На главную