Особенности разработки интерфейсов 1С на javascript и интеграция с webkit

19.06.25

Разработка - Работа с интерфейсом

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

Давайте разберемся, зачем вообще в 1С делать веб-интерфейсы. Неужели встроенных возможностей не хватает?

  • Во-первых, веб-интерфейсы просто красивее. Конечно, на 1С можно создавать визуально приятные формы, но если дизайнер или заказчик предъявляет высокие требования к внешнему виду и взаимодействию, соответствовать всем пожеланиям вряд ли получится. Потому что мы можем использовать только такие компоненты, которые есть в платформе. А веб-интерфейсы позволяют реализовать практически все что угодно.

  • Во-вторых, веб-интерфейсы выполняются только на клиенте. И это важное огромное преимущество, позволяющее не выполнять лишние клиент-серверные вызовы. А когда мы делаем интерфейсы на чистом 1С любые динамические изменения интерфейса часто требуют обращения к серверу.

  • Кроме того, веб-интерфейсы предсказуемы с точки зрения верстки. Те, кто создавал сложные формы в 1С, знают, насколько трудно адаптировать их под разные разрешения и экраны. В первую очередь, эта проблема связана с тем, что в 1С размеры задаются в условных единицах. Например, ширина 10 – чему равняется эта 10? В зависимости от масштаба она может быть разной. В веб-приложениях с этим намного проще.

  • Ну и в целом веб-интерфейсы намного проще разрабатывать, потому что для них есть такие системы, как hot reload – мы можем писать код и сразу же видеть результат без необходимости перезапуска приложения. Это на порядок ускоряет разработку приложения и делает работу с такими интерфейсами сильно проще. Не требуется постоянно перезапускать приложение – в частности, ERP, где только запуск нужно ждать несколько минут.

 

 

Веб-интерфейсы активно используются в типовых конфигурациях.

Например, в БСП с помощью веб-интерфейса реализован просмотр результатов полнотекстового поиска.

 

 

В сервисе «Распознавание документов» с помощью веб-интерфейса реализован предпросмотр результатов распознавания – вы можете спозиционироваться на конкретном поле в табличной части документа, и оно будет выделено в окне предпросмотра.

 

 

Сервис 1С:Штамп позволяет устанавливать штамп ровно в нужное место PDF-документа для того, чтобы его проштампировать.

 

 

Новая форма легкого ЭДО из «Библиотеки электронного документоборота» тоже имеет элементы веб-интерфейса.

 

 

БухОбслуживание очень богато на красивые и удобные интерфейсы. Например, здесь мы видим монитор руководителя.

 

 

А здесь – результат проверки бухгалтерского учета по итогам аудита компании.

 

 

Кроме этого, внутренняя CRM сервиса БухОбслуживание тоже имеет веб-интерфейс.

 

 

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

 

Как это все работает? ПолеHTMLДокумента

 

 

Рассмотрим, как это все работает – в первую очередь поговорим, что собой представляет поле HTML-документа:

  • В приложениях, которые запускаются на Windows, Linux, Mac, Android, ПолеHTMLДокумента – это встроенный браузер.

  • В веб-клиенте – это iframe в браузере.

Но в обоих случаях ПолеHTMLДокумента – это именно браузер, потому что у него есть элементы управления, мы можем указать для него навигационную ссылку и элементы перехода.

 

 

С точки зрения внешнего вида ПолеHTMLДокумента – это поле, в которое загружается наша страничка. При этом платформа рисует вокруг него рамки, а это – настоящая боль для дизайнеров, им всегда хочется избавиться от рамок, чтобы получить чистый интерфейс: не как на верхней картинке, а как на нижней.

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

  • первая рамка – это граница самого поля HTML-документа;

  • а вторая рамка, желтого цвета – появляется при активности поля как текущего элемента формы.

Рамку самого поля можно замаскировать – если мы установим ее цвет в фон формы, она просто станет не видна.

Дополнено перед публикацией:
Ситуация должна быть лучше в версии платформы 8.5, там поддержали отключение рамки поля. См. Рекомендации по переходу на интерфейс "Версия 8.5" п 7.2. Рамка поля HTML-документов

А вот убрать активность поля – задача самая сложная. Но здесь можно поиграться с параметрами доступности и пропуска при вводе, и тогда эта желтая рамка исчезнет.

 

 

