Рендеринг нестандартных интерфейсов на стороне сервера: «Элемент» в качестве бекенда для HTMX

29.01.25

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

Как быстро реализовать на 1С:Элемент любой нестандартный интерфейс, используя инструмент HTMX и серверный рендеринг.

Рендеринг нестандартных интерфейсов на стороне сервера: «Элемент» в качестве бекенда для HTMX

 

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

 

Рисунок 1 – Пример интерфейса приложения на «1С:Элемент»

 

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

Забегая вперед, наиболее удачным для «мира 1С» оказалось совместное использования Элемента с JavaScript библиотекой HTMX. При наиболее используемом подходе к разработке веб-сайтов клиент получает данные в формате JSON и должен самостоятельно управлять их отображением на странице. После получения JSON контента разработчику нужно вручную преобразовать эти данные в конечный HTML. При всей гибкости и удобства современных инструментов фронтенд разработки, написания клиентского кода в таком случае потребует дополнительных затрат и, в большинстве случаев, разработка ведется на отличной от серверной части технологии.

 

Какой подход предлагает HTMX?

Вместо того чтобы получать данные в формате JSON и затем преобразовывать их в HTML, сервер возвращает уже готовые HTML-фрагменты.  За счет того, что возвращается не весь контент, а только отдельный компонент, получается привычное современным пользователям одностраничное приложение. На клиенте нужно только указать три свойства:

  1. При каком событии делать запрос
  2. По какому адресу обращаться за HTML фрагментом
  3. В каком месте DOM дерева разместить ответ

Эту задачу и решает HTMX, который с помощью лаконичного синтаксиса позволяет управлять этими свойствами напрямую из HTML разметки.

 

 

Рисунок 2 – Пример ответа сервера при работе с HTMX

 

HTMX – это современная легковесная JavaScript библиотека, которая позволяет управлять поведением AJAX через атрибуты у узлов HTML.

hx-get – Выполняет GET запрос по указанному адресу, по умолчанию заменяет телом ответа содержимое тега, из которого вызывался

hx-target – Назначает элемент, у которого произойдет замена, может быть как классом так и идентификатором

hx-swap – «Режим» замены, заменяет только содержимое тега или тег целиком

Только с помощью перечисленных атрибутов можно реализовать уже множество элементов для взаимодействия с веб-страницей. Использование такого подхода решает главную проблему SSR (Рендеринг на стороне сервера) приложений – малая динамичность и необходимость перерисовывать всё содержимое HTML при взаимодействии. Такие приложения могут быть более производительными, поскольку не требуют дополнительных вычислений на стороне клиента, и ощущаются отзывчивыми.

 

Рисунок 3 – Пример тега с атрибутом HTMX

 

 

Почему Элемент отлично сочетается с HTMX

 

Рисунок 4 – Пример формирования компонента интерфейса в «Элементе»

 

  1. Необходимые нам http методы поднимаются в «1 клик» средствами сервера Элемента
  2. Встроенные механизмы авторизации и аутентификации работают из коробки
  3. Синтаксис языка, в частности для работы со строками, очень удобен для работы с HTMX
  4. Возможность определения нескольких «интерфейсов» как объекта 1 проекта.

 

Рисунок 5 – Пример альтернативного интерфейс главного экрана, реализован с помощью HTMX

 

Рисунок 6 – Альтернативный интерфейс работы с табличной частью объекта «Заявка на мастер класс»

 

 

Триггеры запросов

Атрибут hx-trigger в HTMX позволяет разработчикам определять, какие события на стороне клиента будут инициировать ответы от сервера.

Помимо привычных событий, например, click или load, HTMX позволяет отправлять с сервера произвольные события.

Для того чтобы вызвать событие на клиенте, нужно при формировании ответа указать идентификатор события в заголовке «Hx-Trigger»

 

Рисунок 7 -Пример ответа от сервера с триггером «updateTable» в заголовке

 

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

Например, при выборе продукции, обновляется не только кнопка «добавить», но и актуализируется список выбранной продукции:

 

 

Рисунок 8 – Пример взаимодействия между разными частями DOM дерева

 

 

Минимальное взаимодействие с JavaScript

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

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

Это позволяет работать с интерфейсом, например, с помощью такого синтаксиса:

 

Рисунок 9 – Алгоритм маршрутизации на Элементе

 

Рисунок 10 – Метод обработки добавления продукции в заявку

 

Рисунок 11 – Метод отображения доступных желаемых дат

 

Взаимодействия пользователя со страницей на HTMX используют сервисы, которые предполагают тарификацию в облаке 1cmycloud, этот фактор стоит учитывать при использовании таких инструментов. Согласно предварительным условиям, тарификация сервиса будет начисляться по времени активного использования сервиса, что также можно учесть в архитектуре приложения чтобы сократить время выполнения http сервисов (Например, выполнять популярные и долгие операции с помощью механизма запланированных заданий заранее)

Мы получаем стек, который сочетает в себе всю мощь и скорость разработки от ORM модели «1С:Предприятие» (Справочники, Документы, Регистры, Запросы), удобный, современный язык «Элемента»: функциональные типы, контрактное программирование, гибкость современных веб приложений и, самое главное, свободу выбора: разработчик сможет сочетать формы с HTMX вместе с «родными» формами.

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

1C:Элемент Пользовательский интерфейс Личный кабинет

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

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Работа с интерфейсом Рабочее место 1С:Предприятие 8 1C:Бухгалтерия 1С:Комплексная автоматизация 2.х Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). В комплект поставки включены Расширения для легкого подключения данного функционала в БК, УТ, КА и ERP. Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу. Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6100 руб.

16.01.2015    68464    46    60    

85

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

09.02.2015    62117    boogie    24    

43

Работа с интерфейсом Программист Абонемент ($m)

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

1 стартмани

30.11.2014    37741    66    oleg.rizvanov    35    

119

Работа с интерфейсом 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Очень удобные и функциональные часы с будильником в виде обработки 1С.

1 стартмани

24.09.2014    15809    8    miller-adm    5    

8

Работа с интерфейсом Универсальные функции Инструментарий разработчика Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Обработка предназначена для лентяев, к каковым, в первую очередь, отношу себя. Это в некотором роде шпаргалка в виде шаблона внешней обработки. Для создания новой копируем эту, удаляем ненужное, вставляем нужное - получаем результат. Чем ваять с нуля, каждый раз прописывая одно и то же, проще использовать заготовку, подобную этой... 30.10.2019 - Версия 1.24 - Изменена регистрация из обработки, и функция СведенияОВнешнейОбработке. Изменён пример чтрения XLS - теперь средствами 1С, без необходимости устанавливать офис ...ну и как водится - что-то добавил, что-то поправил....

2 стартмани

22.09.2014    66767    720    Alex_E    31    

217

Работа с интерфейсом 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Обработка позволяет ответить на такие вопросы, как "Сколько календарных/рабочих/выходных дней в периоде?", "Сколько месяцев в периоде?", "Какое число будет через 45 дней?", "Какой месяц будет через 25 месяцев?", "Сколько рабочих часов в наборе дат?".

1 стартмани

14.08.2014    25668    30    mbreaker    6    

10

Работа с интерфейсом Инструкции пользователю 1С:Предприятие 8 1С:Бухгалтерия 2.0 Бесплатно (free)

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

09.07.2014    87874    Diversus    117    

124

Работа с интерфейсом Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

07.07.2014    269875    59    sapervodichka    35    

94
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. NoRazum 31 30.01.25 09:05 Сейчас в теме
@ВПроекте

что это такое?

подход интересный
2. deplatoon 28 30.01.25 11:29 Сейчас в теме
(1) в языке Элемента есть модификаторы видимости, по умолчанию объект и методы не видны из других подсистем/модулей.

