OneScript: как начать работать, как тестировать, как использовать консольные приложения

от автора

Привет, меня зовут Андрей, я тимлид в Петрович-Тех. Хочу сегодня поговорить с вами об 1С-разработке в общем и OneScript в частности. 

На сегодняшний день скриптовый язык OneScript – уже практически стандарт для 1С-разработчиков. При этом несмотря на распространённость и широту применения, я не могу сказать, что там всё очевидно. Я сам с опытом 1С-разработки в 10 лет всё ещё продолжаю узнавать нетривиальные нюансы работы с OneScript на уровне базовых сущностей; например, из недавнего – как в OneScript делается autocomplete. 

Входной порог в OneScript – есть.

В статье поделюсь своим опытом освоения и работы с OneScript. Коротко расскажу о языке в целом и его основных библиотеках, как начать работать, как тестировать. Покажу примеры скриптов. Расскажу про консольные приложения и дополнительные возможности движка.

Надеюсь, статья будет полезна для разработчиков и тимлидов в 1С-командах, а также специалистам из поддержки, кому по работе случается сталкиваться со скриптами на 1С.


Для начала давайте сверимся по основам. OneScript – это движок, который позволяет писать скрипты для 1С; используется для автоматизации работы с базами данных, хранилищами, кластерами серверов, файловой системой и многим другим.

Помимо непосредственно движка, в OneScript есть библиотеки, которые существенно расширяют его функциональность. На текущий момент существует более 140 различных библиотек для самых разнообразных задач. 

Основные библиотеки, которыми мы пользуемся в Петрович-Тех:

  • gitsync: синхронизация 1С-хранилища с Git-репозиторием; 

  • vanessa-runner: автоматизация всех основных операций взаимодействия с платформой;

  • vanessa-automation: проведение сценарных тестов;

  • precommit1c: распределение внешних отчетов и обработок по Git-репозиторию.

Начало работы c OneScript 

Перед началом работы с OneScript стоит ознакомиться с документацией на сайте проекта и обзором имеющихся библиотек.

Cамый первый шаг – скачиваем дистрибутив, устанавливаем. Далее необходимо подгрузить дополнительные пакеты библиотек, которые мы будем использовать. Для этого можно использовать консольную команду opm install <имя пакета>. Если для работы пакета нужны какие-либо зависимости, они будут установлены автоматически.

Ознакомиться с актуальным списком пакетов можно в официальном репозитории проекта.

Как настроить контекстную подсказку

Организационное: в статьи будем предполагать, что разработка скриптов ведётся с помощью Visual Studio Code. 

Включим контекстную подсказку – небольшая настройка поможет заметно сократить время на поиск документации и разбор исходников пакетов.

Для настройки контекстной подсказки нам необходимо установить плагин Language 1C (BSL), который дополнительно добавит поддержку языка 1С в Visual Studio Code. 

Далее устанавливаем пакет oscript-config – через консольную команду opm install oscript‑config. После этого настройку контекстной подсказки можно считать завершенной. 

Для работы контекстной подсказки для классов OneScript имя переменной должно совпадать с именем класса.

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

Как тестировать скрипты

Здесь нам поможет расширение для Visual Studio Code – OneScript Debug. Скачиваем его, открываем папку с проектом, переходим в раздел «Запуск и отладка», выполняем команду «создайте файл launch.json».

Это приведёт к появлению JSON-файла с параметрами тестирования. В нём можно указать аргументы, которые будут подаваться на вход.

Запуск тестирования с данными аргументами будет соответствовать запуску скрипта:

К этому моменту у нас уже есть контекстная подсказка – дополнительно поможет нам с настройкой.

После того, как мы создали данный конфигурационный файл, просто ставим точки останова в нужных местах и запускаем отладку.

Тут процесс мало чем отличается от того, что примерно каждый 1С-разработчик делает в конфигураторе.

Как написать простой скрипт