При этом нужно учитывать, что в тонком клиенте и веб-клиенте доступность работает по-разному.

  • В тонком клиенте она полностью блокирует все приложение, делая невозможным дальнейшее взаимодействие с ним.

  • А в веб-клиенте рамка исчезает, но все остальное продолжает работать.

 

 

Для анализа того, что происходит внутри поля HTML-документа, есть очень полезный инструмент – WebInspector. Он позволяет анализировать, что же происходит внутри веб-страницы.

Открыть веб-инспектор можно, кликнув на поле и нажав Ctrl-Alt-Shift-F12.

 

Самое главное, что есть в этом инструменте – это консоль. С ее помощью можно исполнять JavaScript-код непосредственно в запущенном приложении.

 

 

И если мы воспользуемся этой консолью и посмотрим на разных версиях платформы, где какая версия используется, окажется, что:

  • в версии платформы 8.3.26 – используется самый современный WebKit, такой же, как в iPhone 15 Pro.

  • а в версии платформы 8.3.23 использовался старый WebKit (WebKit 1), после чего его обновили.

И тут хочется задаться вопросом – действительно ли WebKit везде одинаковый?

 

 

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

JavaScript активно развивается: фактически каждый год за последние 10 лет выходила новая версия – с новыми спецификациями и новыми возможности.

Я выложил на Gist GitHub специальный скрипт, который можно выполнить непосредственно в консоли и посмотреть, какая версия JavaScript поддерживается конкретно в вашем окружении – в вашей версии платформы 1С и вашей операционной системе.

 

 

Выполнив этот анализ, мы можем получить следующую статистику.

  • В Windows на платформе 8.3.13 и ранее, пока использовался устаревший движок Internet Explorer, версия JavaScript была 1999-го года

  • В Linux, до версии платформы 8.3.23, пока использовался WebKit 1, мы сидели на 1ECMAScript уровня 2015-го года.

  • В Windows, начиная с платформы 8.3.14 и до сих пор, используется ECMAScript 2018.

  • А Mac, Linux и любой веб-клиент всегда используют самую современную версию ECMAScript.

 

 

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

  • В версии платформы 8.3.13 и ранее нам обязательно нужно писать на JavaScript в спецификации версии ECMAScript 3 – это связано с ограничениями Windows и Internet Explorer.

  • Начиная с версии платформы 8.3.14 мы уже можем для всех ОС использовать ECMAScript 6 и выше – downgrade нужен только для Linux, а под Linux в принципе мало кто разрабатывает.

  • А начиная с версии платформы 8.3.24, когда Linux обновили, нашим ограничением является ECMAScript 2018, потому что это урезанная версия WebKit, которая используется в Windows.

Дополнено перед публикацией:
Обновление браузерного движка для ПолеHTMLДокумента после моего предложения на партнерской конференции разработчики платформы включили в план задач на версию 8.5.4.

 

 

 

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

 

Как загрузить приложение в поле HTML-документа?

 

 

Технически все выглядит очень просто:

  • у нас есть элемент – поле HTML-документа;

  • и есть строковый реквизит, который связан с этим полем.

 

 

Первый вариант загрузки – это указать в значении реквизита непосредственно адрес, откуда будет загружаться приложение. Мы можем это сделать тремя способами.

  • Указать адрес на HTTP-сервер, где будет развернуто наше приложение.

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

  • И третий вариант, который не все знают – можно сформировать навигационную ссылку на временное хранилище. На слайде показано два варианта загрузки данных во временное хранилище из разных типов макетов: первый вариант – из макета HTTP-документа, второй – из макета двоичных данных. И такая ссылка будет загружаться в поле HTML документа.

 

 

И второй принципиально другой вариант – это записать в реквизит сам текст HTML-документа. В этом случае платформа сама его упакует в файл и доставит до поля HTML-документа.

 

 

Однако современные веб-приложения намного сложнее, чем кажется:

  • они состоят не из одного HTML-файла, а из множества исходников, зависящих между собой;

  • у них есть правила компиляции – как эти исходники должны быть между собой связаны;

  • у них есть библиотеки, которые нужно использовать как зависимости;

  • и в результате всей компиляции приложения в папке dist тоже получается много скомпонованных CSS и JS-файлов, которые будут в итоге загружены в корневой файл index.html.

А нам хочется, чтобы файл был один – чтобы мы сразу могли его загрузить, например, во временное хранилище и отобразить в поле HTML-документа.

 

 