Такую аннотацию можно задать как объекту, так и каждому модулю - такой некий аналог "Экспорт" из платформы
@ВПодсистеме - метод видно за пределами объекта, но только в рамках подсистемы
@ВПроекте - метод видно из других подсистем
@Глобально - метод/объект видно везде, даже за пределами проекта. Зачем? Потому что в Элементе существуют библиотеки и межпроектное взаимодействие поэтому это вот туда
3. leonvlas 31.01.25 08:57 Сейчас в теме
Концепцию не понял.
Вы бы описали на какой версии это делаете. От технологи к технологии там много что меняется.
В каком месте перехватывать генерацию страницы или вы желаете весь фронт заменить на https://htmx.org/?
5. deplatoon 28 31.01.25 10:35 Сейчас в теме
(3) В статье использовалась 6.1, на пятерке всё то же самое.
Конкретно этот проект устроен так:
1. Приложение для клиента содержит только лишь контейнер html где внутри рулит всем htmx, вызывает веб сервисы этого же приложения. Все красивое, с анимациями, без лишних кнопок
2. Приложение - бек офис. На нативных формах элемента, где можно работать с данными в более привычном бизнесу виде.
3. Заточенное под мобильные экраны приложение с упрощенной формой конкретную роль сотрудника. Тоже на родных формах элемента, но очень упрощен, только для создания документов одного типа

Получается при таком сочетании что каждый тип пользователя получает привычный ему интерфейс, но и от скорости разработки на нативных формах мы не отказываемся. Это три разных "интерфейса" (в терминологии Элемента КлиентскихПриложения") работают в одной базе данных, физически являются одним веб сайтом, просто с разными точками входа. Это очень легко поддерживать и дорабатывать, т.к. это монолит
test.1cmycloud.com/applications/App - Пользователь
test.1cmycloud.com/applications/App/admin - бек офис для сотрудников
test.1cmycloud.com/applications/App/employee - рабочее место сотрудника конкретной роли
4. Feelthis 38 31.01.25 10:02 Сейчас в теме
Почему нужно платить 1сmycloud? Там что код в облаке компилируется \ хостится ?
6. deplatoon 28 31.01.25 10:42 Сейчас в теме
(4) Да, основное применение 1С:Предприятие.Элемент - в облаке. Облако от вендора - 1cmycloud.com содержит уже сервер Элемента, и позволяет в качестве сервиса хранить там свои приложения/разрабатывать/хранить файлы используемые в приложениях. Пока ещё бета - всем всё бесплатно, но после релиза тарификацию включат, предварительные тарифы 1С озвучивали и там прям недорого
7. Feelthis 38 31.01.25 15:28 Сейчас в теме
(6) Интерфейс то у них схож с 8.5 новой платформой. У них есть какие то преимущества по сравнению с 8.5? Я смотрю какой то другой синтаксис у 1С Элемент? Это скорее минус чем плюс. Заново привыкать к новому синтаксису и нюансам.
8. s_vidyakin 68 01.02.25 03:42 Сейчас в теме
(7) Это 8.5 основан на интерфейсе Элемента. Ему уже почти 2 года, и вот 8.5 к нему подтянули
9. deplatoon 28 01.02.25 08:05 Сейчас в теме
(7) Интерфейс общий во многих моментах, новый синтаксис - вкусовщина, многим непривычно, но также у него уже появились и фанаты, которые пишут такие вот статьи.
А про Элемент, кратко то головной боли при разработке меньше:
1. Лицензии позволяют делать публичные сервисы
2. Современный стек под капотом, изначально ориентированный на веб
3. Настоящая модульность
4. 1cmycloud как песочница для разработки и распространения приложений: быстро сделал, быстро внедрил пользователю, обновил всем пользователям приложения одной кнопкой (не только на конкретном абоненте).
5. Ну и очень много новых технических фишек, из за который он пока больше интересен разработчикам, но большое признание ещё впереди
10. ROk_dev 01.02.25 13:55 Сейчас в теме
Ждем когда :) "Сбербанк" перейдет на "Элемент".
Согласится ли нормальный клиент хранить проект или что там в облаке 1cmycloud.com..
Пока только не понятные проекты кто то что то где то сделал.
Хотите изменять интерфейс на сервере вот https://divkit.tech/ru/
На этом фрэйме 11 сервисов только яндекса построены
и все мы ими пользуемся.
11. deplatoon 28 01.02.25 14:48 Сейчас в теме
(10) Никто не ждет что Сбербанк перейдет на Элемент. Вы можете привести критерии нормального клиента, обещаю принести в эту ветку кейс внедрения, если найду подходящий.
Наверняка дивкит тоже отличный инструмент, но его отличия от небольшого HTMX кардинальны - он совершенно не лоукод, а статья про лоукод и ликвидацию состояний компонентов на клиенте.
По аналогии не ждете что Apple перейдет на яндексовский дивкит?
Если иметь реалистичные ожидания от инструментов, не придется разочаровываться.

