Особенности разработки интерфейсов 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.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

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

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

28800 руб.

27.03.2025    17565    24    18    

35

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

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

57600 руб.

26.11.2024    5993    4    3    

7

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    3356    17    2    

19

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

В расширении реализован механизм интеграции между системой поставщика и Личным кабинетом СДТ. Реализован обмен заказами и реализациями (накладными), предусмотрено отслеживание статусов документов. Расширение предназначено для 1С:УТ 11.4.

35856 руб.

27.11.2024    1803    1    0    

1

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

5196 руб.

28.04.2016    97318    109    218    

359

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

Универсальное расширение конфигурации для автоматической загрузки и заполнения реквизитов контрагентов (партнеров) из ОГРН для 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.4), 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.2), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.5), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.4), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.3), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.4), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.0) и 1С:Бухгалтерия 8 (Бухгалтерия предприятия, редакция 3.0).

5000 руб.

08.11.2017    69472    415    298    

84
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 4011 19.06.25 19:20 Сейчас в теме
На счет TypeScript + BABEl, в Vite использовал TypeScript + swc.
swc тоже самое, что BABEl, но пошустрее.
Shmell; zeegin; +2 Ответить
3. starik-2005 3188 20.06.25 10:45 Сейчас в теме
(1) Тоже хотел написать, что TS + vite с транспиляцией в пакеты ES6 очень даже решает.
(0) Статья норм. Не ясно, за что минус влепили.
4. zeegin 175 20.06.25 11:02 Сейчас в теме
(1) ага, в примере показал что надо выбирать ts + swc а то что swc пришел на замену babel не рассаазал)
2. Dimel 19.06.25 22:36 Сейчас в теме
(0)
1) При загрузке страницы кроме озвученных вариантов можно использовать helpservise 1С. Т.е. можно указывать путь к макетам HTML, картинкам используемым в справке (причем туда можно через выгрузку/загрузку файлов конфигурации и js добавить ;) ).

Получение адреса примерно так:
АдресHTML = ПолучитьНавигационнуюСсылкуИнформационнойБазы() + "/" + "e1cib/helpservice/topics/v8config/" + "v8cfgHelp...

Например, вот адрес для общей картинке из демо базы:
https://hrm.demo.1c.ru/corp/ru_RU/e1cib/helpservice/topics/v8config/v8cfgHelp/md­picture/idef4d648f-4cac-4df9-9880-2aa13c422d10
2) Кроме скрытых кнопок для вызова событий из HTML можно использовать "ДобавитьОбработчик" почти на все события.

Кроме этого я думаю, что можно добиться вызова клиентских функций общих модулей. (игрался с прямыми запросами к серверу и кое что получалось (например получить текст общего клиентского модуля), но бросил)
Daynestro07; +1 Ответить
5. zeegin 175 20.06.25 11:05 Сейчас в теме
(2) кажется это недокументированные фичи, могут отвалиться при обновлении платформы. Но поэкспериментировать точно надо!
6. booksfill 20.06.25 13:24 Сейчас в теме
Статья отличная!
Вот все может пригодится. Утянул себе.

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

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

Даже из статьи видны прелести: тут играем/тут не играем, тут у нас клиент не той системы, а это должно работать, но надо подобрать версию 1С.
Да еще, скажем, Figma более нам не доступна, а давайте все бросим и кинемся искать аналоги.

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

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

Т.е. по сути получается, что у вас в команде должен по-хорошему появиться свой разработчик интерфейсов, веб-программист и тестировщик, который усё это понимает как проверять.
almierm; klaus38; zeegin; +3 Ответить
9. zeegin 175 20.06.25 13:59 Сейчас в теме
(6) В воздушном интерфейсе завезли своих стилей встраиваемых в html поле
https://its.1c.ru/db/metod8dev#content:6028:hdoc:html_generate
Вот тут п 7.1 про это
Так что в 8.5 будет еще интереснее :)
10. booksfill 20.06.25 14:13 Сейчас в теме
Хм..., а неплохо, может пригодиться.
7. aximo 2426 20.06.25 13:46 Сейчас в теме
Отличная обзорная статья! Надо вспоминать (заново изучать) jscript ))))
8. quazare 3963 20.06.25 13:54 Сейчас в теме
Такое можно было использовать еще лет 5 назад… одна моя старая обработка, именно по построению маршрутов

https://infostart.ru/1c/tools/1321588/

Так же использует поле html . А так - отличная статья! Прогресс идет!
11. zeegin 175 20.06.25 14:46 Сейчас в теме
(8) Да и Vanessa Editor по этому же принципу делали :)
12. dimaster 40 23.06.25 09:42 Сейчас в теме
(11) Игорь, есть ли возможность показать на живых примерах? в идеале - с следующем потоке чистого кода (я там в листе ожидания :)
13. Viktor_Ermakov 391 29.06.25 13:26 Сейчас в теме
Игорь, а что если я получаю текст HTML страницы из макета как шаблон, и потом через объектную модель дополняю страницу создаю элементы динамически, в таком случае как получать шаблон изначальный играет роль в качестве ускорения? Т.е. все равно лучше из двоичных данных получить, илу уже можно из HTML документа?
14. tormozit 7307 03.07.25 22:07 Сейчас в теме
В чем отличие 2-х вариантов кода по загрузке страницы в браузер через навигационную ссылку? Кажется что в первом способе не должно быть преобразования строки в двоичные данные, т.к. из макета уже двоичные данные получены.
Прикрепленные файлы:
15. maxx 1000 25.08.25 14:01 Сейчас в теме
Спасибо за проект. Пытаюсь разобраться.

Хочу уточнить, а будет ли работать нормально передача blob из 1С, если у меня файл (ДвоичныеДанные) большой, а дальше на странице html идёт потоковое чтение (чтобы не весь файл в память грузился).
Может быть как-то можно передать всё-таки на клиент файл, чтобы html страница увидела его и затем потоком считывала? Или другие варианты? Речь про режим готовой единой страницы SPA, установленной в АдресHTML HTML документа
Для отправки сообщения требуется регистрация/авторизация