Получается, что использовать такое многокомпонентное приложение в 1С можно только в следующих случаях:

  • Если мы опубликуем его на HTTP-сервере. Это будет работать, но возникнут накладные расходы на разворачивание веб-сервера и публикацию на нем, а этим заниматься не хочется.

  • Если мы выгрузим файлы приложения во временный каталог на диске. Но это тоже не очень хороший вариант, потому что у него есть проблемы безопасности.

 

 

В итоге возникает проблема тонкого клиента файловой базы, потому что заниматься для него разворачиванием отдельного HTTP-сервера не хочется. Файловые базы обычно используются у маленьких клиентов – а зачем им нужен HTTP-сервер? Следовательно, использовать такую систему для мелких тиражных решений не получится – просто потому, что на разворачивание всего этого требуется слишком много накладных расходов.

 

 

Хочется решить эту проблему по-другому. Хочется сказать компилятору, чтобы он вместо получения на выходе множества разных файлов, собрал все наше приложение в один файл. И тогда мы сможем его поместить во временное хранилище и загрузить в наше поле HTML-документа.

 

 

При этом у нас остается проблема с тем, что браузеры работают на определенной версии JavaScript. А мы хотим использовать современные библиотеки, которые написаны на современном JavaScript.

И писать приложение мы тоже хотим на современном JavaScript, используя все новые возможности. При том, что работать наше приложение будет только с ограниченным JavaScript.

Для решения этой проблемы есть два принципиально разных инструмента – компиляторы Babel и TypeScript. Оба они позволяют «перевести» современный JavaScript в более старую, совместимую версию:

  • Babel – транспилирует современный JavaScript в код, который будет работать в старых браузерах или клиентах 1С.

  • TypeScript – язык, основанный на JavaScript, но с поддержкой статической типизации. Также компилируется в обычный JavaScript, включая старые версии.

 

 

Что использовать – TypeScript или JavaScript?

  • Кажется, что на всех новых проектах используют TypeScript. Его выбирают потому, что он типизирован. А разработчики любят типизированные языки – они позволяют выявлять ошибки на ходу. Именно поэтому EDT сейчас активно продвигает идею использования аннотации «@strict-types» и типизирующих комментариев. Потому что это позволяет ловить ошибки еще на моменте разработки.

  • Де факто TypeScript сейчас стандарт. И на нем делают не только веб-приложения:

    • Например, всеми нами любимый VS Code тоже написан на TypeScript.

    • И подавляющее большинство мобильных приложений, которые используют React Native, тоже разработаны на TypeScript.

 

 

Теперь давайте рассмотрим способы доставки веб-приложения в поле HTML-документа.

Первый путь – цепочка (2) (1) – мы берем данные приложения из информационной базы, выгружаем все это из архива в локальные файлы и загружаем в тонкий клиент. Так работает всем известная консоль кода на основе редактора Monaco – bsl_console.

 

 

Второй вариант – стрелочка (3) – мы можем данные приложения напрямую из базы загрузить в тонкий клиент. Для этого нам можно использовать один из двух возможных вариантов:

  • либо записать в реквизит адрес временного хранилища;

  • либо напрямую выгрузить это все в строку с HTML и записать ее в реквизит так.

 

 

Но есть проблема с большими скомпилированными приложениями, потому что в тонком клиенте запись в реквизит строки с HTML работает нестабильно. И очень сложно подобрать версию платформы, в которой это будет работать хорошо.

Поэтому стабильным считается вариант с использованием адреса временного хранилища.

 

 

Следующие две стрелки образуют четыре возможные комбинации:

  • либо с публикации файла на HTTP;

  • либо с информационной базы

нужно доставить:

  • либо до тонкого клиента;

  • либо до веб-клиента.

 

 

Но тут тоже есть свои нюансы: адрес временного хранилища приезжает в веб-клиент с проблемами, потому что платформа помечает его заголовком application/octet-stream. А современные браузеры вместо того, чтобы загрузить эту начинку в iframe, начинают инициализировать загрузку файла. В итоге мы не видим внутри приложение, а просто получаем скачиваемый файл.

 

 

Приходится делать отдельные ветки условий, где прописывать поведение для тонкого и веб-клиента:

  • в веб-клиенте считывать всю HTML-строку полностью и помещать ее в реквизит;

  • а для тонкого клиента уже готовить адрес временного хранилища.

В итоге, если мы напишем такую конструкцию, у нас получится загрузить приложение в реквизит «одной строкой».

Причем проще всего хранить приложение в макете двоичных данных, потому что обычно оно получается большое, а двоичные данные не спрашивают, как долго будет загружать. Если мы будем использовать любой другой тип макета – например, текстовый, он на его прогрузку будет тратить время, конфигуратор может зависать. Поэтому для хранения приложения проще использовать сразу макет двоичных данных.

 

Как обмениваться информацией между ПолеHTMLДокумента и платформой

 

Следующая большая тема, о которой нужно поговорить, это как обмениваться информацией между платформой и загруженным в поле HTML-документа приложением.

Дополнено перед публикацией:
Возможность двустороннего взаимодействия с Поле HTML документа заявлялась платформой в плане задач на версию 8.3.24. Далее сообщалось о реализации фичи. Однако реализация была отложена и дальнейшая ее судьба не понятна. Потому используем что есть.

 

 

 

Есть два направления обмена:

  • Первое – это мы хотим из 1С вызвать JavaScript, чтобы что-то с ним сделать.

  • А второе – мы хотим из JavaScript вызвать 1С, чтобы получить данные либо отправить определенное действие – например, чтобы 1С полезла на сервер и что-то спросила.

 

 

Для обмена информацией между платформой и полем HTML-документа в 1С есть три события, которые давно существуют:

  • Первое событие – ПолеHTMLПриИзменении. Оно срабатывает в момент, когда мы меняем значение навигационной ссылки, хранящееся в реквизите. Это событие хорошо работает для случаев, когда, например, нужно проводить OpenID-аутентификацию. Мы проводим аутентификацию, происходит редирект, и в рамках редиректа в фрагменте URL возвращается новый тикет – мы можем его оттуда вычитать и в дальнейшем использовать. Но для регулярного обмена сообщениями это событие не подходит, потому что нужно постоянно делать редиректы, а это накладное дело.

  • Второе событие – ПолеHTMLДокументСформирован – возникает тогда, когда HTML-документ полностью загружен в соответствующее поле. Очень нестабильная штука, потому что современным веб-приложениям мало быть полностью загруженными в память – они после загрузки HTML начинают выполнять дополнительные функции инициализации, инициализируют виртуальный DOM. Поэтому фактически событие ПолеHTMLДокументСформирован срабатывает преждевременно – до того, как приложение реально готово к работе. Проще его вообще не использовать, а чтобы узнать, что приложение подготовлено, лучше попросить его оповестить тебя каким-то другим образом.

  • Третье событие – ПолеHTMLПриНажатии. Фактически это единственный наш способ коммуникации. С его помощью мы можем эмулировать из JavaScript разного рода события – например, нажатие кнопки мыши: сказать, что эта кнопка виртуально нажата. Таким образом мы в 1С получим это событие.

 

 

Есть еще несколько бесполезных событий – в платформе версии 8.3.15 над полем HTML-документа появились три кнопки: «Сохранить», «Печать», «Предварительный просмотр». Очень жаль, что их вообще нельзя убрать.

А в платформе версии 8.3.19 появились методы для управления этими кнопками – но опять же для нашей задачи коммуникации с приложением мы их использовать не можем.

 

 

Итого, если мы хотим обмениваться с JavaScript, у нас есть принципиально два подхода:

  • Первый – это копить сообщения где-то внутри до тех пор, пока 1С их не прочитает. Это потребует от 1С делать какой-то тайм-аут по зачитке. А это значит, что 1С не сразу будет получать информацию, а только тогда, когда у нее тикнет следующий тайм-аут. А если тайм-ауты будут частые, 1С при постоянном опросе может начать «зависать».

  • А второй – это имитировать нажатие служебной кнопки, чтобы отдать 1С событие нажатия на элемент.

Оба этих подхода – асинхронные. А это значит, что сделать синхронный вызов из JavaScript не получится. И тут мы уже сразу должны закладываться на то, что будем работать с асинхронщиной.

 

 

Как все это выглядит в итоге? Мы создаем в JavaScript две кнопки:

  • одна – для входящих сообщений

  • другая – для ответов

И дальше говорим JavaScript:

  • дерни нажатие первой кнопки – RequestForwarder;

  • подпишись на нажатие второй кнопки – ResponseForwarder.

1С со своей стороны:

  • ловит событие нажатия кнопки RequestForwarder;

  • вычитывает данные, собирает их, обрабатывает;

  • и дергает эмуляцию нажатия кнопки ResponseForwarder в ответ.

