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

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

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

Как я уже сказал, потребность в HTTP-приложениях растет. Какими они вообще могут быть?
Это могут быть сайты;
Сервера с веб-интерфейсами;
Админские приложения и инструменты – те же Zabbix, Jenkins – у них у всех есть веб-интерфейс.
Современные приложения, как правило, уже не десктопные. Они уже работают в браузере, и в будущем, на мой взгляд, все будет только больше и больше уходить в веб.

Поэтому, если вам в вашей системе 1С нужно что-то сделать интересное, классное, привлекательное для клиентов – вам тоже, скорее всего, придется смотреть в сторону HTTP-протокола и веб-приложений.
Например, вам может потребоваться какой-то красивый современный веб-интерфейс к 1С.
Или вам может потребоваться какая-то витрина данных для удаленного филиала, где можно заполнить какие-то три поля, чтобы подать заявку в Service Desk. Это может быть всего лишь одна формочка – отправлять эти данные в 1С может быть даже избыточно.
Потребность в HTTP-приложениях в любом случае есть, она понятна, вам всегда может потребоваться что-то, что взаимодействует по HTTP. Обычно для таких вещей приходится привлекать сторонние команды разработчиков, которые знают JavaScript, PHP, NodeJS, т.е. какой-нибудь фреймворк, который умеет вашему приложению (например, вашей 1С) отвечать по HTTP-протоколу. Получается, что вам приходится нанимать веберов и зависеть от них, а они начинают хитрить, говорить, что им некогда, что это стоит много денег и т.д.
Но мы, как 1С-ники, можем реализовать такие приложения сами – нам для HTTP-приложений не нужны Node.js-еры или питонщики. Цель этого доклада – рассказать о том, как мы можем делать все это сами.

Типичный пример – у бизнеса появляется классная идея сделать слушалку для запросов клиентов, которая будет по HTTP из базы 1С возвращать какие-то JSON-чики. И ваш заказчик просит вас такую сделать.
Вы говорите – я могу сделать HTTP-сервис на 1С, захостим на наших мощностях, все будет отлично.
Вам говорят – нет, он должен хоститься в Амазоне или в облаке Azure, чтобы был доступ по всему миру – как мы туда 1С прокинем? Нам нужно что-то полегче, чем 1С.
Вы говорите – тогда нужно на Python или на NodeJS писать – я это не умею.
Бизнес говорит – ну придумай что-нибудь, ты же 1С-ник, ты должен уметь все.
И мы начинаем думать, какой инструмент веб-разработки нам, как 1С-никам, подошел бы.
История разработки OneScript.Web

Сейчас хочется немного истории.
В 2014 году я на конференции Инфостарта презентовал любопытный инструмент, который я написал. Этот инструмент я назвал OneScript. На тот момент мне хотелось просто поделиться с сообществом тем, что есть такая любопытная штука, с которой можно делать разные интересные вещи.
В 2015 году инструментом OneScript заинтересовались в одном крупном федеральном ритейлере, и мы в этой компании начали активно его применять. Это дало очень большой позитивный выхлоп. Впоследствии инструменты, которые там родились, вышли в мир OpenSource.
2016-2017 год. Продукт начал широко развиваться – родилось большое количество решений, написанных с его помощью. OneScript стал широко известен в сообществе.
По состоянию на сегодняшний день «знание OneScript» – это отдельный навык, который можно встретить в резюме.

По сути, мы вместе с вами, с сообществом OpenSource-разработчиков 1С, создали внутри нашей отрасли отдельную отрасль «автоматизации автоматизаторов», продвигая в среде 1С-специалистов такую концепцию, как DevOps.
Сегодня OneScript, как инструмент, применяется уже в сотнях компаний, причем, как правило, в крупных, потому что им это нужнее. В мелких компаниях не особо нужно себя автоматизировать, а когда баз становится много, там уже без автоматизации никуда.
Мы настроены серьезно и будем продолжать расширять наш инструментарий.

И сегодня я так же, как и в 2014 году, хотел бы анонсировать новый продукт на базе OneScript, который называется OneScript.Web. Это рабочее название. Возможно, кто-то предложит более классное, но пока оно такое.
Как я уже говорил, потребность в HTTP-приложениях огромна, рынок требует, чтобы они были.
Нам нужно научиться писать их самим, чтобы не зависеть от каких-то сторонних веб-разработчиков – мы можем делать это сами.
Причем, это не только сайты, это, скорее, веб-приложения или какие-то REST-сервисы, но и сайты в том числе.
Самое главное, что теперь появился инструмент написания веб-приложений на языке 1С.
Архитектура фреймворка 1Script.Web

Как я уже говорил, OneScript.Web сделан на базе уже известного инструмента OneScript.
Архитектурно он основан на кроссплатформенном веб-фреймворке от Microsoft ASP.NET MVC – поэтому, благодаря новому .NET Core, абсолютно кроссплатформенный, будет работать на любых linux-системах и даже в докер-контейнерах.
Иными словами, OneScript.Web – это MVC-фреймворк, которым можно управлять с помощью кода 1С.
Подход MVC

Как работает протокол HTTP? У вас есть некий браузер, в котором клиент в адресной строке что-то вбивает, этот запрос уходит на сервер, там он обрабатывается, и обратно в браузер возвращается ответ. Так работают абсолютно все HTTP-приложения.
И подход MVC – это такой подход к проектированию веб-приложений, когда внутри этого «черного ящика»-сервера обработка HTTP-запроса поделена на три части – модель, контроллер и представление (Model, View и Controller), каждая из которых отвечает за свою осмысленную деятельность.

Если упрощать и возвращаться к 1С, то:
Модель – это предметная область, метаданные, то, чем наше приложение вообще занимается. Это какие-то описания реального мира – контрагенты, номенклатура, что угодно.
View – это представления, формочки, то, что видит на экране пользователь.
А Controller – это входная точка обработки, с которой все начинается. Чаще всего, это либо HTTP-сервис, либо обработчик команды в модуле формы. Прямого аналога в мире 1С нет.
URL – основа навигации по приложению

Взаимодействие с удаленным веб-приложением всегда строится вокруг URL – именно он является «точкой входа» для получения от приложения какой-то информации.
Как правило, URL выглядит следующим образом: есть имя сервера, и дальше через какие-то сегменты (разделы) вы осуществляете навигацию внутри приложения.

Эти сегменты URL можно представить как некие классы внутри приложения, у которых есть методы. То есть, какой-то клиент по этому адресу может запросить у определенного класса вашего приложения вызов определенного действия.

Как вы можете ответить на этот запрос в приложении, написанном на OneScript.Web?
Чтобы запрос по этому адресу смог обрабатываться в вашем коде 1С, вам нужно просто добавить в ваше приложение модуль с соответствующим названием и реализовать в нем обработку этого метода. Например, вы можете создать в модулях приложения контроллер обработки заказа – файл orders.os с методом Details и каким-то параметром этого метода.

Все это довольно гибко настраивается, для этого существует схема шаблонизации:
Вы задаете в приложении один или несколько шаблонов маршрута, по которым ваше приложение будет отвечать.
Все варианты настройки шаблонов маршрутов я описывать не буду – их очень много.
Если в адресной строке будет вбит URL, который не совпадает с шаблоном, программа будет автоматически отвечать «404 Не найдено».
А в случае совпадения с шаблоном запрос будет попадать в ваш код – в соответствующий метод контроллера.
Вот так это работает.
Инициализация приложения

Как происходит инициализация приложения?
Вспомним картинку с браузером – HTTP-запрос пролетает некий конвейер. Пришел запрос, как-то обработался, и возник ответ. За то, как этот запрос обрабатывается, отвечает конвейер обработки запроса.
Этот конвейер состоит из кубиков, которые по-английски называются Middleware (софт, который посередине). Я не знаю, как перевести это слово на русский, дам шоколадку тому, кто скажет хороший перевод этого слова на русский язык.

Так вот, путь обработки запроса строится из блоков, кубиков конвейера.
Например, приходит HTTP-запрос.
Если в нем есть обращение к какому-то статическому файлу на диске, этот файл сразу отдается клиенту. Например, пришел запрос к картинке, которая есть на диске – она отдается клиенту.
Дальше проверяется логин-пароль.
И, если запрос попадает в шаблонный URL, клиенту возвращается ответ.

Как настроить такой конвейер?
В фреймворке есть модуль приложения, и в нем, как в настоящей 1С, есть инициализирующая процедура «ПриНачалеРаботыСистемы».
В ней вы можете набрать конвейер, просто вызывая методы приложения, как блоки/кубики, в нужном порядке.
На скриншоте показано, как с помощью кода построить конвейер, который был описан на предыдущем слайде.

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

Тогда конвейер будет выглядеть следующим образом:
Сначала авторизация;
Потом проверка на отдачу статики;
И затем бизнес-логика.

Конвейер обработки можно строить любым образом – например, мы можем вообще выкинуть весь этот MVC и просто отдавать статические файлы по паролю – тогда мы можем построить конвейер так, как на слайде.
Соответственно, в процедуре «ПриНачалеРаботыСистемы» мы решаем, что вообще будет делать наше веб-приложение – будет ли в нем нужна авторизация, маршрутизация и пр.
Вызов методов приложения. РезультатДействия

А что же такое Контроллер? Это, как я уже говорил, входная точка, которая обрабатывает запрос.
По сути, это модуль 1С, у которого есть экспортные методы. Все экспортные методы вашего модуля-контроллера доступны извне – внешняя система по URL может вызвать любой экспортный метод вашего контроллера.
Например, метод-действие Details возвращает некое представление – вьюшку «КарточкаТовара». Это – экспортный метод, который вызывается по URL в браузере.

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

Что такое «Результат действия»? Это – базовый тип для различных вариантов ответа клиенту. Нам необязательно отвечать клиенту именно HTML-страничкой:
Мы можем отдать ему с сервера какой-то файл на скачивание;
Мы можем ответить ему каким-то JSON или XML;
Мы можем просто возвращать коды ошибок – «Не найден», «Не авторизован» и т.д.
HTTP-приложения традиционно отвечают разным типом содержимого. Для каждого из таких типов содержимого в системе предусмотрен отдельный объект:
РезультатДействияСодержимое;
РезультатДействияФайл;
РезультатДействияПредставление;
РезультатДействияКодСостояния и т.д.
Контроллер должен вернуть один из таких результатов действия. Это сделано для разделения ответственности, потому что формирование и отправка ответа – это разные действия.
Как верстать страницы?

Итак, самое интересное – как же верстать HTML-страницы?
Понятно, что мы можем ответить XML-кой, но интересно строить еще и интерфейс – красивые формы, чтобы там все было модно-молодежно и т.д. И это – самая сложная часть, потому что мир фронтэнда крайне разнообразен.
Существуют тысячи фреймворков и способов формирования веб-интерфейса (HTML-интерфейса). И выбрать какой-то, который был бы прост для вхождения 1С-ников, достаточно сложно – потому что все это выглядит очень низкоуровневым. Вообще, HTML и CSS – это, по сути, язык ассемблера, они очень низкоуровневые, очень избыточные. И мыслить в терминах HTML и CSS – это трудоемко. Нужно что-то более высокоуровневое.
Например, уже сейчас с помощью различных JS-фреймворков типа React, Angular и пр. вы можете строить Single Page Application, передавая им на вход JSON-чики, сформированные с помощью Oscript.Web, а какие-то JavaScript-еры вам будут писать интерфейс на Angular.
Как я уже говорил, рынку требуется построение фронтэнд-а для 1С. Поэтому мы в «Серебряной пуле» ведем свои исследовательские работы по теме «Фронтэнд для 1С-ников» – об этом вчера рассказывал Алексей Лустин.
Также есть доклад Игоря Антонова, который рассказывал, как строить интерфейсы для 1С на React – вы также можете применить его наработки.

И сейчас движок OneScrip.Web предлагает для верстки страниц родной ASP-шаблонизатор, который называется Razor. Он достаточно простой, легковесный и мощный, представляет собой HTML-страницу с вкраплениями кода на C#. Поскольку это родной движок от Microsoft, в него ничего дополнительно не прикручено, поэтому русскоязычная документация, которая есть на сайте Microsoft полностью соответствует тому, что вы можете делать с веб-движком OneScript с помощью Razor.

Выглядит он следующим образом – на слайде показан пример вьюшки из веб-консоли администрирования кластера 1С, которую я покажу в конце своего доклада.
В эту вьюшку передается некий объект языка 1С, который нужно вывести, например, это может быть таблица значений или структура.
И дальше внутри Razor-овской вьюшки вы можете работать с этим объектом, как со структурой – через @ можете обращаться к методам класса 1С, перебрать строки, колонки с помощью цикла «Для каждого из» – что угодно.

Сейчас развитие фреймворков, особенно WebAssembly, идет семимильными шагами.
Мы уже можем уйти от HTML и верстать так, как показано на слайде – создавать высокоуровневые компоненты – командные панели, кнопки. Такое можно делать на React или на Blazor.
Можно пойти еще дальше и сделать это все через «Новый ВебФронт», о котором рассказывал Алексей.
Вариантов, которые можно было бы применить, очень много. Пока что мы не выбрали какой-то идеальный. Поэтому так же, как это было с обычным OneScript, с OneScript.Web мы тоже рассчитываем на то, что сообщество OpenSource подскажет нам наиболее правильный путь.
Работающие приложения. Odminus

Какие уже существуют работающие приложения, которые можно пощупать?
Во-первых, существует хранилище готовых пакетов OneScript – то самое облачное хранилище пакетов, с которого мы все, как девопсеры (те, кто занимается DevOps для 1С), скачиваем готовые приложения. У нас есть консольный пакетный менеджер opm, мы набираем в нем «opm install ЧтоНибудь» – и с этого сайта hub.oscript.io скачивается какой-то пакет. Веб-интерфейс хаба пакетов написан на движке OneScript.Web.
Кроме того, мы у себя внутри разрабатываем Личный кабинет клиента «Серебряной пули», тоже на OneScript.Web.
И существует еще одна почти готовая разработка, которую можно щупать и смотреть – административная консоль кластера 1С. Называется она Odminus. Название канонично написано через «о», потому что правильный «одмин» всегда пишется через «о».

Что такое Odminus?
Это – та самая «Административная консоль управления серверами в кластере 1С», но только в браузере.
При этом, за счет того, что она использует сервер администрирования RAS, она еще и не зависит от версий платформы.
И, самое главное – не требует регистрации COM-компонент. Зачем я вообще начал ее писать? Потому что каждый раз, когда мне нужно было посмотреть сеансы на сервере или завершить какой-то сеанс, мне приходилось перерегистрировать COM-оснастку, потому что сервер, на котором находится нужный мне сеанс – другой версии. Я выходил из себя из-за того, что мне приходилось делать какие-то лишние телодвижения, чтобы что-то поправить. Поэтому я разработал эту веб-консоль. Теперь, чтобы сделать что-нибудь с кластером, мне достаточно просто зайти на страничку в браузере – ничего не устанавливая и не настраивая.
Код открытый, его можно дорабатывать – он написан на 1С. Эту веб-консоль уже сейчас можно брать и дописывать исключительно средствами языка 1С, не изучая вообще никаких PHP.

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

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

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

Можно добавить какой-то рабочий сервер, поработать с объектами кластера.

Можно прямо в браузере отрегулировать интервал перезапуска и лимит по памяти.
Бекэндом для приложения Odminus является код на 1С, реализующий обертку к стандартной консольной утилите от фирмы 1С, которая называется RAC (Remote Administration Client).
Я даже не писал эту обертку сам, ее написал Артем Кузнецов – OpenSource рулит. Я просто скачал с хаба opm готовый пакет, который вы уже сейчас можете использовать. С помощью этой обертки я получил готовую объектную модель для управления своими серверами, чтобы просто писать: Кластер.Серверы(), ИнформационнаяБаза.Сеансы() и прочее.
Я просто взял готовое решение и, вызывая его методы в контроллерах своего приложения, рисую такие веб-формочки. В приведенном на слайде куске кода я получаю кластер по ID, передаю объект кластера в формочку, и она рисуется.
Даже без веб-движка, если вам нужно как-то порулить вашим кластером, вы можете скачать эту библиотеку и в объектной модели работать с кластером 1С без COM, на Linux, без регистрации версий и т.д. Я рассказываю это к тому, что в экосистеме пакетов OneScript уже сейчас представлено очень большое количество инструментов, с которыми можно работать.
Выгоды и перспективы

Зачем все это нужно?
Это все нужно для того, чтобы быстро выводить свое решение на рынок. Если у вас или у вашего бизнеса есть некая идея, но вы понимаете, что вам придется для ее реализации пойти покланяться в ножки команде веб-разработчиков – попросить их сделать для вас маленький HTTP-сервис, который будет что-нибудь отвечать. Чтобы этого избежать, остаться в рамках той же команды и решить свою задачу, не завися не от кого и не прося никого – можете воспользоваться инструментом OneScript.Web. Он даст вам быстрый старт уже имеющейся командой, независимо от смежников.
Более того, вам не потребуется лицензия 1С на эти серверы. В 1С каждый HTTP-вызов требует лицензию, а OneScript.Web не требует никаких лицензий. Развернули его на сервере и точно так же отвечаете по HTTP, по REST, какими угодно файликами. Никаких лицензий при этом не требуется.
Программируете вы все равно на 1С. Это – тот же самый язык 1С, только несколько библиотечек добавлено сверху.
Тут еще и удовольствие, что вы изучаете что-то новое, модное. Как я уже говорил, в каждой кофеварке сегодня стоит веб-сервер. OneScript.Web тоже сделан на базе очень легковесного, контейнеризируемого веб-сервера от Microsoft – Kestrel. Если вы вдруг делаете умную кофеварку с HTTP-сервисом, которым хотите управлять с телефона, вы можете залить в нее код на 1С, и он будет работать, потому что занимает очень мало места. OneScript.Web использует новое ядро ASP.NET от Microsoft, которое как раз заточено под такие легковесные приложения. Поэтому вы можете программировать кофеварки на 1С и оставаться при этом в тренде. Это очень круто, на мой взгляд.
**********************
Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2018 EDUCATION. Больше статей можно прочитать здесь.
В 2020 году приглашаем всех принять участие в 7 региональных митапах, а также юбилейной INFOSTART EVENT 2020 в Москве.