В качестве примера разберём скрипт, который переподключает базу к хранилищу.

#Использовать v8runner #Использовать logos  УправлениеКонфигуратором = Новый УправлениеКонфигуратором(); УправлениеКонфигуратором.УстановитьКонтекст("/FC:\test_base\", "", ""); УправлениеКонфигуратором.ИспользоватьВерсиюПлатформы("8.3.19");  Логирование = Логирование.ПолучитьЛог("ReleaseRepoUpdate");  Логирование.Информация("Отключение базы от хранилища"); УправлениеКонфигуратором.ОтключитьсяОтХранилища();  Логирование.Информация("Подключиться к релизному хранилищу"); ЕстьФлагПодключенияИзФайла = АргументыКоманднойСтроки.Количество() > 0                                        И АргументыКоманднойСтроки[0] = "-f";  Если ЕстьФлагПодключенияИзФайла Тогда   СтрокаПодключенияКХранилищу = "\\test_server\test_repo"; Иначе   СтрокаПодключенияКХранилищу = "tcp:\\test_server\test_repo"; КонецЕсли;  УправлениеКонфигуратором.ПодключитьсяКХранилищу(СтрокаПодключенияКХранилищу, Логин, Пароль, Истина);  Логирование.Информация("Обработка завершена");

Первым делом прописываем подключение необходимых внешних библиотек.

#Использовать v8runner #Использовать logos

Далее создаём объект УправлениеКонфигуратором – прописываем, с какой базой будем взаимодействовать, какую версию платформы использовать. После этого одной командой отключаемся от хранилища.