JavaScript ловит событие нажатия кнопки ResponseForwarder и обрабатывает данные, которые получены из 1С.

А поскольку все это асинхронно, это в итоге приходит к каше пакетов, потому что из JavaScript можно одновременно вызвать множество запросов. А нам для каждого сообщения нужно всегда дослать именно тот ответ, который ему предназначен.

 

 

С прямым вызовом из 1С в JavaScript все намного проще, потому что у 1С есть объект Элементы.ПолеHTML.Документ, который позволяет дергать содержимое HTML-документа напрямую. Мы можем прямо к нему обратиться и дергать через него встроенные в веб-приложение js-методы.

 

 

Выглядеть это будет примерно так:

  • На уровне JavaScript описывается глобальный объект с нужными методами.

  • А на уровне 1С мы получаем доступ к этому объекту и можем вызывать его методы напрямую – например, чтобы отправить данные или инициировать действие.

 

Почему фреймворк React

 

Теперь о том, почему я фокусируюсь на фреймворке React и считаю, что нужно использовать именно его.

 

 

Есть четыре больших фундаментальных решения, на которых можно разрабатывать веб-приложения: Angular, React, Vue и Svelte.

Если мы посмотрим на графики Stack Overflow Trends, то примерно с 2019 года React выстреливает и улетает вверх.

 

 

Количество GitHub-репозиториев для React примерно с этого времени тоже кратно возрастает.

 

 

У NPM – пакетного менеджера Node.js, который позволяет реализовать в JavaScript библиотечный подход – точно так же в тегах по загрузкам React улетает вперед.

 

 

Подписчики Twitter, у которых раньше Angular был де-факто стандартом для бизнеса, сейчас все чаще используют React.

 

 

Google Trends точно так же по количеству запросов на слово React улетает вперед по сравнению с запросами по Angular, Vue и Svelte.

 

Как собрать свое приложение на React

 

Давайте посмотрим, каким образом можно собрать свое приложение на React в один файл, чтобы затем загрузить его в 1С и использовать там.

 

 

Существуют два основных подхода к сборке таких приложений:

  • Первый – с использованием Webpack. Это старенький и проверенный временем инструмент: у него большая экосистема плагинов, стабильная работа и хорошая совместимость. Например, Vanessa Editor собран именно на Webpack.

  • Второй подход – современный, модный, молодежный – это сборка через Vite. Читается как «Вит», а не «Вайт», потому что это французское слово.
    Vite быстрый, шустрый, суперсовременный, но его приходится немного поднастраивать, чтобы он переводил JavaScript в более старую версию, которая будет совместима с платформой 1С.

 

 

Давайте посмотрим, как выглядит процесс сборки React-приложения, которое можно загрузить в 1С.

Итак, нам нужно создать приложение Vite:

  • вводим команду
    npm create vite@latest

  • указываем название проекта – test1c;

  • выбираем, какой фреймворк будем использовать – в данном случае, React;

  • указываем конфигурацию языка, на котором мы будем писать – TypeSctipt + SWC;

  • и после этого подтягиваем все зависимости этого приложения, выполнив в его каталоге команду
    npm install.

Дальше запускаем dev-сервер, выполнив команду

npm run dev

И можем открыть наше приложение по адресу http://localhost:5173 – начать его разрабатывать и сразу видеть результат разработки в браузере.

Теперь для того, чтобы собрать весь результат в один файл, нам нужно поставить дополнительный плагин – vite-plugin-singlefile. Это делается командой

npm install vite-plugin-singlefile --save-dev

После этого нам нужно будет импортировать этот плагин в настройках компиляции Vite (в файле vite.config.ts), добавив строку:

import { viteSingleFile } from ‘vite-plugin-singlefile’

И указать этот плагин в списке плагинов наравне с плагином React:

export default defineConfig({
plugins: [
react(),

viteSingleFile()

],

})

После этого, выполняя команду сборки npm run build, мы сразу получим в dist наш заветный единый HTML-файл.

Теперь нам нужно его понизить до версии, которая будет работать в WebKit для Windows. Для этого в настройках компиляции Vite (в файле vite.config.ts) нужно в качестве таргета сборки указать более старую версию JavaScript (es2018), добавив строки:

build: {
target: "es2018"
}

И то же самое нужно сделать в самом TypeScript, добавив в tsconfig.app.json следующие параметры сборки:

{
"compilerOptions": {
"target": "ES2018",
"useDefineForClassFields": true,
"lib": ["ES2018", "DOM", "DOM.Iterable"],
"module": "ES2015",
"skipLibCheck": true,
…

Обратите внимание, что для параметра module тоже нужно отдельно указать систему загрузки – не современную, а более старую, 2015 года.

Таким образом в результате команды npm run build будет собрано правильно настроенное одностраничное React-приложение. Мы сможем его загрузить в макет двоичных данных и начать использовать.

 

Пакет для интеграции 1С и React-приложения

 

 

Я разработал небольшую библиотеку, которая дает привычный для JavaScript-разработчиков API для получения данных из 1С – ее можно установить через npm или скачать исходники с GitHub.

  • Мы можем запросить данные из 1С через V8Proxy.fetch и асинхронно получить ответ. Причем сразу в трех вариантах – либо как текст, либо как JSON, либо как BLOB:

    • Отправляем из 1С структуру массивов, а в JavaScript сразу получаем JSON-объект.

    • Или передаем из 1С двоичные данные, а в JavaScript сразу получаем BLOB-объект.

  • Кроме того, в библиотеку входит React-хук, который синхронизирует состояние компонентов React с реквизитами формы 1С. Фактически, мы можем из React сказать: «Установи новое значение в реквизит формы 1С "Номер"». И он его установит.

 

Выводы

 

Резюмируем сказанное:

  • Веб-приложения для работы в 1С используются повсеместно, и будут использоваться и дальше. Стоит подключиться к этому движению и тоже попробовать.

  • Мы очень ждем, что WebKit в Windows будет обновлен. И надеемся, что они будут выпускаться синхронно, чтобы мы могли использовать современные возможности JavaScript. Это круто.

  • Ну и глобальный совет – учите соседние стеки, чтобы делать стек 1С лучше.

 

Вопросы и ответы

 

У фирмы «1С» есть стандарт 730, который гласит: «Не следует использовать поля с HTML-документами в случаях, когда возможно использование элементов управления платформы 1С:Предприятие». Здесь этот стандарт как-то применяется?

Есть возможности, которые на 1С сделать невозможно. И я в самом начале показывал примеры, где в самих типовых конфигурациях используются эти возможности.

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

А как это вообще все работает на мобильных платформах, мобильных клиентах?

Так же, как веб-клиент работает на мобильных устройствах – с теми же возможностями и ограничениями.

У меня вопрос по поводу производительности. Есть условно небыстрый и немощный терминал, на котором типовой интерфейс работает недостаточно быстро. Можем ли мы получить потенциальный прирост производительности, если переориентируем форму на HTML-документ? Или это всегда дополнительные накладные расходы и еще большее падение производительности?

Бывает по-разному, и зависит от того, какой интерфейс вам нужен.

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

С другой стороны, я точно знаю, что, используя JavaScript, можно использовать возможности параллельной работы. А в коде клиента 1С мы параллельность использовать не можем.

А в JavaScript – в том числе, внутри WebKit – мы можем создавать отдельные пространства, внутри которых будет параллельно выполняться код. И за счет такой механики мы можем делать ускорение для сложных алгоритмов. Например, в Vanessa Editor внутри приложения есть три фоновых процесса:

  • один отдельный процесс показывает картинку;

  • второй процесс запускает фоновый рендеринг элементов, чтобы интерфейс не зависал;

  • и третий, который отрабатывает механику LSP-серверао, чтобы работал автокомплит.

И эти все три процесса работают одновременно. Такие штуки можно делать на WebKit, а на 1С нельзя. Но это, наверное, не совсем то, что нужно для терминалов, которые должны просто работать быстро.

Не пробовали ли вы использовать сервер-сайд рендеринг (SSR)? С ним и приложение будет запускаться быстрее, и событие будет отрабатывать в нужный момент.

С одной стороны, практически все современные приложения сейчас все-таки идут по пути SPA, чем по SSR. А с другой стороны, у того же React есть расширение Next.js, которое тоже поддерживает серверные компоненты и SSR.

Дело в том, что у любого приложения есть элементы подготовки и запуска. Даже если мы будем использовать не React, а чистый JavaScript, нам для работы часто бывает нужно загрузить какие-то компоненты – например, тот же просмотрщик картинок. И пока библиотека этого просмотрщика картинок не будет инициализирована, мы не сможем загрузить в приложение картинку так, чтобы методы этого просмотрщика были доступны – он все равно не будет отрабатывать вовремя.

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

Поэтому какое угодно приложение не встроить – сначала его нужно адаптировать под 1С, чтобы оно могло рассказать 1Су о том, что готово к работе. Но это обычно не очень сложно.

Как поведет себя поле HTML-документа в тонком клиенте на старых операционках? К сожалению, бывают клиенты и на XP, и на семерках. Какие могут быть тут сюрпризы?

Я знаю, что ограничение WebKit на старых версиях платформы как раз было связано с поддержкой XP. Но 1С сейчас уже отказывается от поддержки XP. Microsoft уже отказался. Chrome уже отказался. Касперский уже отказался. Все отказались, а 1С держался до последнего.

Хочу сделать небольшой комментарий по поводу желтой рамки вокруг поля HTML. Недавно приходилось решать задачу добавления на форму маленькой анимированной кнопки. И когда вокруг этой кнопки появлялась желтая рамка, эта анимация терялась – я искал решение, как это можно вообще избежать. И удалось найти вариант, при котором она появляется только на момент клика – в этом случае можно одновременно программно добавить на форму элемент, перенести на него фокус через «ЭтаФорма.ТекущийЭлемент», а потом удалить. Таким образом эта рамка появляется только в момент клика пользователям. В остальных случаях она пропадает.

Да, это действительно так. Даже этот случай, который я показывал с изменением доступности и пропуска элемента, он не будет работать, если поле HTML-документа на нашей форме – единственный элемент. Потому что платформа все равно будет пытаться фокусироваться на единственном элементе – даже если он недоступен.

Проблема есть. Совсем избавиться от нее даже в таком моргающем виде не получится. По крайней мере сейчас таких возможностей нет. Может быть кто-нибудь придумает.

Вы сказали, что BSL-консоль выгружает все в папку и запускается оттуда. Но чтобы все работало секьюрно, правильно, хорошо и в традициях 1С, вы предлагаете завести проект на React и просто перекомпилировать все в один файл? Есть ли там какие-то подводные камни?

Если вы посмотрите на репозиторий консоли BSL, там уже есть отдельная ветка, где эта сборка сделана на Webpack. Она пока не вошла в продуктив, потому что там еще не все тесты прошли. Но эта ветка уже давно живет, много людей ее тестируют. Поэтому процесс в эту сторону уже идет.

Есть ли особенности в поведении приложения, если мы подгружаем его в веб-клиент 1С с другого сайта? Я имею в виду cross-origin-запросы и связанные с ними ограничения. Мы, например, сталкивались с ситуацией, когда не удавалось подгрузить страницу даже с того же домена, хотя обычная ссылка на этот ресурс работала без проблем.

Есть две проблемы.

  • Первая проблема связана с X-Frame-Options – настройкой веб-сервера, которая ограничивает возможность встраивания страниц в iframe. По умолчанию большинство серверов (Nginx, Apache, IIS и т.д.) запрещают подобное поведение, если не указано иное. В вашем случае его нужно разрешить – для этого же домена или конкретного сайта.

  • А вторая проблема – это CORS (Cross-Origin Resource Sharing), политика безопасности браузера, которая тоже может блокировать загрузку ресурсов с других доменов. Чтобы разрешить такие запросы и отдавать правильный заголовок на разрешение загрузки, нужно опять же конфигурировать HTTP-сервер. Причем важно, чтобы эти заголовки отдавались именно на стороне публикации веб-клиента, а не внутри самого приложения.

Компонента, про которую вы рассказывали, уже готова к использованию в продакшене?

Я делал много разных подходов к реализации таких приложений. Эта компонента стала результатом обобщения всего опыта, накопленного на разных проектах. Так что можно смело использовать. Причем там для взаимодействия с 1С используется не просто кнопка с очередью, но и более быстрая обработка сообщений.

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.

См. также

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

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

60000 руб.

07.05.2019    36534    72    45    

31

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    5553    4    0    

12

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    20102    26    24    

22

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1774    10    2    

13

Работа с интерфейсом Анализ учета Мониторинг Платформа 1С v8.3 8.3.14 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Платные (руб)

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

14400 руб.

27.03.2025    2164    8    9    

12

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    6501    4    2    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3931 19.06.25 19:20 Сейчас в теме
На счет TypeScript + BABEl, в Vite использовал TypeScript + swc.
swc тоже самое, что BABEl, но пошустрее.
Оставьте свое сообщение