Для данных, которые невозможно по каким либо причинам хранить в облаке существует возможность установки сервера на свою машину, об этом вендор говорит прямо, никто не скрывает
G.Shatrov; dmx; +2 Ответить
12. afk 91 27.02.25 09:02 Сейчас в теме
Выглядит очень круто. Настраиваемый дизайн - это то, чего не хватает Элементу "из коробки".

Правильно понимаю, что точкой входа на страницу с HTMX будет {Адрес приложения}/api/{Сервис} ?

Для 1сников конечно нужен минимальный пример ) как подключить HTMX и получить экран со своим html и одной действующей кнопкой, например счетчиком
13. afk 91 27.02.25 11:56 Сейчас в теме
(12) Принцип: на форме размещаем КонтейнерHTML, в который записываем нашу страницу HTML с подключенной библиотекой HTMX. Создаем HTTP-сервис, который будет возвращать обновленный блок счетчика. Подключаем сервис через атрибуты тегов на нашей странице. Для передачи текущего значения счетчика на сервер используем скрытое поле.

1. Страница HTML
<ht ml lang='ru'>
<head>
   <met a charset='utf-8'>
   <met a name='viewport' content='width=device-width, initial-scale=1.0'>
   <sc ript src="https://unpkg.com/htmx.org@1.9.10"></sc ript>
</head>
<body>

<div id='counter'>
    <div>Счетчик: 0</div>
    <input type='hidden' id='currentCount' name='count' value='0'>
</div>
<button hx-post='/applications/НАШЕ_ПРИЛОЖЕНИЕ/api/counter/increment'
		hx-target='#counter'
		hx-swap='outerHTML'
		hx-include='#currentCount'>
	Увеличить
</button>

</body>
</html>
Показать


2. создаем HTTP-сервис Counter, который выдает обновленный блок с данными счетчика
- корневой URL = counter
- метод POST increment
- Шаблон = /increment
- обработчик
метод УвеличитьPOSTОбработкаЗапроса(Запрос: HttpСервисЗапрос)
    
    знч ТекСчетчик = новый Число(Запрос.Параметры.ПолучитьПервый("count")) + 1
    знч ТелоОтвета = 
"
<div id='counter'>
    <div>Счетчик: %ТекСчетчик</div>
    <input type='hidden' id='currentCount' name='count' value='%ТекСчетчик'>
</div>

"    
    Запрос.Ответ.УстановитьТело(ТелоОтвета)
;	
Показать
deplatoon; +1 1 Ответить
14. deplatoon 28 01.03.25 03:58 Сейчас в теме
(12) В примере из статьи я взял точкой входа {Адрес}/htmx
Т.е. отдельное произвольное клиентское приложение по адресу htmx, где на всю страницу просто разместил контейнер.
Но конечно можно собирать первоначальную страничку и сервисом, или вообще разместить index.html на левом бесплатном хостинге, оставив api в облаке
15. 1cembreg 25 11.04.25 10:58 Сейчас в теме
(14) Но ведь контейнер это iframe, а значит игнорируется Яндексом для SEO
16. deplatoon 28 11.04.25 11:02 Сейчас в теме
(15) Обычно делают два апи - одно как в статье, и рядышком, если браузер не поддерживает JS например - рендер статики целиком. Вот если эндпоинт для статики и разместить не в контейнере, а на отдельном сервере, то будет нормально. Ну а так кейс конечно не про SEO
Для отправки сообщения требуется регистрация/авторизация