Веб-разработка на 1Script. Глава 1

Программирование - Практика программирования

1Script oscript web

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

Глава 1

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

Таким образом, создание нашего веб-приложения и веб-движка будет происходить «в прямом эфире» Инфостарта. Более того, поскольку это все будет Open-Source, то вы и сами сможете поучаствовать в процессе.

Вижу цель – не вижу препятствий

У вас есть сервер 1С? А сколько их у вас? Если несколько, да к тому же на разных версиях платформы, то вы хорошо себе представляете всю «прелесть» их администрирования с помощью стандартной консоли администрирования. На всякий случай напомню, что эта консоль привязана к конкретной версии 1С и устанавливается глобально на всю систему. Если вам нужно на секундочку заглянуть в сервер другой версии, вам придется выполнить ряд шаманских действий по перерегистрации консоли на другую версию.

Конечной целью нашего путешествия должно стать приложение, имеющее веб интерфейс, с нормальным json-api, с пунктом меню "убить всех", с быстрыми шаблонами "Заблокировать на ... минут" и подобным.

Даже если вы не собираетесь писать сайты на 1Script, но интересуетесь веб-разработкой в перерыве между Конфигуратором и приемами пищи, то данная книжка будет несомненно полезной и поможет уложить в голове основные подходы и практики разработки «не-на-1С».

Поехали!

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

В 2018 году большинство программ с открытым исходным кодом располагаются на сервисе github.com. Даже в замкнутом мире 1С уже, наверное, не осталось людей, которые ни разу не слышали про этот сервис. Это глобальная социальная сеть для программистов. Только вместо фоточек – обмениваются кодом, багрепортами, предложениями и улучшениями.

Если у вас есть программа, которую вы хотите опубликовать – делать это лучше на github.

Кроме того, в 2018 году никто в здравом уме не рискует писать программы, не сохраняя историю версий кода. Каждая правка программы может быть удачной, а может быть и нет. Всегда нужна возможность отката к предыдущему состоянию. Все это приводит нас к тому, что в рамках достижения нашей цели мы, все-таки, должны будем освоить git и github. Это не так страшно, как кажется.

Кроме того, от нас потребуется умение немного, совсем чуть-чуть, печатать в системной консоли.

Регистрируемся на github

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

Установка установщика

Нам потребуется установить на машину довольно много инструментов, поэтому, чтобы сэкономить время на поиск и скачивание дистрибутивов – мы поставим пакетный менеджер chocolatey, который спасет кучу нашего времени. Что такое chocolatey? Это программа, которая позволяет вам вместо того, чтобы найти сайт программы, скачать setup, запустить его и нажать Далее-Далее, просто сказать «поставь мне фотошоп» и все будет сделано само. Единственная проблема: вот именно фотошоп она не поставит, поскольку он платный, закрытый и его надо покупать у компании Adobe, а не ставить с помощью пакетных менеджеров. Однако, с бесплатными продуктами никаких проблем – можно ставить все, что душе угодно.

Итак, ставим chocolatey. Полная инструкция по установке находится по адресу https://chocolatey.org/install. Но мы сэкономим время, и напишем прямо здесь то, что нужно сделать:

Для Windows 10

  • Правой кнопкой по меню «Пуск», выбрать Windows PowerShell (администратор)
  • Вставить в консоль команду:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

Для Windows более младших версий

  • Правой кнопкой по меню «Пуск», выбрать Командная строка (администратор)
  • Вставить в консоль команду:
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

После выполнения команды на компьютер будет установлена версия chocolatey.

Установка git

Если git у вас уже установлен – переходим к следующему пункту.

После установки choco не закрываем административную консоль, в ней пишем:

choco install git /NoShellIntegration

На вопрос отвечаем «Y» - то есть «да, установить». Ключик «NoShellIntegration» я рекомендую указать, чтобы git не ставил нам свой собственный встроенный клиент. Он довольно убогий, и мы поставим другой.

Установка 1Script и Visual Studio Code

Для разработки нам потребуется инфраструктура 1Script и редактор кода Visual Studio Code.

Подробная инструкция что к чему находится на инфостарте здесь: //catalog.maxima.pro/public/687869/ и видеоинструкция здесь: //catalog.maxima.pro/public/685014/ Установим редактор:

choco install visualstudiocode

И установим 1Script:

choco install onescript.cli -Source http://myget.org/F/onescript -y

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

Скачиваем веб-движок

После установки инструментов осталось скачать предмет нашей беседы – веб-движок 1Script. Поскольку он пока находится в разработке – у него нет официального дистрибутива. Он публикуется непосредственно на гитхабе в разделе «Releases» по ссылке https://github.com/EvilBeaver/OneScript.Web/releases/download/v0.1-alpha-1/osp-0.1-alpha-1.zip

Скачайте архив с движком и распакуйте его на диск. Желательно, чтобы путь к каталогу был коротким, т.к. нам предстоит его указывать в консоли. Например, его можно распаковать на D:\osweb

Если у вас версия windows младше 10-ки, то лучше, на всякий случай, обновить еще и .net framework.

choco install –y dotnet4.6.1

В итоге, у нас должны на машине оказаться:

  • Git
  • VSCode
  • 1Script
  • Веб-движок OSP.NET

Проверка систем

  • Откройте чистую консоль с нуля (Пуск/Выполнить, cmd, Enter)
  • Напишите git, Enter. Должен быть выдан результат работы git, а не какие-то ошибки системы
  • Напишите oscript, Enter. Должен быть выдан результат работы 1Script
  • Напишите opm, Enter. Должен быть выдан результат работы пакетного менеджера 1Script

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

Приступаем к проекту

Я буду вести разработку на базе шаблона веб-приложения https://github.com/EvilBeaver/webapp-template. В нем уже есть готовая структура проекта, которая достаточно удобна для быстрого старта.

Переходим по ссылке на репо шаблона проекта и нажимаем кнопку «Clone or Download/Download ZIP». У вас скачается архив с шаблоном веб-приложения. Распакуйте его в любое удобное место.

У меня это будет D:\GITS\ServersConsole

Обратите внимание, мы не делаем «форк» от шаблона. Шаблон - это просто заготовка. Реальный проект на его основе нужно делать в отдельном, созданном с нуля репозитории.

Запустим Visual Studio Code и откроем наш проект через меню «Файл/Открыть папку», где укажем нашу папку с проектом ServersConsole. В левой панели vsc появятся файлы нашего проекта.

У VSCode есть удобная встроенная консоль, которая позволяет, не переключаясь в другие окна, вводить команды системы. Запустим интегрированный терминал из меню «Вид» (Ctrl+`).

В нем введем:

git init

git add –A .

 

В левой панели VSC у значка контроля версий должно будет появиться число файлов, содержащих изменения. Перейдем в закладку контроля версий и напишем комментарий к нашему изменению «Первичное размещение файлов проекта». После чего нажмем кнопку с галочкой.

Все, наши изменения теперь зафиксированы. Что бы мы ни натворили с кодом – мы всегда сможем вернуться к состоянию «Чистого листа».

Изучаем модуль приложения

Запуск приложения начинается с модуля «main.os» который расположен в корне исходников приложения. Откроем этот файл и посмотрим на него:

#Использовать "model"

Процедура ПриНачалеРаботыСистемы()

      ИспользоватьСтатическиеФайлы();
      ИспользоватьМаршруты();

КонецПроцедуры

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

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

В данном случае мы указали, что нужно загрузить в область видимости классы и модули, объявленные в папке «model». Сейчас в ней ничего нет, мы наполним ее несколько позже.

Добавляем контроллер

Вернемся в закладку с деревом файлов (левая панель со значками). В дереве файлов VSC выделите папку src/controllers и создайте в ней (плюсиком «Добавить файл») файл «home.os». Это будет наш контроллер, который отвечает за обработку URL начинающихся с /Home. Если в этом месте непонятно, что такое «контроллер» - рекомендую вернуться к вводной статье //catalog.maxima.pro/public/722160/ и прочитать ее еще раз.

Итак, в нашем контроллере создадим следующий метод:

Функция Index() Экспорт
      Возврат Содержимое("Привет");
КонецФункции

Это будет бизнес-логика, срабатывающая при вызове контроллера.

Понятие «Маршрута»

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

В нашем шаблоне приложения уже зарегистрирован типовой маршрут по схеме «Контроллер=Home/Действие=Index».

Это означает, что при запросе любого из адресов:

  • /
  • /Home
  • /Home/Index

Будет вызываться контроллер Home и его метод Index, результат которого будет отправлен клиенту.

А как запустить и посмотреть?

Вот теперь самое интересное. Мы ранее скачали и распаковали на диск веб-движок. У меня это d:\osweb. Перейдем в интегрированный терминал VSCode. Там, сменим текущий каталог на подпапку src командой cd src.

Теперь, можно запустить сервер приложения. Он ищет исходники в текущем каталоге и запускается, слушая адрес localhost:5000. Запускаем:

D:\osweb\OneScript.WebHost.exe

В терминале должен появиться текст:

Подсказка: в консоли есть автодополнение. Начните набирать первые буквы, затем нажмите Tab. Система предложит подходящее название. Если таких названий несколько- нажимайте Tab до тех пор, пока не появится нужное.

Теперь откроем браузер по адресу http://localhost:5000 и увидим в нем наше приветствие. Можно поменять URL на http://localhost:5000/Home/Index и результат будет тот же.

Теперь, остановим наше приложение нажатием Ctrl+C в терминале. Это действие аналогично команде «Завершить отладку» в Конфигураторе 1С.

Маленький трюк: чтобы в консоли выполнить предыдущую команду надо нажать стрелку «вверх» на клавиатуре. История введенных команд листается стрелками Вверх и Вниз. Таким образом, чтобы перезапустить наше приложение, нужно в терминале нажать Вверх и Enter.

Так на данный момент выглядит цикл запуска/останова отладки (пока не созданы расширения для VSC специально под веб-разработку для OneScript). Т.е. мы запускаем приложение в директории с исходниками, проверяем работу в браузере, останавливаем приложение по Ctrl+C, перезапускаем по «Стрелка Вверх, Enter». В будущем для веб-приложений будет доступен пошаговый отладчик, так же, как и для обычных скриптов на 1Script.

Отображение веб-страниц

Вывод из предыдущего примера, разумеется, не является HTML-страницей. Этот способ вывода подходит, когда мы должны передать на клиент сухую текстовую информацию, например, результат вызова какого-нибудь JSON-API. Для отображения html-страниц на сцену выходит компонент MVC, скрывающийся под буквой “V”. Он же View, он же Представление.

Технически веб-движок 1Script можно дополнить различными шаблонизаторами страниц, однако, на данном этапе развития в движке существует только родной для ASP шаблонизатор Razor от фирмы Microsoft. Он весьма мощный и при этом простой в освоении.

Для включения механизма представлений нам надо немного модифицировать наш метод Index

 

Функция Index() Экспорт

    Возврат Представление("Привет");

КонецФункции

 

Жирным шрифтом я выделил измененную строку кода. Снова запустим наше приложение через встроенный терминал и зайдем браузером на адрес localhost:5000. Мы увидим следующую картину:

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

Представления, ассоциированные с контроллером home, хранятся в подкаталоге views/home. Представления, которые не привязаны к какому-либо контроллеру, располагаются в папке views/shared.

Создадим в папке views/home файл «Привет.cshtml» следующего содержания:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
   <head>
       <title>Index</title>
   </head>
<body>
    <div>Hello World (from the view)</div>
</body>
</html>

Теперь обновим в браузере страницу по F5. В браузере будет отображена страница, созданная из нашего шаблона.

Каркас разметки представлений

Легко заметить, что в начале HTML шаблона расположена странная конструкция @Layout = null. Эта строка добавлена специально для учебного примера, в реальных страницах такое будет встречаться очень редко. Дело в том, что большинство веб-приложений имеют довольно стабильный «каркас» разметки он же «Layout». Довольно муторно в каждой странице создавать теги html, body и прочие обязательные с точки зрения стандарта, но повторяющиеся блоки. Такие вещи обычно выносят в каркас разметки, а в самих страницах формируют уже конкретные, общественно полезные элементы интерфейса.

В применяемом нами шаблоне приложения уже создан базовый каркас разметки, «раскладка», которая задает основной html страницы, ее заголовки, стили, открывающие/закрывающие теги body и пр.

Файлы раскладок хранятся в подкаталоге views/shared и начинаются с символа подчеркивания «_». Используя раскладку, мы объявляем основной «скелет» разметки интерфейса и в дальнейшем меняем только его наполнение.

Сам файл разметки имеет содержимое:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
</head>
<body>
    @RenderBody()
</body>
</html>

Т.е. легко заметить, что это и есть весь тот самый «обрамляющий» страницу html код. А ее осмысленное содержимое выводится в том месте, где расположен вызов метода «RenderBody()».

Если из предыдущего примера с файлом «Привет.cshtml» убрать весь обрамляющий код, а также конструкцию { @Layout = null }, то файл «Привет.cshtml» примет вид:

<div>Hello World (from the view)</div>

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

Обновите страницу localhost:5000 в браузере и вы увидите тот же самый результат.

Упрощение вызова контроллера

На самом деле, каждый раз придумывать имена для View – довольно утомительное занятие. Для упрощения жизни в системе существует соглашение: «имя Представления совпадает с именем вызывающего метода контроллера».

Поскольку в нашем примере маршрут /home/index ведет к контроллеру home и его методу Index, то представление, которое отображает результат данного вызова, по-умолчанию имеет имя “Index.cshtml”

Если имя представления в вызове метода «Представление()» не будет указано, то будет осуществлен поиск файла .cshtml с тем же именем, что и текущий метод контроллера.

Иными словами, достаточно переименовать наш тренировочный файл «Привет.cshtml» в «Index.cshtml», как у нас появляется однозначная связка метода-обработчика с представлением. И тогда, можно не задавать имя представления в самом контроллере, а оставить все по-умолчанию.

// вызов Представление() без указания имени. Будет искать /views/home/Index.cshtml
Функция Index() Экспорт
    Возврат Представление();
КонецФункции

По традиции, изменение показано жирным шрифтом.

Подведем итог

Маршрут URL определяет – где находится точка входа в каждый конкретный http-вызов нашего приложения.

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

Представления располагаются в папке views/{имя контроллера} или views/shared, если они не относятся к какому-либо конкретному контроллеру.

Имя файла представления желательно делать таким же, как имя метода, которым данное представление формируется.

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

Разработку интерфейса мы будем вести с помощью довольно простого фреймворка «semantic UI». Для него существует в сети довольно много шаблонов, и мы сможем тырить оттуда идеи верстки. Новомодные React и Vue оставим на потом, это целый отдельный мир и лезть туда – это полезно, но пока не стоит забивать себе голову.

Тем не менее, я хочу отдельно заметить, что в сети огромное количество уже готовых компонентов интерфейса. На любой вкус и цвет. Практически никто сейчас не пишет элементы интерфейса с нуля. Однако, в рамках этой книги мы займемся именно этим – созданием UI на низком уровне. Это потому, что наша цель – описать фреймворк разработки, его составные части и принцип работы. Это лучше делать на детальном уровне, чтобы принцип функционирования был понятен. Проще говоря, чтобы использовать современный UI типа React – надо сначала выяснить, куда его вставлять. Рассказ про React и современный web UI - это отдельная книжка, которая уведет нас от основной темы очень далеко.

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

Откроем файл /views/shared/_mainLayout.cshtml и изменим его следующим образом:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link rel="stylesheet" h_ref="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.13/semantic.min.css"/>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="~/default.css"/>
</head>
<body>
    <!-- top menu -->
    <div class="ui inverted huge borderless fluid menu">
      <a class="header item">Odminus</a>
      <div class="right menu">
        <a class="item">Настройки</a>
        <a class="item">Помощь</a>
      </div>
    </div>
    <div class="ui grid">
        <div class="row">
            <div class="three wide column" id="sidebar">
                <div class="ui secondary vertical fluid menu">
                    <a class="item active">Центральные серверы</a>
                    <div class="ui hidden divider"></div>
                    <a class="item">Информационные базы</a>
                    <a class="item">Администраторы</a>
                    <a class="item">Блокировки</a>
                </div>
            </div>
            <div class="twelve wide column" id="content">
                @RenderBody()
            </div>
        </div>
    </div>
</body>
</html>

Обратите внимание, в примере кода пришлось исказить атрибут href, поскольку парсер Инфостарта заменяет такой текст на свой собственный редирект. (если администрация слышит - парни, запишите баг). В реальном коде замените в скопированном тексте h_ref на href.

Кроме того, в папке wwwroot создадим файл «default.css» следующего содержания:

body {
    display: relative;
}

#sidebar {
    height: 100vh;
    background-color: #f5f5f5;
    padding: 0px;
    margin-top: -10px;
}
#sidebar .ui.menu {
    margin: 2em 0 0;
    font-size: 16px;
    padding-left: 10px;
}
#sidebar .ui.menu > a.item {
    color: #337ab7;
    border-radius: 0 !important;
}
#sidebar .ui.menu > a.item.active {
    background-color: #337ab7;
    color: white;
    border: none !important;
}
#sidebar .ui.menu > a.item:hover {
    background-color: #4f93ce;
    color: white;
}

#content > .ui.grid {
    padding-right: 4em;
    padding-bottom: 3em;
}
#content h1 {
    border-bottom: 1pt solid #eee;
    padding-bottom: 3pt;
}

И что получилось?

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

Разработка модели

Под «Моделью» (буква М в аббревиатуре MVC) понимают данные, с которыми работает пользователь. Иными словами, это модель предметной области, ее отражение в виде программного кода. Модель также отвечает за обработку данных, их непротиворечивость и т.п. В бухгалтерском приложении, например, модель содержит контрагентов, налоговые ставки, план счетов, остатки и т.п. Ничего не напоминает?

Любое приложение 1Script по аналогии с приложением 1С содержит общие модули и пользовательские типы. Общий модуль – это прямой аналог общего модуля из 1С. Пользовательские типы немного отличаются. В 1С мы не можем напрямую создать пользовательский тип. Мы можем только отнаследоваться от предлагаемых базовых типов «Справочник», «Документ», «Обработка» и пр. В 1Script нет базовой платформы с прикладными бизнес-объектами, поэтому пользовательские типы больше похожи на классические языки программирования. Мы сами объявляем некий тип (класс) и потом используем экземпляры этого типа, создавая их через оператор «Новый».

Более подробно механизм модулей и классов описан на сайте http://oscript.io/docs/page/package-loader. Мы не будем до поры останавливаться на нем, на данный момент подробный принцип работы для нас не актуален.

Итак, классы и модули модели. Шаблон приложения настроен таким образом, что загружает модель из подкаталога src/model. Сам подкаталог model содержит 2 папки: classes и modules. Любой файл с кодом *.os, который мы положим в папку model/modules станет общим модулем приложения. Файл должен именоваться по принципам именования переменных.

Соответственно, любой файл с кодом, который мы положим в папку classes станет пользовательским типом, который можно будет создавать через «Новый».

Наша консоль будет работать с сервером администрирования RAS/RAС, который позволяет не привязываться к конкретной версии администрируемого кластера серверов 1С.

Кроме того, я думаю, что в рамках данной серии статей мы не будем описывать полноценную работу с RAC, поскольку она является достаточно новой для 1С-ников и сам по себе код вызова RAC будет отвлекать своей непривычностью от основной задачи – построения веб-приложения. Поэтому, тонкости работы с RAC я в тексте постараюсь опускать. Готовый работающий код будет лежать на github и его можно будет изучить там, без увеличения объема статьи.

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

Значит, нам понадобится сущность «Администрируемый сервер» с которого и начинается все дальнейшее администрирование. У него будет пользовательское наименование, сетевое имя и тип протокола «RAC» или «COM». COM пригодится для администрирования старых версий платформ. Их можно, например, зарегистрировать под разными именами COM-классов, как описано в статье //catalog.maxima.pro/public/685924/.

Далее, нам потребуется список таких серверов и возможность добавлять, править и удалять сервера из этого списка. Все это задачи базы данных. В 1Script есть готовый пакет для работы с базами данных https://github.com/oscript-library/sql, однако, на данный момент мы не будем отвлекаться на детали работы с БД, а саму базу заменим файлом json. Благо, объем предполагаемых к хранению данных – очень маленький.

Создание и хранение списка серверов

Пусть за управление списком серверов у нас отвечает общий модуль ЦентральныеСерверы.

Тогда, в модуле ЦентральныеСерверы у нас получаются методы

  • ПолучитьСписок()
  • Создать ()
  • Записать (Элемент)
  • Удалить(Элемент)

Предположим, файл с данными о серверах у нас будет лежать в текущем каталоге под именем appData.json. Для работы с форматом json будем использовать стандартный пакет json из библиотеки 1Script.

Добавление пакета в проект

Каждый раз, когда мы хотим что-то написать, удобно задавать себе вопрос: а вдруг кто-то уже написал подобное? В данном случае, пакет для работы с JSON уже есть в библиотеке 1script. Этот пакет – порт разработки Александра Переверзева с инфостарт. В 1Script она перекочевала с минимальными доработками, путем копирования и вставки. Это ведь один и тот же язык, поэтому запускать готовый код 1С в среде 1script довольно удобно.

1Script имеет облачное хранилище готовых пакетов и пакетный менеджер, который позволяет быстро и просто установить нужный пакет для нужд разработки. После установки пакета наша программа получит т.н. «зависимость» от внешнего пакета. Этот факт надо отразить в манифесте приложения, для того, чтобы было понятно – какие сторонние библиотеки нашей программе нужны для работы.

Зависимости отражаются в специальном файле - Манифесте приложения – с именем packagedef. Этот файл находится в корне нашего каталога исходников (src). Откроем его.

Описание.Имя("odminus")
	.Версия("0.1.0")
	.ЗависитОт("json")
;

Жирным шрифтом выделена строчка, которую я туда добавил. Теперь, другие разработчики смогут увидеть – какие зависимости нужны нашей программе.

Откроем встроенный терминал vsc (меню «Вид\Интегрированный терминал» или Ctrl+`) В нем должен быть открыт подкаталог src нашего репо. Если это не так, перейдите в каталог src командой «cd src».

Далее, находясь в каталоге src пишем:

opm install -l

Эта команда означает приказ пакетному менеджеру opm установить все пакеты зависимостей из packagedef. Ключик –l означает, что пакет надо установить локально – в текущий каталог, а не в системное хранилище пакетов 1Script.

После выполнения этой команды пакетный менеджер скачает нужную библиотеку из облака и разместит ее в подкаталоге oscript_modules. В нашей программе станет доступна библиотека json. Поместим это изменение в хранилище git. (В боковой панели слева кнопка «Управление версиями»)

Создание модуля управления серверами

Создадим файл ЦентральныеСерверы.os в папке src/model/modules. Программируется этот файл также, как и любой модуль в 1С.

В начале файла добавляем директиву импорта:

#Использовать json

После указания директивы импорта классы, объявленные в библиотеке «json» станут нам доступны, и мы сможем ими пользоваться.

Создаем остальной код модуля:

#Использовать json

Перем мПутьКФайлуНастроек;

Функция СодержимоеНастроек()
    
    Файл = Новый Файл(мПутьКФайлуНастроек);
    Если Не Файл.Существует() Тогда
        Содержимое = "[]";
    Иначе
        Текст = Новый ЧтениеТекста(мПутьКФайлуНастроек);
        Содержимое = Текст.Прочитать();
        Текст.Закрыть();
    КонецЕсли;
    
    Возврат Содержимое;
    
КонецФункции

Функция ПолучитьСписок() Экспорт

    СписокСерверов = Новый ТаблицаЗначений;
    СписокСерверов.Колонки.Добавить("Идентификатор");
    СписокСерверов.Колонки.Добавить("СетевоеИмя");
    СписокСерверов.Колонки.Добавить("Порт");
    СписокСерверов.Колонки.Добавить("Режим");

    Парсер = Новый ПарсерJSON;
    Данные = Парсер.ПрочитатьJSON(СодержимоеНастроек(),,,Истина);
    Если ТипЗнч(Данные) <> Тип("Массив") Тогда
        Возврат СписокСерверов;
    КонецЕсли;

    Для каждого объект Из Данные Цикл
        ЗаполнитьЗначенияСвойств(СписокСерверов.Добавить(), объект);
    КонецЦикла;

    Возврат СписокСерверов;

КонецФункции

///////////////////////////////////////////////////
мПутьКФайлуНастроек = "appData.json";

Контроллер создания администрируемых серверов

Начнем с определения маршрутов к управлению серверами. Пусть шаблон доступа к управлению сущностями у нас имеет вид {контроллер}/{действие}/{идентификатор?} Это позволит нам осуществлять следующие HTTP-операции с агентами кластеров 1С:

  • /agents
  • /agents/create
  • /agents/edit/srv-1c-0001
  • /agents/delete/srv-1c-0001

За управление администрируемыми серверами будет отвечать контроллер agents.os. Добавим его в папку controllers.

Начнем с получения простого списка имеющихся серверов:

Функция Index() Экспорт
	
	ТаблицаАгентов = ЦентральныеСерверы.ПолучитьСписок();
	Возврат Представление(ТаблицаАгентов);

КонецФункции

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

Создадим это представление. В папку views/agents добавим файл Index.cshtml

<h1>Агенты администрируемых серверов</h1>

<table class="ui basic selectable table">
<thead>
    <tr>
        <th>Идентификатор</th>
        <th>Сетевое имя</th>
        <th>Порт</th>
        <th>Режим</th>
    </tr>
</thead>
<tbody>
    @foreach(var row in Model) {
        <tr>
            <td><a asp-action="edit" asp-route-id="@row.Идентификатор">@row.Идентификатор</a></td>
            <td>@row.СетевоеИмя</td>
            <td>@row.Порт</td>
            <td>@row.Режим</td>
        </tr>
    }
</tbody>
</table>

Жирным шрифтом выделено самое интересное – цикл, который перебирает строки ТаблицыЗначений и выводит их в HTML-разметку.

Синтаксис выражений шаблонизатора Razor мы разберем в последующих главах, а пока просто запомним, что выражения Razor начинаются с символа «собаки».

Если сейчас запустить приложение и перейти по адресу /agents – то мы увидим пустую таблицу. Добавим переход к разделу агентов в главное меню. В _mainLayout.cshtml заменим одну из заглушек на следующий код:

<div class="ui secondary vertical fluid menu">
       <a class="item active" asp-controller="agents" asp-action="index">Агенты серверов</a>
       <div class="ui hidden divider"></div>
       <a class="item">Информационные базы</a>
       <a class="item">Администраторы</a>
       <a class="item">Блокировки</a>
</div>

Я изменил строку, выделенную жирным шрифтом. В ней вместо традиционного URL гиперссылки использованы специальные атрибуты asp-controller и asp-index. Это вспомогательные теги, позволяющие оперировать компонентами MVC из файлов разметки. Они формируют корректный целевой URL, базируясь на карте маршрутов нашего приложения. В принципе, можно и жестко прописать URL «/agents», но это менее гибко и может сломаться, если мы в будущем захотим изменить схему маршрутизации.

Добавление/редактирование агента

Добавим в представлении views/agents/Index перед таблицей кнопку создания нового агента:

<div id="cmdbar" class="ui buttons">
    <a asp-action="add" class="ui primary button">Добавить</a>
</div>

В сам контроллер agents добавим экспортный метод Add

Функция Add() Экспорт

	Возврат Представление("Item");

КонецФункции

И, наконец, создадим само представление Item.cshtml в папке views/agents:

<h2 class="ui dividing header">Агент кластера</h2>

<form asp-action="add" class="ui form">
    
    <p class="field">
        <label for="Идентификатор">Идентификатор</label>
        <input name="Идентификатор"></input>
    </p>
    <p class="field">
        <label for="СетевоеИмя">Сетевое имя</label>
        <input name="СетевоеИмя"></input>
    </p>
    <p class="field">
        <label for="Порт">Порт</label>
        <input name="Порт"></input>
    </p>
    
    <button type="submit" class="ui primary button">Сохранить</button>
</form>

В данной форме используется уже знакомый нам атрибут “asp-action”, который задает адрес, на который форма перешлет данные при нажатии кнопки «Сохранить».

Данные формы будут пересланы методом POST. Теперь, если перезапустить приложение и зайти браузером на адрес /agents/add, то можно увидеть нашу форму. Проблема лишь в том, что метод add не умеет сохранять полученные данные. Исправим это:

Функция Add() Экспорт

	Если ЗапросHttp.Метод = "POST" Тогда
		ТЗ = ЦентральныеСерверы.ПолучитьСписок();
		Элемент = ТЗ.Добавить();
		ЗаполнитьДанные(Элемент);
		ЦентральныеСерверы.Записать(ТЗ);
		Возврат Перенаправление("/agents/index");
	КонецЕсли;
	
	Возврат Представление("Item");

КонецФункции

Процедура ЗаполнитьДанные(Знач Элемент)
	
	ДанныеФормы = ЗапросHttp.ДанныеФормы;
	Элемент.Идентификатор = ДанныеФормы["Идентификатор"];
	Элемент.СетевоеИмя = ДанныеФормы["СетевоеИмя"];
	Элемент.Порт = ДанныеФормы["Порт"];
	Элемент.Режим = "RAS";

КонецПроцедуры

Обратите внимание на коллекцию ДанныеФормы. Ключами в ней являются имена полей HTML. Каждый элемент <input> в нашей форме имеет атрибут «name». Именно эти имена становятся ключами коллекции ДанныеФормы, а значениями – введенные пользователем значения полей.

Полноценный CRUD

Create-Read-Update-Delete – так расшифровывается абракадабра в подзаголовке выше. Сейчас у нас есть первые 2 пункта, осталось добавить вторые два: удаление и редактирование. Для этого проведем небольшой рефакторинг нашей «Формы элемента» - представления Item.

<form asp-action="@ViewContext.RouteData.Values["action"]" asp-route-id="@Model?.Идентификатор" class="ui form">

Сначала заменим адрес, на который форма отправляет данные. В случае с добавлением у нас было только одно действие – «add». Теперь форма должна обрабатывать также и действие edit. Удобнее всего вытащить имя текущего действия из текущего контекста представления (Свойства ViewContext.RouteData внутри Razor) Это свойство связывает представление с текущим HTTP-вызовом. И мы можем сформировать разный HTML в зависимости от того, по какому адресу нас вызвали. Кроме того, в качестве параметра id маршрута добавим идентификатор текущей записи.

Далее, доработаем форму. Вставим в качестве значений полей обращение к Модели. Поскольку в случае с add мы не передавали модель, то свойство Model будет равно null. Поэтому в коде мы применим условный оператор ? для проверки на null.

    <p class="field">
        <label for="Идентификатор">Идентификатор</label>
        <input name="Идентификатор" value="@Model?.Идентификатор"/>
    </p>
    <p class="field">
        <label for="СетевоеИмя">Сетевое имя</label>
        <input name="СетевоеИмя" value="@Model?.СетевоеИмя"/>
    </p>
    <p class="field">
        <label for="Порт">Порт</label>
        <input name="Порт" value="@Model?.Порт"/>
    </p>

Забавные знаки вопроса в коде – это синтаксический сахар C#. В данном случае, код @Model?.Идентификатор  на языке 1С будет выглядеть примерно так: ?(Модель <> Неопределено, Модель.Идентификатор, “”)

Осталось добавить новое действие Edit в контроллер agents и немного доработать модель, ЦентральныеСерверы, сохраняющую данные.

Доработка модуля ЦентральныеСерверы:

 

Процедура Записать(Знач ТЗ) Экспорт

	Текст = Новый ЗаписьТекста(мПутьКФайлуНастроек);
	Запись = Новый ПарсерJSON;
	Текст.Записать(Запись.ЗаписатьJSON(ТЗ));
	Текст.Закрыть();
	мСодержимое = Неопределено;

КонецПроцедуры

///////////////////////////////////////////////////
мПутьКФайлуНастроек = "appData.json";

 

Добавленный метод-действие Edit в контроллере agents:

Функция Edit() Экспорт

	Идентификатор = ЗначенияМаршрута["id"];
	Если Идентификатор = Неопределено Тогда
		Возврат Перенаправление("/agents/index");
	КонецЕсли;

	ТЗ      = ЦентральныеСерверы.ПолучитьСписок();
	Элемент = ТЗ.Найти(Идентификатор, "Идентификатор");

	Если Элемент = Неопределено Тогда
		Возврат КодСостояния(404);
	КонецЕсли;

	Если ЗапросHttp.Метод = "POST" Тогда
		
		ЗаполнитьДанные(Элемент);
		ЦентральныеСерверы.Записать(ТЗ);
		
		Возврат Перенаправление("/agents/index");
	Иначе
		// Передаем в представление "модель" - Элемент
		Возврат Представление("Item", Элемент);
	КонецЕсли;
	
КонецФункции

Итого, получается, что мы теперь можем обрабатывать адреса:

  • /agents
  • /agents/add
  • /agents/edit/buh

и наполнять список агентов кластеров серверов 1С.

Подведение итогов и раздача слонов

В рамках данной статьи мы настроили рабочее окружение разработчика: установили менеджер пакетов chocolatey, систему контроля версий git, редактор Visual Studio Code.

Создали работающий прототип веб-приложения, управляющего кластерами серверов 1С. В этом веб-приложении реализована основная разметка интерфейса и операции управления агентами серверов администрирования по технологии RAS/RAC (https://its.1c.ru/db/v8311doc#bookmark:cs:TI000000189).

Мы освоили создание новых контроллеров, методов-действий и представлений, формируемых методами-действиями.

Не реализованной осталась команда /agents/delete/<id>, и это остается в качестве домашнего задания. Конечный результат по данной главе доступен на гитхаб: https://github.com/EvilBeaver/osp-articles.

Первый человек, приславший качественный работающий pull-request с операцией «delete» получит от меня 20 стартмани.

Акция не распространяется на гиков, знакомых со мной лично. Я знаю, что вы умеете это делать. :).

Спасибо всем, кто дочитал до конца. Продолжение следует…

209

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. palsergeich 12.02.18 13:31 Сейчас в теме
Продолжайте, интересно.
Думаю в течение месяца с головой погрузится в oscript, на горизонте маячат несколько задач....
Liris; dim9; user764938; Lyolik; +4 Ответить
2. nixel 524 12.02.18 14:26 Сейчас в теме
(1) погружайся, Паш, погружайся :) Там много интересного, как в веб-части, так и в более привычном девопсе
3. JohnyDeath 290 12.02.18 14:27 Сейчас в теме
Фундаментально!
В закладки и подписки!
4. Evil Beaver 5330 12.02.18 14:38 Сейчас в теме
Маленькое замечание: парсер инфостарта оборачивает гиперссылки в свой redirect.php. Поэтому код страницы _mainLayout.cshtml отображается искаженно.

<link rel="stylesheet" ref="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.13/semantic.min.css"/>


Вот правильный код линка (он же в исходниках гитхаба). Атрибут href пришлось переименовать, чтобы обмануть парсер :)
5. spacecraft 12.02.18 14:44 Сейчас в теме
Попытка скрестить asp.net core с onscript.
Смотрится не плохо.
А почему не взять в качестве frontend vue.js? А backend использовать onscript. И без прослойки asp.net. Вроде как более перспективное направление может получиться.
6. Evil Beaver 5330 12.02.18 14:52 Сейчас в теме
(5) Можно и взять. Почему сейчас нет - в статье написано.
7. spacecraft 12.02.18 15:07 Сейчас в теме
(6) я не про использование в качестве шаблонизатора. А как полноценный фреймворк.
На onscript попытаться сделать аналог nuxt.js. С серверным рендерингом.
10. Evil Beaver 5330 12.02.18 16:02 Сейчас в теме
(7) Можно, думаю. И серверсайд-рендер react тоже можно прикрутить, не вопрос. Там всего-лишь middleware добавить в цепочку обработки.
spacecraft; +1 Ответить
8. 🅵🅾️🆇 12.02.18 15:33 Сейчас в теме
В целом здорово, в закладки, в частном - стоит сравнить под нагрузкой с питоном, node.js, ну или на худой конец с php.
Есть смутное подозрение, что дальше единичных http сервисов не требующих высокой нагрузки - заходить не стоит.

ЗЫ: Да, Я знаю, что 1с код довольно странно компилируется в процессе, но как мне кажется, сравнивать стоит именно с интерпретируемыми языками, с байткодом точно не сравниться (да и в вебе мало бэкэнда на нем).
9. Evil Beaver 5330 12.02.18 16:00 Сейчас в теме
(8) Уже сравнивали. Скорость такая же как у ПХП. Питону тоже нет причин быть сильно быстрее. Нода применяет JIT-компиляцию в машинный код, поэтому будет наверняка побыстрее, но отдельно с нодой не сравнивали.

с байткодом точно не сравниться

Что вы понимаете под термином байткод? И у 1С, и у 1Скрипт, и у Питона, и у Java есть байткод. Вы про который байткод говорите?
24. 🅵🅾️🆇 13.02.18 15:37 Сейчас в теме
(9)
Уже сравнивали.

Если в закладочках осталась статья со сравнением быстродействия на различных задачах - буду очень благодарен.

Нода применяет JIT-компиляцию в машинный код

Слышал, что 1с делает также.

Что вы понимаете под термином байткод?

Ну в данном случае я имел ввиду машинный код, который исполняется напрямую, то во что компилируют теже плюсы. И естественно выходит очень быстро.

Питоша с JS - интерпретируются, Java исполняется на VM, у 1с, вроде как, препроцессор режет то что там наваяли в конфигураторе и отдает компилятору в реальном времени.
25. spacecraft 13.02.18 15:44 Сейчас в теме
(24)
Питоша с JS - интерпретируются

python интерпретирует не всегда. Как правило первый раз. И пытается этот код скомпилировать в си. Что при повторном использовании может быть быстрее java кода.
27. 🅵🅾️🆇 13.02.18 15:53 Сейчас в теме
(25) Таких тонкостей не знаю, но вроде как в питоне надо явно задавать участки, что подлежат такой компиляции, все остальное статически компилируемое.
41. bonv 110 13.02.18 19:05 Сейчас в теме
(25) Наиболее распространенная реализация CPython компилирует код в байт-код.
JIT-компилятор, про который видимо идет речь, используется, например, в реализации PyPy, но она имеет свои ограничения.
31. Evil Beaver 5330 13.02.18 16:55 Сейчас в теме
(24)
Если в закладочках осталась статья со сравнением быстродействия на различных задачах - буду очень благодарен.

Статьи нет, есть наш чат в gitter. Там обсуждалось.

Слышал, что 1с делает также.

Нет, не делает. Если я ошибаюсь - просьба дать пруфлинк.

Ну в данном случае я имел ввиду машинный код, который исполняется напрямую, то во что компилируют теже плюсы.

Машинный код <> Байткод. Принципиально разные вещи.

Питоша с JS - интерпретируются, Java исполняется на VM, у 1с, вроде как, препроцессор режет то что там наваяли в конфигураторе и отдает компилятору в реальном времени.

Вот это - тотальная абракадабра и незнание матчасти.
32. 🅵🅾️🆇 13.02.18 16:57 Сейчас в теме
(31)

Машинный код <> Байткод. Принципиально разные вещи.

Описочка, очевидно имел ввиду машинный.

Вот это - тотальная абракадабра и незнание матчасти.

Просвяти где не прав.
33. Evil Beaver 5330 13.02.18 17:12 Сейчас в теме
(32)
Питоша с JS - интерпретируются, Java исполняется на VM, у 1с, вроде как, препроцессор режет то что там наваяли в конфигураторе и отдает компилятору в реальном времени.


Начнем с того, что Питон и JS - это языки у которых несколько реализаций. Каждая реализация работает по-своему.
Наиболее популярная реализация Питона - это CPython. Я не очень хорошо ее знаю, в моей картине мира она компилируется в байт-код, который затем исполняется виртуальной машиной. Точно так же делает 1С, PHP, Ruby и 1Script.

JS имеет также несколько реализаций, современные из которых (скажем V8 от Google) сначала также компилируются в промежуточный код, а он, в свою очередь - превращается в машинный код, там где это возможно. Это называется JIT-компиляцией. По тому же принципу работает C# и Java. В результате, современные JS-программы работают довольно шустро. Но это заслуга реализации движка. Запустите этот же код на старых реализациях JS и никакой скорости не будет, хотя "язык" - один и тот же. Node.JS использует, насколько я знаю, движок V8, хотя, вроде как, туда можно поставить Chakra или еще что-то. Не в курсе на 100%.

Теперь насчет 1С. Что-то такое мелькало про JIT в 1С, но я так и не понял - было это в реале или мне приснилось.

Примененный термин "VM" для Java справедлив в равной степени для всех скриптовых языков, в т.ч. и для 1Script. Чистых "интерпретаторов", которые бы не использовали промежуточное представление в виде байт-кода, сейчас среди мейнстримных скриптовых движков нет, насколько мне известно.
38. 🅵🅾️🆇 13.02.18 17:31 Сейчас в теме
(33)
Начнем с того, что Питон и JS - это языки у которых несколько реализаций. Каждая реализация работает по-своему.
Наиболее популярная реализация Питона - это CPython. Я не очень хорошо ее знаю, в моей картине мира она компилируется в байт-код, который затем исполняется виртуальной машиной.


Начнем с того, что вот этот ваш CPython и есть ИНТЕРПРЕТАТОР. Он читает что вы там написали и прям в процессе транслирует в байткод и исполняет.
Собстно это и называется ИНТЕРПРЕТАЦИЕЙ. А уже КОМПИЛЯЦИЕЙ называют когда программулина сначало перегоняется целиком в машинный код, а затем уже исполняется.

Так что зря вы так грубо и с плеча дураком обзываетесь)))

Про 1с мне точно также приснилось, про что и написал.
Как это вижу Я: препроцессор режет наши писульки в соответсвии с дерективами, переводит в некое промежуточное состояние и отдает кусочки в процессе такому же сорту CPython'а, который, когда от него требуется, уже компилирует и исполняет.
39. Evil Beaver 5330 13.02.18 18:37 Сейчас в теме
(38) у меня несколько иная терминология. Интерпретатор сразу исполняет код, не создавая никакого кода для машины (обычной или виртуальной). Меня так учили и то же самое читал в книжках. В любом случае, это всего лишь вопрос терминологии. Я поясняю свою, чтобы меня правильно можно было понять.

Компилятор - это создатель другого представления исходного кода, которое затем исполняет машина (реальная или нет).

В такой терминологии Питон, 1С и 1Скрипт - это НЕ интерпретаторы
42. 🅵🅾️🆇 13.02.18 19:14 Сейчас в теме
(39) Придеться вас огорчить)

Может тут и правда есть различные мнения, но вообще, где бы я не встречал упоминания питонов-яваскриптов, всегда где то рядом есть слово "интерпретатор".
43. spacecraft 13.02.18 19:29 Сейчас в теме
(42) не смущает, что в приведенной статье сплошные противоречия?

Этак можно прийти к тому, что и С++ это интерпретатор компилируемого типа. Ведь программа выполняется "виртуальной машиной" (операционной системой).
Evil Beaver; +1 Ответить
49. Evil Beaver 5330 13.02.18 23:22 Сейчас в теме
(43) Ага, отличный пример бредовых ГОСТ-ов, прямо вспомнил лекции в институте, которые устарели за 10 лет до моего туда поступления.
44. spacecraft 13.02.18 20:48 Сейчас в теме
(42)
где бы я не встречал упоминания питонов-яваскриптов, всегда где то рядом есть слово "интерпретатор".

уникальность именно python в том, что он разрывает шаблон устоявшихся понятий чистых компилятор/интерпретатор.
Он одновременно может быть чистым интерпретатором. В прямом смысле этого слова. Прямо в консоле можно писать код построчно и он будет выполняться.
В тоже время позволяет и скомпилировать в байт-код, для более быстрого выполнения.
86. minimajack 50 16.03.18 12:44 Сейчас в теме
(44)
Он одновременно может быть чистым интерпретатором. В прямом смысле этого слова. Прямо в консоле можно писать код построчно и он будет выполняться

как и многие другие включая и javascript и java
48. Evil Beaver 5330 13.02.18 23:20 Сейчас в теме
(42) Я может чего не понял, но приведенная статья подтверждает мою терминологию, а не опровергает ее. Что конкретно в ней должно было меня огорчить?
40. spacecraft 13.02.18 18:53 Сейчас в теме
(38)
Начнем с того, что вот этот ваш CPython и есть ИНТЕРПРЕТАТОР. Он читает что вы там написали и прям в процессе транслирует в байткод и исполняет.
Собстно это и называется ИНТЕРПРЕТАЦИЕЙ. А уже КОМПИЛЯЦИЕЙ называют когда программулина сначало перегоняется целиком в машинный код, а затем уже исполняется.


Даже классический CPython, который не имеет встроенного JIT-компилятора, имеет оптимизатор, который сохраняет в байт-код (расширения .pyc). И уже повторно запускается именно байт-код.
13. bonv 110 12.02.18 22:07 Сейчас в теме
(8)
В целом здорово, в закладки, в частном - стоит сравнить под нагрузкой с питоном, node.js, ну или на худой конец с php.
Есть смутное подозрение, что дальше единичных http сервисов не требующих высокой нагрузки - заходить не стоит.

В сервисах с высокой нагрузкой, как правило сервера приложений (python, noda.js и т.д.) напрямую никто не выставляет. Поднимают несколько серверов приложений и проксируют их через nginx (или ему подобные). Таким образом можно повысить производительность и надежность.

Опять же время выполнения кода на питоне или на 1С принципиально не отличается. Основное время затрачивается на операции ввода-вывода. И вот здесь уже асинхронные сервера могут существенно вырваться вперед.
kuntashov; 🅵🅾️🆇; artbear; Evil Beaver; +4 Ответить
18. Evil Beaver 5330 13.02.18 08:33 Сейчас в теме
(13) еще бы 1С выпустила гуманный API для асинхронных операций...
neikist; bonv; artbear; +3 Ответить
19. artbear 1087 13.02.18 11:53 Сейчас в теме
(18)
гуманный API для асинхронных операций

В мемориз :)
26. 🅵🅾️🆇 13.02.18 15:48 Сейчас в теме
(13)
В сервисах с высокой нагрузкой, как правило сервера приложений (python, noda.js и т.д.) напрямую никто не выставляет. Поднимают несколько серверов приложений и проксируют их через nginx (или ему подобные).

Благодарю за ликбез. Но при неудачном выборе инструмента, все одно дорого по железу/потдержке выходит наверное?

И вот здесь уже асинхронные сервера могут существенно вырваться вперед.

С асинхронностью у 1с бяда, особенно на стороне клиента. Пока есть только для файловых потоков и обработчик ожидания.
Вчера потребывалось из формы списка попадать в форму элемента и выделять нужную строку табличной части, в итоге решилось подвешиванием таймера в 0,25 сек на процедуру ПриОткрытии() и уже по его истечению устанавливать фокус.
Ничего лучше подобного костыля не придумал, а решения в гугле для УФ в принципе нет.

Скрытый текст
50. bonv 110 14.02.18 02:12 Сейчас в теме
(26)
Благодарю за ликбез. Но при неудачном выборе инструмента, все одно дорого по железу/потдержке выходит наверное?

Железо - зависит от задачи. Возможно бэкенд на С/С++ будет лучшим решением.


Вчера потребывалось из формы списка попадать в форму элемента и выделять нужную строку табличной части, в итоге решилось подвешиванием таймера в 0,25 сек на процедуру ПриОткрытии() и уже по его истечению устанавливать фокус.
Ничего лучше подобного костыля не придумал, а решения в гугле для УФ в принципе нет.

Зачем это?

Можно же сразу в ПриСозданииНаСервере установить строку
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("НомерСтроки") Тогда
		НомерСтроки = Параметры["НомерСтроки"];
		Элементы.Оборудование.ТекущаяСтрока = Объект.Оборудование[НомерСтроки].ПолучитьИдентификатор();
	КонецЕсли;

КонецПроцедуры
Показать
53. 🅵🅾️🆇 14.02.18 10:19 Сейчас в теме
(50) При создании на сервере и при открытии (до того как форма отрисовалась у клиента) "ТекущаяСтрока" еще не установлена и находиться в значении "Неопределено". Установить значение то можно, но толку от этого будет 0 и все одно после открытия перезапишется единицей.
Вот такие вот неожиданные костыли))) Честное слово, Я не был пьян, когда ваял сей велосипед)))

55. bonv 110 14.02.18 11:47 Сейчас в теме
(53) Ну собственно я тоже попробовал прежде, чем писать (пробовал на 8.3.12)
56. 🅵🅾️🆇 14.02.18 14:23 Сейчас в теме
(55) Странные дела.
8.3.11, Вин сервер 2008, УФ, Тонкий клиент, Такси, Самописная конфигурация на базе БСП.

При создании & открытии формы ну никак не хотело, причем гуглинг дал таких же несчастных и решения для обычных форм.
Пришлось выдумывать такой велосипед.
11. Boris_1c 39 12.02.18 20:08 Сейчас в теме
Круто-круто. Следим за проектом затаив дыхание!
12. bonv 110 12.02.18 21:37 Сейчас в теме
(0) Сервер синхронный и/или асинхронный?
16. Evil Beaver 5330 13.02.18 08:28 Сейчас в теме
(12) сервер асинхронный, но код конкретного контроллера выполняется в одном потоке на http-запрос. Асинхронный io с НачатьЧтение в стиле 1С можно сделать хоть сейчас, но у меня рука не поднимается копировать этот сатанизм.
14. comol 3689 12.02.18 22:53 Сейчас в теме
(0)
Soloist; ALagutin; pfilyk; klimsrv; TreeDogNight; tsukanov; Stylo; max_st; +8 Ответить
17. Evil Beaver 5330 13.02.18 08:31 Сейчас в теме
(14) я ждал этой картинки! Редко встретишь ее на инфостарте. Считаю за комплимент )
Irwin; Labotamy; yuraer; +3 Ответить
15. CSiER 20 13.02.18 03:02 Сейчас в теме
Спасибо, статья навеяла воспоминания по студенческим каникулам - php, smarty, борьба с ТТУК :)
20. tsukanov 65 13.02.18 11:57 Сейчас в теме
Плюсую за творческую упоротость, но идея не очень непонятна )
В целом думаю эта работа положительно отразится на сообществе одинэсников, т.к. в очередной раз поднимает планку.
Народу хочешь не хочешь придется шевелиться, наблюдая как его знания обесцениваются.

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

Любая технология призвана решать четкую конкретную задачу.
Какую задачу решает эта технология? И если решает, то в чем преимущество перед другими технологиями?

ps Не исключаю что уже объяснялось. Возможно пропустил
22. Evil Beaver 5330 13.02.18 14:07 Сейчас в теме
(20) эта технология решает целый спектр задач. Перечислять поленюсь. Например, одна из них: Я (персонально я) смогу писать веб-приложения, получая удовольствие от процесса. Сейчас ни на одной из тех экосистем, которые я пробовал, этого не происходит. Если за мной это смогут делать другие 1С-ники - то задача уже будет выполнена выше плана.

И это только одна из целей.
dumsik; sumaueev; Peleng; Shrayky2; JohnyDeath; +5 Ответить
23. tsukanov 65 13.02.18 14:25 Сейчас в теме
(22) А ну если джаст фо фан, то почему бы и да )
30. Evil Beaver 5330 13.02.18 16:51 Сейчас в теме
(23) just for fun - наиболее доходчивое объяснение для скептиков вроде тебя )

Прагматические цели тоже есть.
35. tsukanov 65 13.02.18 17:19 Сейчас в теме
(30) Ну если берешься защищать цели, то нужно их озвучивать ) Или тупо сразу говорить, что делаешь джаст фо фан, чтоб не парили мозг.
Объяснять полезность чего-то сложно, да. Иногда даже самому себе )

ps Не обращай внимание на мои придирки. Дотошность мое проклятье.
36. Evil Beaver 5330 13.02.18 17:21 Сейчас в теме
(35)
Или тупо сразу говорить, что делаешь джаст фо фан, чтоб не парили мозг.

ты меня раскусил ))
37. tsukanov 65 13.02.18 17:30 Сейчас в теме
(36) будто кто-то иначе делает )))
28. comol 3689 13.02.18 16:35 Сейчас в теме
(22)
Я (персонально я) смогу писать веб-приложения


Андрей ты нас обманываешь :), если осилил свой хм... интерпретатор? Написать, то уж web приложение явно проблем не вызовет :)
29. Evil Beaver 5330 13.02.18 16:42 Сейчас в теме
(28) жабоскрипт ацтой. Не люблю на нем писать
87. pfilyk 25.03.18 14:16 Сейчас в теме
(29) согласен, но есть же еще TypeScript как пример
21. infosoft-v 283 13.02.18 12:24 Сейчас в теме
Огромное уважение к автору этого проекта и ко всей "команде oScript". Коллеги, вы всегда меня вдохновляете. Спасибо вам.

После того, как язык bsl укоренился на десктопе, на сервере, в мобилках и в вебе, может быть попробовать исполнить его на embedet платформах?

Как пример, есть такой проект Espruino (JavaScript на микроконтроллерах)

Микроконтроллер с кодом на bsl отправляет телеметрию на сервер который написан на OScript откуда 1С Предприятие забирает данные уже не звучит как фантастика.
Evil Beaver; artbear; +2 Ответить
34. Evil Beaver 5330 13.02.18 17:15 Сейчас в теме
(21) Сюда Филиппов сейчас тоже вставит картинку с троллейбусом :)
45. bulpi 135 13.02.18 21:47 Сейчас в теме
Автор, не знаю, куда это писать. Начиная с версии 1.0.18 1script не работает на win32 . Это так и должно быть ?
46. nixel 524 13.02.18 22:24 Сейчас в теме
(45) на какой из win32?
для работы 1.0.18 и старше требуется .Net Framework >= 4.5.2. Как следствие в трубу улетела Windows XP
47. baton_pk 376 13.02.18 22:24 Сейчас в теме
(45) https://github.com/EvilBeaver/OneScript/issues
сюда писать. Если там молчим, не стесняться напоминать.
Ещё сюда: https://gitter.im/EvilBeaver/OneScript

отказались от поддержки винХР - это было. а от вин32 не отказывались.
Evil Beaver; +1 Ответить
51. Nenaviju1C 14.02.18 08:35 Сейчас в теме
Что то навеяло asp.net ...
На чем реализован механизм?
57. nixel 524 14.02.18 16:00 Сейчас в теме
(51) дык там низом и есть ASP.Net
52. Nenaviju1C 14.02.18 08:39 Сейчас в теме
Вопрос снят, выше увидел коммент по .net
54. Evil Beaver 5330 14.02.18 11:45 Сейчас в теме
Между тем, призовой фонд в 20 sm до сих пор не разыгран
58. VRStalker 14.02.18 17:00 Сейчас в теме
Ошибка (закладка?) в статье, приводящая к ошибке...

Создадим файл ЦентральныеСерверы.os в папке src/model/classes.


Правильно в src/model/modules
Evil Beaver; yuraer; +2 Ответить
59. Evil Beaver 5330 15.02.18 10:52 Сейчас в теме
60. stilet 50 15.02.18 16:47 Сейчас в теме
А как отлаживать код? Здесь все понимают, что 50% работы с кодом (более менее сложным) - это отладка.
61. Evil Beaver 5330 15.02.18 16:58 Сейчас в теме
(60) Отладчик пока не включен в веб-движок. Стандартный 1script отлаживается, здесь на данный момент еще не реализовано.
62. Evil Beaver 5330 15.02.18 17:17 Сейчас в теме
Вознаграждение в пользу yuraer
63. yuraer 38 15.02.18 23:46 Сейчас в теме +20 $m
(62) Моё решение.
В файле src/views/agents/Index.cshtml добавляем кнопку в таблицу
<tr>
            <td><a asp-action="edit" asp-route-id="@row.Идентификатор">@row.Идентификатор</a></td>
            <td>@row.СетевоеИмя</td>
            <td>@row.Порт</td>
            <td>@row.Режим</td>
            <td><a asp-action="delete" asp-route-id="@row.Идентификатор"><i class="remove icon"></i></a></td>
        </tr> 


где указываем вызов функции "delete" и значение маршрута "@row.Идентификатор"

и название колонки
 <tr>
        <th>Идентификатор</th>
        <th>Сетевое имя</th>
        <th>Порт</th>
        <th>Режим</th>
        <th>Удалить</th>
    </tr>



и добавляем функцию удаления в src/controllers/agents.os

Функция Delete() Экспорт		

	Идентификатор = ЗначенияМаршрута["id"];
	Если Идентификатор = Неопределено Тогда
		Возврат Перенаправление("/agents/index");
	КонецЕсли;

	ТЗ      = ЦентральныеСерверы.ПолучитьСписок();
	Элемент = ТЗ.Найти(Идентификатор, "Идентификатор");

	Если Элемент = Неопределено Тогда
		Возврат КодСостояния(404);
	КонецЕсли;

	ТЗ.Удалить(Элемент);	
	ЦентральныеСерверы.Записать(ТЗ);
	
	Возврат Перенаправление("/agents/index");

КонецФункции
Показать
Liris; artbear; JohnyDeath; +3 Ответить
64. Hokum 18.02.18 14:05 Сейчас в теме
Git не захотел коммитить первоначальный образ, оказалось что его надо как минимум настроить.
открываем git-bash , добавляем пару строчек
git config --global user.name "Мое имя"
git config --global user.email мое.мыло@gmail.com


Запилил функцию удаления, получилось почти так же как в решении выше.
Потом подумал, что одно неосторожное движение и мы удалили запись.
Сделал еще формочку с подтверждением.


С интересом жду продолжения.
Прикрепленные файлы:
bulpi; artbear; Evil Beaver; JohnyDeath; baton_pk; +5 Ответить
65. Evil Beaver 5330 20.02.18 11:03 Сейчас в теме
(64) Не затруднит ли вас отправить данные доработки пулреквестом вот сюда: https://github.com/EvilBeaver/odminus ?

Здесь будет разрабатываться конечное приложение.
66. Hokum 20.02.18 14:44 Сейчас в теме
(65) Я пока не знаю как это делается. В ближайшее время разберусь и отправлю.
69. dumsik 8 24.02.18 13:43 Сейчас в теме
Андрей, возможность запуска веб-движка в виде службы windows в будущем будет предусмотрена?
67. Rashid80 23 22.02.18 09:51 Сейчас в теме
Отличное пособие, осталось понять - для кого оно?
Типичный 1С-ник очень далек от Web и MVC-концепции (которая к слову уже не так актуальна). Т.е. да, он будет писать русские комманды, но по факту это просто обертка над ASP.NET MVC.
Те кто хоть немного знакомы с веб-разработкой, для чего им писать на этой обертке? Проще взять Питон или Го и ОЧЕНЬ быстро получить бэкенд. Без всяких Model View Controller. Роутинг там реализован без всяких созданий подпапок и конкретных имен файлов с конкретными методами - т.е. гибко
tsukanov; pfilyk; +2 Ответить
68. JohnyDeath 290 22.02.18 13:17 Сейчас в теме
(67) по-моему всё 1С строится на MVC. Нет?

Т.е. да, он будет писать русские комманды, но по факту это просто обертка над ASP.NET MVC.

Так и сама 1С - это просто обертка над С++

Я - один из тех "для кого это". И я также активно использую oscript движок как язык для сценариев больших и не очень.
Мне в свое время надоело каждый раз при написании какой-то консольной утилиты или плеваться на cmd или вспоминать как оно там в PowerShell сделано. А здесь - знакомый до боли язык и обороты, который плюс ко всему легко переносится из платформы в скрипт.
Irwin; pvlunegov; Evil Beaver; +3 Ответить
71. Evil Beaver 5330 24.02.18 21:01 Сейчас в теме
(67) Евгений ниже ответил, я вряд-ли смогу лучше. Да, это обертка над Х. И 1Script это обертка над Y. Да, можно взять Питон, Павершел, VBScript, Батники. Но зачем?
75. Rashid80 23 26.02.18 10:34 Сейчас в теме
(71)
1)Чтоб не переключаться постоянно с русского на английский и обратно
2)Обертка не дает всего что дает исходный ASP.NET MVC. Т.е. придется ждать пока в обертку добавят еще одну обвязку или же дергать .net классы напрямую. Но зачем тогда вообще обертка?
76. Evil Beaver 5330 26.02.18 10:39 Сейчас в теме
(75) Затем же, зачем и весь 1script вообще. Для удобства. Как уже писал выше - в первую очередь меня лично, а вообще - для любого 1С-ника.
70. dumsik 8 24.02.18 13:45 Сейчас в теме
Возможность запуска веб-движка в виде службы windows в будущем будет предусмотрена?
72. Evil Beaver 5330 24.02.18 21:03 Сейчас в теме
(70) Нет. А зачем это нужно? Внутри веб-сервера это работает иначе. И вообще, предполагается контейнеризация. Для чего нужна именно служба?
73. dumsik 8 25.02.18 12:50 Сейчас в теме
(72) тогда наверное я не совсем до конца понял как все будет работать. Я думал, что web-движок oscript это отдельный web сервер запускаемый через OneScript.WebHost.exe и тогда логично, что OneScript.WebHost.exe должен уметь стартовать как служба потому-что он должен стартовать при старте системы и служба подходит для этого идеально. Получается я не прав и теперь предполагаю, что web-движок oscript будет работать под IIS. Можете подробнее рассказать как будет разворачиваться web-движок oscript в продуктиве, вот хотя бы на примере "odminus".
74. Evil Beaver 5330 26.02.18 09:12 Сейчас в теме
(73) я предпочитаю разворачивать в docker. А так - гуглить на тему aspnet core + iis
77. dumsik 8 26.02.18 13:12 Сейчас в теме
(74) и в продуктиве тоже docker?
78. Evil Beaver 5330 26.02.18 14:10 Сейчас в теме
(77) Есть ряд устойчивых отраслевых мифов:

* Java тормозит
* Плазма падает
* На 1С нельзя сделать {enter your text}
* Docker не готов к продуктиву
* Венде капец

Все примерно одного уровня достоверности.
pvlunegov; bulpi; Berckk; +3 Ответить
79. dumsik 8 26.02.18 14:59 Сейчас в теме
(78) Спасибо, пошел смотреть docker. За oscript спасибо отдельное, разработчики 1с очень быстро привыкают к автоматизации своей деятельности с его помощью. Oscript-web тоже сразу всем понравился из-за легкого старта. В общем очень нужное дело делаете.
nixel; Evil Beaver; JohnyDeath; +3 Ответить
80. Evil Beaver 5330 26.02.18 16:07 Сейчас в теме
(79) И вам спасибо за отзыв!
81. bulpi 135 10.03.18 19:29 Сейчас в теме
Git не захотел коммитить первоначальный образ, оказалось что его надо как минимум настроить.
открываем git-bash , добавляем пару строчек
git config --global user.name "Мое имя"
git config --global user.email мое.мыло@gmail.com


Увы, даже после этих действий у меня движок не запустился.
D:\MyProg\1script\ServersConsole\src>d:\MyProg\1script\osweb\OneScript.WebHost.exe

Необработанное исключение: System.TypeInitializationException: Инициализатор типа "System.Diagnostics.DiagnosticSourceEventSource" выдал исключение. ---> System.MissingMethodException: Метод не найден:
"Void System.Diagnostics.Tracing.EventSource..ctor(System.Diagnostics.Tracing.EventSourceSettings)".
в System.Diagnostics.DiagnosticSourceEventSource..ctor()
в System.Diagnostics.DiagnosticSourceEventSource..cctor()
--- Конец трассировки внутреннего стека исключений ---
в System.Diagnostics.DiagnosticListener..ctor(String name)
в Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices()
в Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
в OneScript.WebHost.Program.Main(String[] args)
82. Evil Beaver 5330 11.03.18 09:18 Сейчас в теме
(81) это какие-то системные ругательства. .NET Framework точно хороший стоит? И приложение откуда брали - скачивали или из исходников собирали?
83. bulpi 135 11.03.18 12:48 Сейчас в теме
(82) Все делал по инструкции.
choco install –y dotnet4.6.1
Приложение и движок скачивал в архивах и распаковывал.
Возможно, дело в системе windows7. Вы ведь не под ней делали ?
84. Evil Beaver 5330 11.03.18 22:52 Сейчас в теме
(83) не под ней, но вряд ли причина в этом. Скорее всего, не подхватился нужный фреймворк или он как-то криво установился. Это системная ошибка, не относящаяся по большому счету к 1Script.

Бинарники 1script сами собирали, или скачанные?
85. bulpi 135 12.03.18 10:06 Сейчас в теме
(84)
Все скачанное. Да ладно, не заморачивайтесь. Либо эта ошибка проявится у многих, либо , значит, карма у меня такая.
88. ilyav 25.05.18 15:03 Сейчас в теме
(81) Такая же ошибка на windows server 2012 r2
89. Evil Beaver 5330 25.05.18 16:43 Сейчас в теме
(88) Вы движок из исходников собираете или с гитхаба берете готовый?
90. ilyav 26.05.18 01:02 Сейчас в теме
(89) Разобрался и дам всем совет на будущее, на windows server по умолчанию стоят две версии net framework 3.5 и 4.5 , удалил версию 3.5 и все запустилось. Видимо по умолчанию скрипт запускается под 3.5 почему то.
baton_pk; +1 Ответить
91. markgenuine 23.10.18 19:18 Сейчас в теме
А почему не использовать язык Golang с шаблонами, там все проще и быстрее.
Тем более Docker написан на нем.
92. Evil Beaver 5330 24.10.18 14:55 Сейчас в теме
(91) конечно можно и нужно всем использовать только тот язык, который вы считаете нужным.

Пардон за наброс, просто я регулярно слышу этот вопрос и много раз на него отвечал в Интернетах и лично.
Irwin; JohnyDeath; +2 Ответить
Оставьте свое сообщение