Что такое Metadata.js?
- Движок ссылочной типизации для браузера и nodejs
- Библиотека для разработки бизнес-ориентированных и учетных offline-first браузерных приложений
Если коротко, то метадата предоставляет веб-программисту высокоуровневые объекты данных, аналогичные тем, которыми пользуются программисты 1С (перечисления, справочники, документы, регистры и т.д.)
Кроме привычных 1С-ных вкусностей в виде автоматического интерфейса, наши дата-объекты умеют работать в автономном режиме и прозрачно реплицируются с сервером при возобновлении соединения.
Еще, metadata.js можно рассматривать, как "БСП для веб", предлагающую готовые решения для:
- разграничения прав на уровне объектов, записей и элементов управления
- авторизации пользователей
- подключаемых внешних модулей, отчетов и обработок
- управления параметрами сеанса
- автономной работы и репликации с сервером
- автоматической генерации форм объектов и списков
- подписок на события дата-объектов и события глобального контекста
- маршрутизации url, журнала регистрации и мн. др.
Если у кого-то возник вопрос «а не очередной ли это велосипед», вынужден возразить: я достаточно ленивый человек, чтобы повторять функциональность, реализованную другими. Если бы нужную математику можно было купить, сделал бы это без долгих размышлений – это всегда дешевле и быстрее. Я старался не дублировать работу, проделанную уважаемым javascript-сообществом и по возможности использовать стандартные библиотеки. Вот список основных зависимостей:
Серверная часть
- couchDB, NoSQL база данных с поддержкой master-master репликации
- nginx, высокопроизводительный HTTP-сервер
Управление данными в памяти браузера
- metadata.js, движок ссылочной типизации для браузера и Node.js
- pouchDB, клиентская NoSQL база данных с поддержкой автономной работы и репликации с CouchDB
- alaSQL, SQL-интерфейс к массивам javascript в памяти браузера и Node.js
- aes, библиотека шифрования/дешифрования строк
- xlsx, библиотека для чтения и записи XLSX / XLSM / XLSB / XLS / ODS в браузере
UI библиотеки и компоненты интерфейса
- dhtmlx, кроссбраузерная библиотека javascript для построения современных веб и мобильных приложений
- handsontable, компонент для отображения и редактирования табличных данных
- daterangepicker, компонент визуализации и редактирования диапазона дат
- filesaver.js, HTML5 реализация метода saveAs
- moment.js, библиотека форматирования интервалов и дат
- numbro, библиотека форматирования чисел
- rubles.js, библиотека форматирования чисел - сумма прописью
Зачем это нужно и что даёт?
- Масштабируемость и надёжность. Сервер средней мощности может обслуживать тысячи клиентов и эти клиенты сохранят работоспособность при перебоях связи
- Неограниченная свобода в дизайне отзывчивого интерфейса
- Новое качество веб-приложений, сочетающее мощь бизнес-объектов 1С с эффективностью и открытостью веб-технологий
Предыстория
Несколько моих клиентов заинтересовались возможностью сделать для своих дилеров личные кабинеты в браузере.
Требовалось обеспечить внутри этого кабинета работу с графическим построителем для рисования изделий (окон, витражей, офисных перегородок).
Система должна рассчитать геометрию элементов, спецификацию, стоимость и отправить эту информацию в план завода.
Типичный оконный завод производит до 1000 изделий в день, сотрудничает с большим количеством дилеров (от 200 до 500).
Из задачи вытекали спецтребования:
- Редактору геометрии требовалась интенсивная работа с данными в браузере в реальном времени – по каждому смещению мыши на сервер не набегаешься
- Должно работать при плохой связи и в автономном режиме
- Нужен гибкий отзывчивый интерфейс с поддержкой, в том числе, мобильных устройств
- Нужно нулевое администрирование на клиентах
- Хотелось сэкономить на лицензиях и серверном оборудовании
Имелся 1С-ный прототип для управления позаказным производством. В нём были подсистемы расчета спецификации, сложного ценообразования, диспетчеризации и учета - надстройка над 1С:КА 1.1. Повторить такой проект "в лоб", на языке программирования общего назначения - задача нереальная даже в теории. Решил разделить эту задачу на части:
- Делаем платформу, которая позволит использовать структуру объектов и синтаксис ala-1С
- Транслируем 1С-ный прототип в термины этой платформы
- Бинго! Имеем дешевый функциональный отказоустойчивый сервис
Преемственность синтаксиса
Свойства и методы объектов metadata схожи, но не повторяют и не ограничиваются возможностями 1С.
Например, у нашей табличной части (TabularSection) есть метод НайтиСтроки (find_rows). Кроме стандартного поиска по равенству полей, добавлен синтаксический сахар:
// поиск в 1С
Результат = ТабЧасть.НайтиСтроки(Новый Структура("Поле1", Значение1));
// поиск, "как в 1С"
res = ts.find_rows({Поле1: Значение1});
// поиск на неравенство
res = ts.find_rows({Поле1: {not: Значение1}});
// поиск по списку значений
res = ts.find_rows({Поле1: {in: [Значение1, Значение2]}});
// логическое ИЛИ
res = ts.find_rows({or: [{Поле1: Поле1}, {Поле2: Поле2}]});
// поиск с произвольным условием
res = ts.find_rows({Поле1: function(v, key){if v[key] > 3 return true;}});
// поиск с условием SQL выполняется на клиенте, без обращения к серверу
res = alasql("select * from ? where `Поле1` > 3", ts._obj);
Сравнение производительности
В offline-режиме, приложение metadata подобно локальной файловой базе 1С. Оба движка работают в этом режиме весьма шустро.
При работе с длинными списками, в metadata чуть больше свободы:
- Можно построить сложные, составные или фасетные индексы
- Если позволяет железо, можно работать с таблицами в памяти
- Можно наоборот, пожертвовать производительностью в пользу экономии памяти - всё зависит от задачи
Если metadata используется, как альтернативный лёгкий клиент к серверу 1С, получаем значительное ускорение даже на типовых конфигурациях. В эксперименте использованы:
- Один и тот же сервер – физически он расположен в Германии
- Она и та же информационная база
- Один и тот же канал в интернет ping ~ 90ms
- И даже документ мы один и тот же открываем
Наш, и 1С-ный клиенты находятся в абсолютно равных условиях.
Важно: перед замерами в 1С, несколько раз открываем и закрываем формы объектов и списков, чтобы прогреть кеш 1С-ного сервера.
Итак, время открытия типового заказа покупателя в веб-клиенте 1С занимает примерно 2.5 секунды.
В metadata та же операция выполняется за 400 мс.
Теперь посмотрим сетевой трафик. В metadata json прочитанного заказа занимает порядка 7 Кб.
В 1С, только передача пакета отъела 700 мс, и этот пакет занимает 180 Кб.
Таблица объединяет данные результаты измерений:
Операция | Metadata | Веб клиент 1С | Выигрыш времени, раз |
Выигрыш трафика, раз |
---|---|---|---|---|
Мин. время реакции сервера | 150мс | 150мс | - | - |
Загрузка и вход в программу | 4сек/4Mb | 20сек/6Mb | 5 | 1,5 |
Открытие формы "Заказа" | 400mc/8Kb | 2200mc/180Kb | 5 | 20 |
Открытие формы выбора справочника | 300мс/0Kb | 600мс/10Kb | 2 | >> |
Поиск в динсписке кешируемых объектов | 200мс/0Kb | 300мс/10Kb | 1,5 | >> |
Поиск в динсписке с обращением к серверу | 300мс/10Kb | 300мс/10Kb | - | - |
Чудес не бывает. Понятно, что ускорение достигнуто ценой снижения функциональности – например, у наших форм нет условного оформления.
Я не критикую платформу 1С. Технологии веб-клиента 1С и легкого клиента отличаются очень сильно.
Наш лёгкий клиент не предназначен для замены традиционного веб-клиента в тех задачах, с которыми платформа 1С справляется хорошо.
Конкурировать с 1С на её поле - глупо и бесперспективно. Зато, с metadata.js можно сделать бизнесу выгодное предложение в тех областях, куда 1С вообще не заглядывает. Появляется возможность добавить в дешевые веб-приложения такие функции, которые ранее были доступными только в тяжелых учетных системах.
Совмещаем сильные стороны 1С и современного web для решения бизнес-задач
Есть встречное движение:
- 1С в глобальную сеть
- Традиционный web – в область задач автоматизации бизнеса
Чтобы лучше понять это движение и интересы участников, рассмотрим наиболее сильные и слабые стороны 1С и веб-технологий:
- Веб-технологии содержат фантастические по изяществу и выразительности инструменты, но, к сожалению, там нет необходимого для бизнес-задач уровня абстракции. Посмотрите на сайты платежных систем, заказа билетов на самолет, поезд, личные кабинеты операторов сотовой связи – функциональность скудная, так как в языке, на котором думают постановщик и разработчик, нет слов для описания решаемой задачи.
- Платформа 1С - это очень мощный инструмент для построения учетных систем, но он сильно отстал от современного веб. Дело в том, что в 2008-2009 годах, когда проектировалась архитектура управляемого приложения, Javascript был другим. В браузерах не было автономной работы, в языке отсутствовали инструменты для управления свойствами объектов. В результате тонкий и веб-клиент 1С умеют лишь показывать данные и принимать ввод пользователя. В конце нулевых годов, такому подходу, наверное альтернативы не было. Но сегодня, когда любой телефон содержит несколько вычислительных ядер и несколько гигабайт ОЗУ, использование только серверного рендеринга и отказ от данных на клиенте – это непозволительная роскошь.
- В metadata.js
- Задействованы возможности современных браузеров
- Реализован уровень абстракции, доступный ранее только в платформе 1С
- Часть вычислительной работы и хранение коротких списков - справочников и перечислений перенесена на клиента.
Это позволило значительно улучшить производительность, снизить нагрузку на сервер, повысить скорость и качество разработки
Инструменты metadata.js могут украсить жизнь как разработчикам 1С, так и веб-программистам. Но и те, и другие пока не проявляют интереса к нашей математике.
Рассчитывают отсидеться на освоенных технологиях. Конкуренция пока небольшая, «пирога» всем хватает.
Есть устоявшиеся стереотипы:
- Для работы браузера нужно подключение к Интернет
- Настольная программа работает быстро, а браузерная - тормозит
- 1С-ный синтаксис есть только внутри 1С
- Система на 1000 пользователей - это очень дорого
- Из браузера трудно достучаться до COM и USB портов и прочего внешнего оборудования
- Автономное веб-приложение - это очень сложно
Metadata.js пытается эти стереотипы пошатнуть.
- Браузер прекрасно работает offline
- Нативному приложению, чтобы приблизиться к качеству веб-интерфейса, сначала нужно реализовать внутри себя браузер
- Синтаксис, подобный 1С-ному, теперь доступен в javascript
- Система на 1000 пользователей - это реально дешево
- Из javascript легко управлять COM, USB и сетевыми устройствами
- Автономное веб-приложение - это очень просто
Пользуйтесь и зарабатывайте на внедрениях.
*****************
Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2015 CONNECTION 15-17 октября 2015 года.
Приглашаем вас на новую конференцию INFOSTART EVENT 2019 INCEPTION.