Привет, меня зовут Андрей, я тимлид в Петрович-Тех. Хочу сегодня поговорить с вами об 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, помните про людей – в случае чего, сообщество поможет. А там, глядишь, новые пользователи уже и к вам начнут обращаться за советом.
Так что продолжаем строить, вместе!
EvilBeaver
Как автор движка, благодарю за статью, очень приятно читать, спасибо, что пользуетесь!