Как жить без метаданных

добавлено: 31 окт 15
понравилось:0
просмотров: 2029
комментов: 0

теги:

Автор: Евгений Маляров

Вопрос, как пользователи ExtJS, Qooxdoo, YUI и прочих уважаемых фреймворков, обходятся без метаданных, встал передо мной года четыре назад, когда я впервые попытался реализовать на javascript нетривиальную задачу. Вопрос можно расширить за пределы веб-технологий, ведь метаданных, в их "1С-ном" понимании нет и в известных библиотеках для Java или C#. При этом разработчики как то умудряются выпускать приложения за приемлемое для заказчиков время и обеспечивать пригодное для эксплуатации качество.

Идеи метаданных стары как мир, термин "meta" относят к временам древней Греции. Он означал список рукописных свитков на библиотечной полке.

Метаданные в 1С

В реляционных базах данных, традиционно, каждое поле имеет тип, синоним, значение заполнения и прочие характеристики, позволяющие автоматически сгенерировать экранные и печатные формы для любой таблицы (эффектный пример: MS Access).

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

К сожалению, реализация гениальной концепции метаданных внутри веб-клиента 1С, не лишена недостатков. Дело в том, что в 2008-2009 годах, когда проектировалась архитектура управляемого приложения, javascript сильно отличался от сегодняшнего. Браузеры не имели поддержки автономной работы, отсутствовали важные инструменты для работы со свойствами объектов. В результате, тонкий и веб-клиенты 1С, умеют лишь отображать данные и принимать ввод пользователя. Альтернативы такому подходу в конце нулевых, пожалуй, не было. Но сегодня, когда любой телефон, не говоря о компьютере, имеет гигабайты ОЗУ и несколько вычислительных ядер, отказ от возможностей javascript выглядит странным. В традиционном веб-клиенте 1С:

  • Не учтено, что задержки и пропускная способность Глобальной сети несколько ниже гигабитной ЛВС. Используется синхронная модель взаимодействия с сервером, а объём сетевого трафика (безобидный в офисе), создаёт серьёзные проблемы при работе по GPRS
  • Из встроенного языка 1С нет доступа к объекту window, внутри которого выполняется клиентское приложение. Нет доступа вообще ни к каким javascript-объектам. Разработчик пишет код на языке 1С, а в браузере выполняются скомпилированные платформой модули
  • Из встроенного языка веб-клиента недоступны объекты данных и метаданных – только в контексте серверных вызовов
  • В веб-клиенте не задействованы возможности современных браузеров для кеширования и связывания данных
В 2014-м году передо мной встала задача реализации личного кабинета дилера оконного завода. К тому моменту имелось работоспособное приложение на традиционном 1С. Много клиентского и серверного кода: графический построитель изделий, подсистемы формирования и корректировки спецификаций, ценообразование, диспетчеризация и т.д. Часть функционала (рисовалку и диспетчеризацию), захотелось вынести в веб. Попытка решить задачу «в лоб», через веб-клиент 1С, к успеху не привела. Формально, приложение работало. Формы открывались. Можно было нарисовать изделие и отправить его в план завода, но были фундаментальные проблемы:
  • Неприемлемая производительность на плохих (реальных) каналах связи. Многосекундные задержки открытия форм, могли привести в бешенство даже очень спокойных людей
  • Высокая стоимость рабочего места. Клиентская лицензия 1С на 300 пользователей стоит около миллиона рублей. Для небольших проектов, эта сумма может оказаться заметной на фоне совокупной стоимости

Лёгкий клиент

Отказываться от 1С-ных наработок не хотелось. Их объём и сложность таковы, что за разумное время повторить математику на альтернативных платформах не представлялось возможным. Было принято решение разработать в довесок к толстому, тонкому и веб-клиентам 1С еще один, альтернативный лёгкий javascript-клиент. Впоследствии, проект назвали metadata.js.

Лёгкий клиент использует в работе и сервер 1С и средства построения интерфейса javascript, ни с кем напрямую не конкурирует. Metadata.js не дублирует чужую функциональность, а дополняет её инструментами, которых нет ни в известных javascript-библиотеках, ни в клиентском 1С.

Библиотека задумана для программирования в javascript с помощью высокоуровневых объектов. При этом если задача не содержит бизнес-логики на клиенте, то такого клиента можно реализовать вообще без кода – только на описании метаданных посредством декларативного программирования.

Так как metadata.js — фреймворк универсальный, в качестве сервера может использоваться не только 1С, теоретически, можно подключиться к SAP, MS Dynamics или иному серверу. Если у веб-программиста, реализующего интерфейс, есть любимая библиотека для визуализации данных, он может её задействовать, не ограничиваясь компонентами dhtmlx, которые мы используем по умолчанию.

Как это сделано

С 2009 года сервер 1С умеет взаимодействовать с внешним миром через web-сервисы (SOAP), а в 2014 году, добавлена поддержка rest-сервиса ODATA и произвольных http-сервисов. Большинство операций чтения и записи данных лёгкий клиент выполняет через стандартный 1С-интерфейс ODATA. Сложные выборки данных и обращения к методам объектов 1С, осуществляются через дополнительный http-сервис библиотеки интеграции. Серверные события на клиенте поддержаны через websocket на Node.js.

Структура metadata.js

Сравнение производительности

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

ОперацияMetadata.jsВеб-клиент 1С
Мин. время реакции сервера150мс150мс
Загрузка и вход в программу 4сек/4Mb20сек/6Mb
Открытие формы "Заказа" 400mc/8Kb2200mc/180Kb
Открытие формы выбора из справочника 300мс/0Kb600мс/10Kb
Поиск в динамическом списке кешируемых справочников 200мс/0Kb300мс/10Kb
Поиск в динамическом списке с обращением к серверу300мс/10Kb300мс/10Kb

Резюме

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

Сайт проекта metadata.js
Страница на GitHub

Проект молодой, до коммерческого качества ему далеко.
Публикуя данный материал, рассчитываю найти единомышленников для развития проекта. Запланирован цикл статей по SQL в RAM, как на стороне сервера для тяжелых вычислений, так и в памяти браузера для реализации сложных и отказоустойчивых клиентских интерфейсов.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии