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