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

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

Комментарии (1)


  1. EvilBeaver
    27.07.2023 13:52
    +4

    Как автор движка, благодарю за статью, очень приятно читать, спасибо, что пользуетесь!