УправлениеКонфигуратором = Новый УправлениеКонфигуратором(); УправлениеКонфигуратором.УстановитьКонтекст("/FC:\test_base\", "", ""); УправлениеКонфигуратором.ИспользоватьВерсиюПлатформы("8.3.19");  Логирование = Логирование.ПолучитьЛог("ReleaseRepoUpdate");  Логирование.Информация("Отключение базы от хранилища"); УправлениеКонфигуратором.ОтключитьсяОтХранилища();

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

Логирование.Информация("Подключиться к релизному хранилищу"); ЕстьФлагПодключенияИзФайла = АргументыКоманднойСтроки.Количество() > 0                                        И АргументыКоманднойСтроки[0] = "-f";  Если ЕстьФлагПодключенияИзФайла Тогда   СтрокаПодключенияКХранилищу = "\\test_server\test_repo"; Иначе   СтрокаПодключенияКХранилищу = "tcp:\\test_server\test_repo"; КонецЕсли;

Последней командой мы заново подключаемся уже к хранилищу.

УправлениеКонфигуратором.ПодключитьсяКХранилищу(СтрокаПодключенияКХранилищу, Логин, Пароль, Истина);  Логирование.Информация("Обработка завершена");

В среднем написание такого скрипта займет где-то минут двадцать, но результат может существенно упростить жизнь, особенно если речь идёт о скрипте для рутинной операции, которая выполняется часто.

Консольные приложения в OneScript

Некоторые пакеты содержат в себе библиотеку и консольное приложение на основе библиотеки. Это позволяет через консольные команды выполнять различные операции, создавать скрипты.

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

v8runner loadrepo --ibconnection /S test_server\\test_base --db-user test --storage-name \\test_server\test_repo --storage-user test_user

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

У всех таких консольных приложений есть возможность вывода подсказки с помощью команды help.

Удобно, чтобы не закапываться в документацию за быстрыми подсказками, смотреть информацию по командам и параметрам прямо тут же в консоли.

Упрощение работы с OneScript: конфигурационный файл в качестве параметра

Удобная возможность: на вход консольный команде вместо длинной строки с параметрами можно передать один конфигурационный файл, в котором будут все те же самые параметры указаны в более читабельном виде.

{     "default": {           "--ibconnection": "/S test_server\\test_base",           "--db-user": "test",           "--db-pwd": "",           "--ordinaryapp": "1",           "--storage-name": "\\test_server\test_release_repo",           "--storage-user": "test_user",           "--storage-pwd": "",           "--uccode": "12345",           "--v8version": "8.3.19"     },     "session": {           "--ras": "test_server",           "--try": "1",           "--db": "test_base"     } }

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

v8runner loadrepo --settings ./test_settings.json

Сравним с примером вызова консольного приложения выше – стало компактнее.

Таким образом, получаем возможность собирать более сложные скрипты по принципу конструктора.

Пример:

@REM Отключаем сеансы и устанавливаем блокировку на подключение новых пользователей call vrunner session kill --settings ./test_settings  @REM Обновляем конфигурацию из хранилища call vrunner loadrepo --settings ./test_settings  @REM Обновляем базу данных call vrunner updatedb --settings ./test_settings  @REM Отключаем блокировку сеансов call vrunner session unlock --settings ./test_settings

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

Как OneScript используется в Петрович-Тех

(1) Подготовка предрелизного стенда для тестирования

В TeamCity у нас настроен pipeline по подготовке предрелизного стенда для проведения тестирования. Всего выполняется 24 шага, в большинстве из которых задействованы OneScript-скрипты; в частности, пакет vanessa-runner.

(2) Синхронизация Feature-хранилищ 1С с репозиторием 

Ещё один популярный у нас пакет – gitsync – синхронизация 1С-хранилища с Git-репозиторием. 

Этот скрипт используется для пакетной синхронизации нескольких хранилищ 1С.

chcp 65001 gitsync all --timer=60 C:\config.json >> C:\gitsync.log 2>&1

Конфигурационный файл в данном случае может выглядеть так:

{     "globals":{           "storage-user": "User",           "storage-pwd": "secret",           "git-path": "git",           "temp-dir": "",           "v8version": "8.3.19",           "plugins": {                 "enable": [                       "increment",                       "limit",                       "check-authors",                       "unpackform",                       "check-comments",                       "smart-tags",                       "sync-remote"                       ]                 }      },     "repositories": {           "name": "master",           "path": "tcp:\\\\test_server\\test_repo",           "dir": "C:\\test_project\\src",           "plugins-config": {                 "git-url": "repoURL",                 "rename-module": true,                 "error-comment": true,                 "author-presentation": true,                 "push-n-commits": true,                 "push-tags": true,                 "push": true,                 "pull": true           }     }  }

(3) Подготовка документации для HTTP-сервисов

Для HTTP-сервисов выполняется автоматическая генерация документации в формате Open API.

chcp 65001 swagger generate --src-path ./src --out ./API --format yaml

Что ещё умеет OneScript

С помощью OneScript можно создавать веб-приложения. Встроенный для этого в OneScript движок я не могу назвать очень уж удобным, так что не стал бы рекомендовать делать с его помощью какие-то сложные веб-приложения; но для простых – вполне подойдёт. Кроме того, есть OneScript Web – небольшая обёртка в виде отдельного проекта, добавляет удобства при работе с веб-приложениями.

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

Есть несколько пакетов, которые позволяют реализовать функциональность декораторов, внедрения зависимостей, рефлекторов

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

Важное преимущество OneScript – люди

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

Помешать может порог входа. Хорошая новость тут в том, что на практике этот порог оказывается не таким уж высоким – надеюсь, примеры выше это иллюстрируют. 

Но даже если будут попадаться нетривиальные ситуации, краевые случаи в работе с OneScript – на помощь приходит ещё одно важное преимущество. Помогут – люди. У OneScript довольно развитое сообщество; можно писать вопросы разработчикам, советоваться. По моему опыту, люди тут активно помогают, и это здорово. 

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

Так что продолжаем строить, вместе!  


ссылка на оригинал статьи https://habr.com/ru/articles/750202/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *