Обзор имеющихся библиотек OneScript

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

Введение

Для начала разберемся с терминами.
Тем, кто не знает, что такое OneScript, стоит познакомится с первой вводной статьей от самого автора Как решать повседневные задачи с помощью OneScript и с сайтом проекта OneScript. На Инфостарте недавно появилось несколько хороших статей на тему "быстрого старта".

Как только скриптописатель выходит за рамки Сообщить("Привет, мир!")  и начинает решать прикладные задачи, у него появляется желание найти какие-то готовые куски кода или целиком разработанную функциональность. Большинство полезных скриптов упаковывается в так называемые пакеты, упрощающие установку этих скриптов на локальную машину и их последующее использование.

Все пакеты делятся на два типа:

  1. Библиотеки, подключаемые в скрипты через директиву #Использовать и добавляющие разные полезные классы и модули
  2. и Приложения, которые помимо реализованной на OneScript логики имеют специальные обертки запуска из командной строки (cmd/sh). Часть приложений помимо запуска из командной строки позволяют себя подключать через #Использовать (т.е. как библиотеки), но это скорее бонус и желание разработчика приложения, чем возможность, на которую всегда можно надеяться.

Все более-менее работающие и известные пакеты собраны в двух местах:

  1. Организация oscript-library на github.com — https://github.com/oscript-library — содержит оригиналы или форки репозиториев, в которых ведется разработка пакетов. Там лежит весь исходный код, чаще всего там же находится и баг-трекер.
  2. Собранные пакеты выложены на специальном хабе пакетов http://hub.oscript.io — там можно посмотреть список пакетов, их описание и доступные версии, и даже можно скачать руками, если по каким-то причинам не работает пакетный менеджер.

Менеджер пакетов OneScript — opm

Перед обзором имеющихся пакетов я хочу немного рассказать о самом главном пакете-приложении в экосистеме OneScript — его пакетом менеджере. opm (onescript package manager) призван упростить установку, обновление и публикацию пакетов из/в хаб пакетов. Данный пакет входит в "стандартную поставку" движка OneScript и готов к работе с момента установки самого движка. С его помощью за одну команду можно установить любой доступный пакет.

Например, библиотека-помощник работы с Яндекс.Диском ставится с помощью команды opm install yadisk. Обновить все установленные пакеты разом можно через команду opm update —all, а opm install —all разом установит все доступные в хабе пакеты. Практически каждое приложение имеет встроенную справку по командам. Выполнив opm help мы получим информацию о всех имеющихся командах, а, например, opm help install выдаст справку конкретно по команде установки пакетов.

Пакетный менеджер имеет свой файл настроек, где можно указать, например, параметры подключения через прокси. Из особенностей работы отмечу лишь довольно очевидное ограничение прав. OneScript по умолчанию ставится в каталог C:/Program Files (x86)/OneScript (или в /usr/share/onescript на linux) и без прав администратора ни один пакет не обновится. Решение простое — либо выдаем себе права на каталог установки OneScript, либо запускаем командную строку от имени администратора/суперпользователя. Конечно же, всегда можно установить OneScript в другой каталог, либо воспользоваться разрабатывающимся менеджером версий OneScript — ovm.

Библиотеки

Большая часть функциональности заложена в библиотеках. Здесь я перечислю и кратко опишу все библиотеки, доступные в хабе пакетов. Начну с так называемого "набора стандартных библиотек", поставляемого с OneScript, продолжу всеми остальными библиотеками в алфавитном порядке. После названия библиотеки будет идти ссылка на основной репозиторий, в котором ведется разработка. Иногда этот репозиторий будет вести на личный репозиторий автора библиотеки, однако, все перечисленные здесь библиотеки собраны в организации oscript-library на GitHub.com.

Поставляемые библиотеки

1commands — https://github.com/oscript-library/1commands

Библиотека для запуска различных приложений из OneScript.

Думаю, многие знают про 1сный метод ЗапуститьПриложение() — с его помощью можно запустить любое приложение (и даже открыть файл в ассоциированном приложении). Однако у него есть ряд недостатков:

  • Тяжело анализировать консольный вывод такого приложения
  • Не всегда удобно склеивать строку для запуска
  • Нет управления допустимыми кодами возврата
  • Приходится изобретать велосипед для запуска более сложных команд или последовательности команд под win/linux

Данная библиотека добавляет два класса для запуска приложений — Команда (если команда одна) и КомандныйФайл (если команд несколько). Пример запуска Команды из README проекта:

Команда = Новый Команда;

Команда.УстановитьКоманду("oscript");
Команда.ДобавитьПараметр("-version");

// или сразу Команда.УстановитьСтрокуЗапуска("oscript -version");

КодВозврата = Команда.Исполнить();
Сообщить(КодВозврата);

Сообщить(Команда.ПолучитьВывод());

asserts — https://github.com/oscript-library/asserts

Реализация функциональности "утверждений" и "ожиданий" — специальных функций, кидающих исключение, если переданные в них значения не проходят некую проверку.

В основном используется в тестах, однако так же позволяет, например, проверять текущее состояние скрипта — заполненность всех нужных параметров и их корректность.

Реализована в виде двух независимых модулей — Утверждения и Ожидаем. Каждый из этих модулей содержит функции проверки переданных значений — на равенство, тип, состав и прочее. Хорошая вводная статья и примеры использования опубликованы в виде статьи на Хабре. Использование этой библиотеки можно увидеть практически во всех пакетах, имеющих тестирование в том или ином виде.

МояПеременная = ВычислитьЧтоТоТам();

// xUnit style
Утверждения.ПроверитьРавенство(1, МояПеременная, "Моя переменная должна быть строго равна 1");

// BDD style
Ожидаем.Что(МояПеременная, "Моя переменная должна быть строго равна 1").Равно(1);

cmdline — https://github.com/oscript-library/cmdline

Библиотека для разбора и декларативного задания аргументов командной строки.

OneScript при запуске скрипта позволяет получить все переданные скрипту аргументы через коллекцию "АргументыКоманднойСтроки", однако там они лежат в виде обычного массива строк. При разработке более сложных приложений появляется необходимость добавлять различные параметры-флаги, именованные и позиционные параметры, управлять составом команд… Тут на помощь приходит cmdline. С помощью класса ПарсерАргументовКоманднойСтроки можно указать все имеющиеся у скрипта параметры и/или команды и избавить разработчика от ненужной возни.

Парсер = Новый ПарсерАргументовКоманднойСтроки();

Парсер.ДобавитьПараметр("ПутьКФайлу");
Парсер.ДобавитьИменованныйПараметр("-action");

Параметры = Парсер.Разобрать(АргументыКоманднойСтроки);
Сообщить(Параметры["ПутьКФайлу"]);
Сообщить(Параметры["-action"]);

В данном случае при запуске скрипта через "oscript my_script.os -action МоеДействие C: emp empFile.txt" в соответствии "Параметры" окажется два значения с заранее заданными ключами — "ПутьКФайлу" будет хранить в себе "C: emp empFile.txt", а "-action" — "МоеДействие".

fs — https://github.com/oscript-library/files-common

Помощник по работе с файлами и каталогами.

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

ФС.ОбеспечитьПустойКаталог("./build");
Если ФС.КаталогСуществует("C:МойРабочийКаталог") Тогда
ФС.КопироватьСодержимоеКаталога("C:МойРабочийКаталог", "./build");
КонецЕсли;

gitrunner — https://github.com/nixel2007/gitrunner

Библиотека-обертка над командами git из OneScript.

Предоставляет "человекочитаемое" API для управления git-репозиторием в объектной технике. Стиль работы с библиотекой похож на v8runner (о котором чуть ниже).

ГитРепозиторий = Новый ГитРепозиторий();
ГитРепозиторий.УстановитьРабочийКаталог(ТекущийКаталог());

ГитРепозиторий.УстановитьНастройку("core.quotePath", "true", РежимУстановкиНастроекGit.Локально);

ГитРепозиторий.ДобавитьВнешнийРепозиторий("origin", "http://github.com/EvilBeaver/oscript-library");

ГитРепозиторий.ПерейтиВВетку("master");
ГитРепозиторий.Получить();

ГитРепозиторий.ОбновитьПодмодули(Истина, Истина);

json — https://github.com/oscript-library/json

Библиотека работы с JSON — порт обработки Александра Переверзева.

Хотя в движке OneScript есть возможность потокового чтения JSON-строк, на мелких файлах намного удобнее (де-)сериализовать объект одной командой. Относительно авторской обработки были внесены некоторые исправления и улучшения, однако общий смысл остался тот же.

ПарсерJSON = Новый ПарсерJSON();

СтрокаJSON = "{
|    ""firstName"": ""Иван"",
|    ""lastName"": ""Иванов"",
|    ""address"": {
|        ""streetAddress"": ""Московское ш., 101, кв.101"",
|        ""city"": ""Ленинград"",
|        ""postalCode"": 101101
|    },
|    ""phoneNumbers"": [
|        ""812 123-1234"",
|        ""916 123-4567""
|    ]
|}";

Объект = ПарсерJSON.ПрочитатьJSON(СтрокаJSON);

Утверждения.ПроверитьРавенство(Тип("Соответствие"), ТипЗнч(Объект));

Сообщить(Объект.firstName);

logos — https://github.com/oscript-library/logos

Логирование в стиле "взрослых языков".

Логирование — больная тема любого продукта, связанного с автоматизацией деятельности. Хочется включать и отключать отладочные логи, сохранять логи в файл и выводить их в консоль, может быть даже как-то их по-хитрому форматировать, управлять настройками из файла или из переменных среды… На все эти вопросы может ответить библиотека logos. Лучше один раз показать:

Лог = Логирование.ПолучитьЛог("oscript.app.messages"); // Инициализация лога
Лог.УстановитьУровень(УровниЛога.Информация); // Можно задать один из пяти уровней, например, Отладка

Лог.Информация("Информационное сообщение"); // выведется в лог
Лог.Отладка("Отладочное сообщение"); // а это - нет, т.к. уровень лога Информация выше, чем Отладка

strings — https://github.com/oscript-library/strings

Порт модуля СтроковыеФункцииКлиентСервер на OneScript, ни больше ни меньше.

МассивСтрок = Новый Массив;
МассивСтрок.Добавить("Вася");
МассивСтрок.Добавить("пошел в");
МассивСтрок.Добавить("Зоопарк.");

// Функция должна объединить строки из массива в строку с разделителями
РезультатСоединения = СтроковыеУтилиты.СтрокаИзМассиваПодстрок(МассивСтрок, " ");
Ожидаем.Что(РезультатСоединения).Равно("Вася пошел в Зоопарк.");

tempfiles — https://github.com/oscript-library/tempfiles

Библиотека для создания временных файлов и каталогов.

Отличительной особенностью является создание файлов в некоторых "пулах", которые можно разом удалить методом ВременныеФайлы.Удалить(). Имеет два режима работы:

  1. Модуль ВременныеФайлы предоставляет общий пул временных файлов среди всех используемых скриптов
  2. Инициализация класса МенеджерВременныхФайлов создаст отдельный пул файлов, которым можно управлять независимо от всех остальных пулов.
ВременныйФайл = ВременныеФайлы.СоздатьФайл();
ВторойВременныйФайл = ВременныеФайлы.СоздатьФайл();

// мой очень полезный код

ВременныеФайлы.Удалить(); // удалит оба созданных временных файла

tool1cd — https://github.com/oscript-library/tool1cd

Обертка над популярной утилитой для работы с файловыми базами от покинувшего нас Валерия Агеева.

Имеет два класса — ЧтениеТаблицФайловойБазыДанных и ЧтениеХранилищаКонфигурации, позволяющие вычитывать данные из файловых баз в виде таблиц значений.

ЧтениеБазыДанных = Новый ЧтениеТаблицФайловойБазыДанных;
ЧтениеБазыДанных.ОткрытьФайл(ФайлХранилища);

ТаблицаБД = ЧтениеБазыДанных.ПрочитатьТаблицу("VERSIONS");
Сообщить(ТаблицаБД.Количество());

ЧтениеБазыДанных.ЗакрытьФайл();

v8runner — https://github.com/oscript-library/v8runner

Один из самых популярных пакетов — запуск 1С в режимах Конфигуратора и Предприятие в объектной технике.

Позволяет забыть как страшный сон десятки различных флагов и параметров для запуска 1С из командной строки и поиск нужной версии установленной платформы, инкапсулируя это внутри класса УправлениеКонфигуратором. Список доступных методов в README безбожно устарел, для осознания всей мощи инструмента стоит заглянуть в исходники.

УправлениеКонфигуратором = Новый УправлениеКонфигуратором();

// контекст может быть и не задан, тогда работа выполняется в базе, созданной в каталоге временных файлов
УправлениеКонфигуратором.УстановитьКонтекст("/FC:1cdbmydatabase","Admin", "passw0rd");

УправлениеКонфигуратором.ЗагрузитьКонфигурациюИзФайла("C:source.cf");
УправлениеКонфигуратором.ОбновитьКонфигурациюБазыДанных();

УправлениеКонфигуратором.ВыполнитьСинтаксическийКонтроль();

Прочие библиотеки

Помимо библиотек из "стандартного набора" в хабе есть и другие не менее замечательные разработки.

add — https://github.com/silverbulleters/add

Продукт для разработки через TDD/BDD, упакованный в виде пакета.

Не совсем "библиотека", но по формальному признаку (отсутствие оберток для запуска из командной строки и наличие подключаемых модулей) отнесена в этот раздел. Используется для быстрой установки Vanessa ADD на машину разработчика или в локальный каталог репозитория через команду opm install -l add.

При запуске vanessa-runner с командой "vanessa" по умолчанию ищется установленный пакет add.

cli — https://github.com/khorevaa/cli

Библиотека для создания консольных приложений.

cli является целым "фреймворком" для создания консольных приложений. Являясь развитием идей cmdline, cli предоставляет API для декларативного описания структуры вашего приложения. Описывается:

  • набор команд и их классов-обработчиков
  • аргументы и опции команд, их типы
  • поддерживаются вложенные команды (подкоманды)

Формирование командной строки реализовано согласно POSIX стандартам, есть автоматический вывод справки по командам, поддерживаются объединение опций-флагов, массивы, взаимоисключающие опции/аргументы и многое другое.

Настоятельно рекомендую разработку нового консольного приложения на OneScript начинать с использования библиотеки cli.

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

Процедура ВыполнитьПриложение()

Приложение = Новый КонсольноеПриложение("cli", "Помощник генерации приложения на основании шаблона cli");
Приложение.Версия("v version","1.0.0");

Приложение.ДобавитьКоманду("i init", "Инициализация структуры нового приложения", Новый КомандаInit);

Приложение.Запустить(АргументыКоманднойСтроки);

КонецПроцедуры // ВыполнениеКоманды()

///////////////////////////////////////////////////////

Попытка

ВыполнитьПриложение();

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Отдельно добавлю, что и сами opm и ovm сейчас базируются на данной библиотеке.

ClientSSH — https://github.com/asosnoviy/oscript-ssh

ssh клиент для oscript.

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

Может использоваться для управления Конфигуратором (!) в режиме ssh-агента.

КлиентSSH = Новый КлиентSSH("127.0.0.1", 22, "user", "password");
Соединение = КлиентSSH.ПолучитьСоединение();
Результат = Соединение.ВыполнитьКоманду("echo 123");

Соединение.Разорвать();

collections — https://github.com/ret-Phoenix/OneScript-Collections

Расширенные коллекции для OneScript.

OneScript позволяет разрабатывать библиотеки не только на языке 1С, но и на C#. Особо желающие могут попробовать даже F#. Специально для тех, кому не хватает стандартных коллекций 1С, была создана данная библиотека. Она добавляет возможность использовать такие объекты как Стек и Очередь (Дек).

Очередь = Новый Очередь();

Очередь.Добавить("1");
Очередь.Добавить("2");
Очередь.Добавить("3");

Очередь.УбратьИзОчереди(); // в очереди останется 2 и 3

configor — https://github.com/khorevaa/configor

Библиотека для работы с конфигурационными файлами в формате json, yaml.

В отличие от ReadParams и params (о которых ниже), поддерживает предварительное описание параметров, зачитываемых из файла. В наличии поддержка дополнительных "провайдеров" для чтения параметров из других типов данных (файлы других структур и расширений, СУБД, переменные окружения).

    // Пример файла настроек
//{
//    'Настройки': {
//        "Глобальные": {
//            "НастройкиПрокси":{
//                "Сервер": "localhost",
//                "Порт": "8080"
//            }
//        }
//
//    }
//}

// Чтение без описания
МенеджерПараметров = Новый МенеджерПараметров();
МенеджерПараметров.УстановитьФайлПараметров("Путь/К/Файлу");
МенеджерПараметров.Прочитать();

ПроксиСервер = МенеджерПараметров.Параметр("Настройки.Глобальные.НастройкиПрокси.Сервер")

// Установка описания параметров
МенеджерПараметров.КонструкторПараметров(КлассСПараметрамиПриложения);

ПроксиСерверИзПараметровПриложения = ПараметрыПриложения.Параметры().Настройки.НастройкиПрокси.Сервер;

confluence — https://github.com/bia-tech/os-confluence

Взаимодействие с confluence.

Первая библиотека из категории 1С+ЧтоТо. Позволяет из OneScript управлять страницами в Confluence (собственный взгляд компании Atlassian на Wiki). Создание страниц, их редактирование, получение информации — все это через RestAPI.

Подключение = Confluence.ОписаниеПодключения("https://confluence.myserver.ru", "user", "password");

ИдентификаторНовойСтраницы = Confluence.СоздатьСтраницу(Подключение, "SpaceKey", "Новая страница", "Содержимое новой страницы");
Confluence.ПрикрепитьМеткуКСтранице(ПараметрыПодключения, ИдентификаторНовойСтраницы, "Моя метка");

coverage — https://github.com/khorevaa/oscript-coverage

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

Мало кто знает, но OneScript умеет мерить покрытие исполнявшегося кода. Для этого его надо запустить с параметром -codestat=ПутьКФайлуСРезультатамиЗамера. На выходе нас будет ждать json-файл с информацией о том, какие сценарии запускались и какие строки кода в них выполнялись. С помощью библиотеки coverage этот json можно сконвертировать в популярные форматы Clover, Covertura и GenericCoverage, использующийся в SonarQube.

А с плагином coverage-gutters для Visual Studio Code можно прямо в редакторе видеть покрытие кода тестами.

ПроцессорГенерации.ОтносительныеПути()
.ФайлСтатистики(Файл_Стат.ПолноеИмя)
.GenericCoverage() // // Формирование отчета в формате GenericCoverage
.Cobertura() // Формирование отчета в формате Cobertura
.Clover(ИмяПакета) // Формирование отчета в формате Clover
.Сформировать();

datetime— https://github.com/khorevaa/datetime

Библиотека для облегчения работы со датой/временем.

Содержит в себе функции по конвертации даты-времени в/из формата unix timestamp, а так же двустороннюю конвертацию даты-времени по форматной строке.

ФорматДатыСтроки = "dd MM yy";
ДатаПоФормату = "01 01 18";

// В переменной "Дата" окажется дата '20240101';
Дата = ПроцессорДаты.СтрокаВДату(ДатаПроверкиПоФормату, ФорматДатыСтроки);

delegate — https://github.com/artbear/delegate

Делегаты/функторы в 1С.

Тем, кто скучает по Функциям как Объектам Первого Класса или кому просто хочется немного функционального программирования, может понравится эта библиотека. С ее помощью можно создать что-то вроде указателя на процедуру или функцию, передать его как параметр в какой-нибудь другой метод и там его исполнить. Является переработкой библиотеки notify.

// Метод, вызываемый из делегата
Процедура Поздороваться(Имя) Экспорт
Сообщить("Привет, " + Имя + "!");
КонецПроцедуры

Делегат = Делегаты.Создать(ЭтотОбъект, "Поздороваться", "Мир");

Делегаты.Исполнить(Делегат); // или Делегат.Исполнить();

ДелегатНовыйМир = Делегаты.Создать(ЭтотОбъект, "Поздороваться");

ДелегатНовыйМир.Исполнить("Новый мир"); // или Делегаты.Исполнить(ДелегатНовыйМир, "Новый мир");

entity — https://github.com/nixel2007/entity

Библиотека Entity предназначена для работы с данными БД как с простыми OneScript объектами. Является реализацией концепции ORM в OneScript.

Данная библиотека позволяет описывать структуру БД или "модель" в виде набора "сущностей" — специальным образом аннотированных классов OneScript. Поддерживаются все операции CRUD, работа с транзакциями, сложный поиск объектов.

Поддержка различных СУБД возможна в виде "коннекторов", имеющих единый интерфейс. В качестве стандартной реализации библиотека уже содержит коннектор к SQLite.

// file: ФизическоеЛицо.os

// Данный класс содержит информацию о физических лицах.

&Идентификатор                             // Колонка для хранения ID сущности
&ГенерируемоеЗначение                      // Заполняется автоматически при сохранении сущности
&Колонка(Тип = "Целое")                    // Хранит целочисленные значения
Перем Идентификатор Экспорт;               // Имя колонки в базе - `Идентификатор`

Перем Имя Экспорт;                         // Колонка `Имя` будет создана в таблице, т.к. поле экспортное.
&Колонка(Имя = "Отчество")                 // Поле `ВтороеИмя` в таблице будет представлено колонкой `Отчество`.
Перем ВтороеИмя Экспорт;

&Колонка(Тип = "Дата")                     // Колонка `ДатаРождения` хранит значения в формате дата-без-времени
Перем ДатаРождения Экспорт;

&Колонка(Тип = "Ссылка", ТипСсылки = "СтраныМира")
Перем Гражданство Экспорт;                 // Данная колонка будет хранить ссылку на класс СтраныМира

&Сущность(ИмяТаблицы = "ФизическиеЛица")   // Объект с типом `ФизическоеЛицо` (по имени файла) будет представлен в СУБД в виде таблицы `ФизическиеЛица`
Процедура ПриСозданииОбъекта()

КонецПроцедуры
// Работа с обычными объектом OneScript.
СохраняемоеФизЛицо = Новый ФизическоеЛицо;
СохраняемоеФизЛицо.Имя = "Иван";
СохраняемоеФизЛицо.ВтороеИмя = "Иванович";
СохраняемоеФизЛицо.ДатаРождения = Дата(1990, 01, 01);

СтранаМира = Новый СтраныМира;
СтранаМира.Код = "643";
СтранаМира.Наименование = "Российская Федерация";

// Присваиваем колонке с типом "Ссылка" конкретный объект с типом "СтраныМира"
СохраняемоеФизЛицо.Гражданство = СтранаМира;

// Сохранение объектов в БД
// Сначала сохраняются подчиненные сущности, потом высокоуровневые
МенеджерСущностей.Сохранить(СтранаМира);
МенеджерСущностей.Сохранить(СохраняемоеФизЛицо);

// После сохранения СохраняемоеФизЛицо.Идентификатор содержит автосгенерированный идентификатор.
// Колонка "Гражданство" в СУБД будет хранить идентификатор объекта СтранаМира - значение "643".

extensions — https://github.com/ret-Phoenix/onescript-extensions

Дополнительные возможности для OneScript, не вошедшие в движок.

Хотя авторы очень рады любым контрибьюторам движка, некоторые возможности все же не попадают в основной движок OneScript. Данный проект — площадка для экспериментов. Возможно какие-то вещи когда-нибудь все же окажутся в основной ветке, а пока вы можете подключить данную библиотеку. Например, для работы с буфером обмена или для получения параметров экрана.

Буфер = Новый БуферОбмена();
Буфер.Установить("есть!");
Ожидаем.Что(Буфер.Получить()).Равно("есть!");

fluent — https://github.com/nixel2007/oscript-fluent

Обработка коллекций в "текучем" стиле.

Многие из авторов библиотек помимо 1С пишут на других языках. Автор данной библиотеки был "укушен Джавой", что натолкнуло его на идею обработки коллекций в "потоковом" или "конвейерном" стиле.

Массив = Новый Массив;
Массив.Добавить(3);
Массив.Добавить(4);
Массив.Добавить(7);
Массив.Добавить(5);
Массив.Добавить(7);
Массив.Добавить(0);

Результат = ПроцессорыКоллекций.ИзКоллекции(Массив)
.Различные()
.Фильтровать("Результат = Элемент >= 5")
.Обработать("Сообщить(Элемент)")
.Обработать("Результат = Элемент + 1")
.ВМассив();

// На выходе два сообщения в лог (5 и 7) и массив [6, 8]  

ftp — https://github.com/dmpas/oscript-ftp

FTP-клиент для OneScript.

Имя библиотеки говорит само за себя — работа с файлами по протоколу ftp.

Соединение = Новый FtpСоединение("example.com");

Соединение.Записать("/local/file.txt", "/dir/");

Файлы = Соединение.НайтиФайлы("/dir/", "file.txt");

Файл = Файлы[0];

РазмерФайла = Файл.Размер();

gui — https://github.com/ret-Phoenix/oscript-simple-gui

Графический интерфейс в OneScript.

Одна из самых удивительных и неожиданных библиотек для OneScript. Добавляет возможность кодом создавать графический интерфейс для скриптов. Есть работа с таблицами и деревьями, кнопки, поля ввода и многое другое. Статья-анонс на Инфостарте от автора Сергея Ушакова — //infostart.ru/public/540284/

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

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

Перем Форма;

//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт

ПолеВвода1 = Форма.Элементы.Добавить("ПолеВвода1", "ПолеФормы", Неопределено);
ПолеВвода1.Вид = Форма.ВидПоляФормы.ПолеВвода;
ПолеВвода1.Заголовок = "Поле ввода";
ПолеВвода1.Значение = "Значение задано из скрипта";

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

УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
Форма = УправляемыйИнтерфейс.СоздатьФорму();

//# Устанавливаем обработку события ПриОткрытии
Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
Форма.Показать();

InternetMail — https://github.com/dmpas/oscript-mail

Реализация протокола SMTP для отправки почти.

Повторение синтаксиса и классов 1С по работе с почтовыми сообщениями, но на C# и из OneScript. 

Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить("receiver@mail.ru");
Сообщение.ОбратныйАдрес.Добавить("someuser@mail.ru");
Сообщение.Отправитель = "someuser@mail.ru";
Сообщение.Тема        = "Server is down";
Текст =  "
|<h3>Server is down !</h3>
|Надо что-то делать.<br/>";

Сообщение.Тексты.Добавить(Текст, ТипТекстаПочтовогоСообщения.HTML);
Сообщение.Вложения.Добавить("C:/Пример вложения 1.docx");
Сообщение.Вложения.Добавить(
Новый ДвоичныеДанные("C:/Пример вложения 2.docx"),
"Пример вложения 2.docx"
);

irac — https://github.com/arkuznetsov/irac

Управление кластером серверов 1С с помощью утилит rac/ras.

Библиотека является оберткой над утилитой командной строки rac, оборачивая ее вызовы в удобные функции и объекты языка 1С.

АдминистрированиеКластера = Новый АдминистрированиеКластера("localhost", 1545, "8.3.10", "admin", "P@ssw0rd");
СписокКластеров = АдминистрированиеКластера.Кластеры();

Кластер = Кластер = Кластеры.Получить(1541);

Сообщить("Всего ИБ: " + Кластер.ИнформационныеБазы().Список().Количество());

markdown — https://github.com/oscript-library/markdown

Парсер разметки Markdown и генерация HTML.

Миниатюрная библиотека на C# для работы с Markdown. Файлы README в хабе пакетов и различные вставки кода на сайтах oscirpt.io и web.oscript.io обрабатываются как раз этой библиотекой.

Парсер = Новый ПарсерРазметкиMD();
Парсер.ВключитьРасширения = Истина;
Текст = "# Привет
|
|[http://advice.org/Как поймать слона](http://oscript.io/Как%20поймать%20слона)";

Сообщить(Парсер.СоздатьHTML(Текст));

messenger — https://github.com/oscript-library/messenger

Отправка сообщений в различные сервисы.

Еще одна интеграционная библиотека. На этот раз — для отправки сообщений. На момент написания статьи умеет отправлять SMS (через трех операторов), а так же писать сообщения в Slack, RocketChat, Gitter и Telegram. Слышал о "success story" с отправлением ошибок из Журнала Регистрации в Телеграм-чат с последующей раздачей по шапке получившим сообщение.

ИмяКомнаты = "organization/repo";
Мессенджер = Новый Мессенджер();
Мессенджер.ИнициализацияGitter(ТокенПользователя);
Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Всем привет!" );

moskito — https://github.com/nixel2007/moskito

Библиотека предназначена для создания моков (mock) и стабов (stub) в OneScript.

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

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

HTTPЗапрос = Новый HTTPЗапрос("/ping");

МокСоединение = Мок.Получить(Новый HTTPСоединение("localhost"));

// Некоторые объекты нельзя создавать через конструктор.
// Для таких объектов можно воспользоваться созданием мока из типа.
Ответ = Мок.Получить(Тип("HTTPОтвет"));
Ответ.КодСостояния = 200;
Ответ.Когда().ПолучитьТелоКакСтроку().ТогдаВозвращает("Переопределенный ответ");

// Моки можно вкладывать в моки
МокСоединение.Когда().Получить(HTTPЗапрос).ТогдаВозвращает(Ответ);
Результат = МокСоединение.Получить(HTTPЗапрос);
Ожидаем.Что(Результат.ПолучитьТелоКакСтроку()).Равно("Переопределенный ответ");

notify — https://github.com/nixel2007/notify

Создание и обработка объектов ОписаниеОповещения.

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

// Процедура-обработчик описания оповещения.
//
Процедура СообщитьПриветМир(Результат, ДополнительныеПараметры = Неопределено) Экспорт
Сообщить("Привет, " + ДополнительныеПараметры + "!");
ВызватьИсключение "Что-то произошло!";
КонецПроцедуры

// Создание объекта ОписаниеОповещения. Аналогично использованию "Новый ОписаниеОповещения("СообщитьПриветМир", ЭтотОбъект, "Мир")" в 1С.
ОписаниеОповещения = ОписанияОповещений.Создать("СообщитьПриветМир", ЭтотОбъект, "Мир");

// Выполнение обработки оповещения. Аналогично использованию ВыполнитьОбработкуОповещения(ОписаниеОповещения) в 1С.
ОписанияОповещений.ВыполнитьОбработкуОповещения(ОписаниеОповещения);

params — https://github.com/artbear/params

Стандартизированное переопределение параметров командной строки из json-файлов конфигурации и переменных окружения.

Данная библиотека условно является надстройкой над библиотекой "cmdline". Используя вывод ПарсераАргументовКоманднойСтроки, анализируя наличие и содержимое файла настроек и переменных среды, позволяет получить итоговые значения параметров. У каждого типа задания параметра есть свой приоритет. Файлы настроек могут быть вложенными друг в друга через специальные поля-ссылки. Является продолжением идей библиотеки ReadParams.

Парсер = Новый ПарсерАргументовКоманднойСтроки();
Парсер.ДобавитьИменованныйПараметр("Параметр");

Параметры = ЧтениеПараметров.Прочитать(Парсер, АргументыКоманднойСтроки);

ParserFileV8i — https://github.com/ret-Phoenix/parserV8i

Чтение и запись файла списка баз .v8i.

Обработка списка баз в виде соответствия, поиск баз по имени или пути. На сладкое — класс для очистки кэша.

Парсер = Новый ПарсерСпискаБаз;
Парсер.УстановитьФайл("tests/ibases.v8i");

Результат = Парсер.НайтиПоПути("http://localhost/lessons/");

Ожидаем.Что(Результат.Connect.String).Равно("Connect=ws=""http://localhost/lessons/"";");

progbar — https://github.com/theshadowco/progbar

Консольный прогресс-бар.

В OneScript по сравнению с 1С добавлены возможности по взаимодействию с окном консоли. Перемещение курсора, перерисовка и прочие милые сердцу старых паскалистов/сишников вещи. Данная библиотека дает удобную возможность по рисованию и управлению консольным прогресс-баром.

ПрогрессБар = Новый ПрогрессБар();
ПрогрессБар.Начать(100, "Прогресс ");

Для Ит = 0 По 100 Цикл

ПрогрессБар.СделатьШаг();
Приостановить(200);

КонецЦикла;
ПрогрессБар.Завершить();

RabbitMQ — https://github.com/oscript-library/rabbitmq

Клиент для RabbitMQ.

Минималистичный клиент для RabbitMQ, адаптер клиента на C# в OneScript. Поддерживает базовые методы отправки и получения сообщений. На данный момент поддерживается прием/передача только строковых данных.

Соединение = Новый СоединениеRMQ;

Соединение.Пользователь = "guest";
Соединение.Пароль = "guest";
Соединение.Сервер = "localhost";
Соединение.ВиртуальныйХост = "/";

Клиент = Соединение.Установить();
ИмяТочкиОбмена = "test";
Клиент.ОтправитьСтроку("Привет", ИмяТочкиОбмена);

Соединение.Закрыть();

ReadParams — https://github.com/Stepa86/ReadParams 

Чтение параметров скрипта из json-файла.

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

записьТекста = Новый ЗаписьТекста(файлПараметров1);
ЗаписьТекста.ЗаписатьСтроку( "{""парам.Число"": 1, ""парам.Строка"": ""1"", ""парам.Булево"": true}" );
ЗаписьТекста.Закрыть();

прочитанныеПараметры = ЧтениеПараметров.Прочитать( файлПараметров1 );

// прочитанныеПараметры["парам.Число"] = 3;
// прочитанныеПараметры["парам.Строка"] = "3";
// прочитанныеПараметры["парам.Булево"] = Истина;

reflector — https://github.com/khorevaa/reflector 

Библиотека упрощает и расширяет работу с встроенным в OneScript объектом Рефлектор и добавляет функциональность работы с интерфейсами.

Помимо ожидаемых функций-оберток вроде ЕстьФункция/ЕстьСвойство позволяет описывать "интерфейс" — некий контракт класса в виде обязательного набора процедур и функций, и в последствии проверять классы на соответствие контракту.

Интерфейс = Новый ИнтерфейсОбъекта;
Интерфейс.ФункцияИнтерфейса("Функция1", 2)
.ПроцедураИнтерфейса("Процедура1");

РасширенныйРефлектор = Новый РефлекторОбъекта(ЭтотОбъект);

РеализуетИнтерфейс = РасширенныйРефлектор.РеализуетИнтерфейс(Интерфейс);

Утверждения.ПроверитьИстину(РеализуетИнтерфейс, "Интерфейс реализуется объектом");

restler — https://github.com/oscript-library/restler

Помощник работы с RestAPI.

Довольно молодая библиотека, родившаяся после нескольких мучительных дней работы с HTTPСоединением. Упрощает шаги по вызову различных http-сервисов, сама делает десериализацию, позволяет управлять кодом состояния. Имеет бедное README, однако уже зарекомендовала себя (личным примером) как отличный фундамент для построения более высокоуровневых интеграционных компонентов уже как минимум к пяти различным системам.

Клиент = Новый КлиентВебAPI();
Клиент.ИспользоватьСоединение(Новый HTTPСоединение("localhost"));
ИнформацияОПродажах = Клиент.Получить("sales/totals");

Для Каждого Инфо Из ИнформацияОПродажах Цикл
Сообщить(СтрШаблон("Продано товара %1 на сумму %2", Инфо["nomenclature"], Инфо["sum"]));
КонецЦикла;

semver — https://github.com/khorevaa/semver

Библиотека предназначена для чтения и сравнения строковых версий по стандарту семантического версионирования (версии 2.0). Этот стандарт широко применяется при работе с пакетами в других языка, таких как, например, node.js и его пакетный менеджер npm, и python с его pip.

Помимо "простого" сравнения точных версий на больше-меньше поддерживаются "диапазоны" (по правилам semver).

Результат = Версии.ВерсияВДиапазоне("1.0.2", ">=1.0.0");

МассивВерсий = Новый Массив();
МассивВерсий.Добавить("1.0.2");
МассивВерсий.Добавить("1.0.3");
МассивВерсий.Добавить("1.0.4");

МаксимальнаяВерсия = Версии.МаксимальнаяВерсияМежду(МассивВерсий, ">=1.0.0", "<2.0.0");

// ИЛИ
МаксимальнаяВерсия = Версии.Сравнение(">=1.0.0")
.ДобавитьДиапазон("<2.0.0")
.ПроверяемыеВерсии(МассивВерсий)
.Максимальная();

Сообщить(МаксимальнаяВерсия.ВСтроку());

sql — https://github.com/ret-Phoenix/oscript-sql

Работа с SQL-базами из OneScript.

Изначально библиотека разрабатывалась для работы с sqlite — чтение и обработка Журнала Регистрации и собственные мини-базы (в том числе in-memory). На данный момент дополнительно поддерживаются MS SQL Server, MySQL и PostgreSQL.

Соединение = Новый Соединение();
Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite;
Соединение.ИмяБазы = ":memory:";
Соединение.Открыть();

Запрос = Новый Запрос();
Запрос.УстановитьСоединение(Соединение);
Запрос.Текст = "Create table users (id integer, name text)";
Запрос.ВыполнитьКоманду();

Запрос.Текст = "insert into users (id, name) values(1, @name)";
Запрос.УстановитьПараметр("name", "Сергей");
Запрос.ВыполнитьКоманду();

Запрос2 = Новый Запрос();
Запрос2.УстановитьСоединение(Соединение);
Запрос2.Текст = "select * from users where id = @id";
Запрос2.УстановитьПараметр("id", 1);
ТЗ = Запрос2.Выполнить().Выгрузить();

telegrambot — https://github.com/pallid/telegrambot

Библиотека для взаимодействия с Telegram Bot API.

Поддерживается обработка входящих сообщений, отправка сообщений, работа с кнопками и клавиатурой, геолокация и отправка контактов. Поддерживается работа в OneScript.Web.

Бот = Новый ТелеграмБот;
Бот.УстановитьТокенАвторизации("ТВОЙ_ТОКЕН_БОТА");
Бот.УстановитьВебхук("ТВОЙ_АДРЕС_ДЛЯ_ХУКОВ");

///

ОбъектЗапрос = ПарсерJSON.ПрочитатьJSON(ТекстТелаЗапроса);

Если ОбъектЗапрос["message"] <> Неопределено Тогда

ТекстСообщения = ОбъектЗапрос["message"]["text"];
ПолучательИД = ОбъектЗапрос["message"]["chat"]["id"];

Если ТекстСообщения = "/start" тогда

ТекстСообщения = "Привет, в низу меню для навигации";
Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения);
ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, ГлавноеМеню());
Результат = Бот.Отправить(Сообщение);

КонецЕсли;

КонецЕсли; 

TLog — https://github.com/Tavalik/TLog

Альтернативная реализация логирования для OneScript.

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

Логирование = Новый ТУправлениеЛогированием();
Логирование.ДатаВремяВКаждойСтроке = Истина;

Логирование.СоздатьФайлЛога("ТестовоеЗадание",РабочийКаталог);
Логирование.ЗаписатьСтрокуЛога("Начало процедуры");

// Запишем строку с отступом
Логирование.УвеличитьУровень();
Логирование.ЗаписатьСтрокуЛога("Строка второго уровня");
Логирование.УменьшитьУровень();

Логирование.ЗаписатьСтрокуЛога("Окончание процедуры");

// Выведет:
// [11.05.2024 12:03:11] Начало процедуры
// [11.05.2024 12:03:12]     Строка второго уровня
// [11.05.2024 12:03:12] Окончание процедуры

TMail — https://github.com/Tavalik/TMail

Библиотека для отправки электронных сообщений. В своей работе использует COM-объекты, соответственно работает исключительно под Windows. 

В наличии поддержка HTML и текстовых сообщений, вложений, отправка нескольким получателям. Есть поддержка SSL.

УправлениеЭП = Новый ТУправлениеЭлектроннойПочтой();

УчетнаяЗаписьЭП = УправлениеЭП.УчетнаяЗаписьЭП;
// Настройка учетной записи...
УчетнаяЗаписьЭП.АдресSMTP = "smtp.mydomain.com";
// ...

СтруктураСообщения = УправлениеЭП.СтруктураСообщения;
СтруктураСообщения.АдресЭлектроннойПочтыПолучателя = "admin@mydomain.com;";
СтруктураСообщения.Вложения = ИмяФайлаДляВложения;
СтруктураСообщения.ТемаСообщения = "Проверка работы библиотеки TMail";
СтруктураСообщения.ТипТекстаПочтовогоСообщения = "HTML";

УправлениеЭП.НачатьТекстСообщенияHTML();
УправлениеЭП.ДобавитьВТекстСообщенияHTML("Проверка работы библиотеки TMail");
УправлениеЭП.ЗавершитьТекстСообщенияHTML();

УправлениеЭП.ОтправитьСообщение();

TMSSQL — https://github.com/Tavalik/TMSSQL

Библиотека для работы с базами данных на MS SQL Server. В своей работе использует COM-объекты, соответственно работает исключительно под Windows. 

Объектная обертка над ADODB.Connection, упрощающая взаимодействие с СУБД MS SQL Server. для Может работать и как библиотека и как приложение.

УправлениеMSSQL = Новый УправлениеMSSQL();

// Введем параметры
ПараметрыПодключения = УправлениеMSSQL.ПараметрыПодключения;
ПараметрыПодключения.АдресСервераSQL = "10.1.1.40";
// ...

УправлениеMSSQL.СоздатьБД();

УправлениеMSSQL.ИзменитьМодельВосстановленияБД("FULL");

ПолноеИмяФайла = УправлениеMSSQL.СделатьРезервнуюКопиюБД(,,"FULL");

TRun1C — https://github.com/Tavalik/TRun1C

Библиотека для запуска 1С:Предприятие 8 в различных режимах.

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

Запуск1С = Новый ТУправлениеЗапуском1С();

ПараметрыЗапуска = Запуск1С.ПараметрыЗапуска;
ПараметрыЗапуска.ПутьКПлатформе1С = "C:Program Files (x86)1cv88.3.8.2054in1cv8.exe";
ПараметрыЗапуска.ТипБазы = "F";
ПараметрыЗапуска.ИмяБазы = "C:
epoOS_TScripts\_TestsBase";
// ...

Запуск1С.ЗапуститьПредприятие();
Запуск1С.ЗапуститьКонфигуратор();

Запуск1С.УстановитьБлокировкуНачалаСеансов();
Запуск1С.ЗавершитьРаботуПользователей();

Запуск1С.ВыгрузитьИнформационнуюБазу(ПолныйПутьКФайлу);

v8storage — https://github.com/oscript-library/v8storage

Работа с Хранилищем 1С в стиле v8runner.

Библиотека является развитием идей и функциональности v8runner, специализируясь именно на работе с хранилищем.

ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации();
ХранилищеКонфигурации.УстановитьКаталогХранилища(КаталогХранилища);

ХранилищеКонфигурации.ПрочитатьХранилище();

ХранилищеКонфигурации.СохранитьВерсиюКонфигурацииВФайл(НомерВерсии, ИмяФайлаКофигурации);

ТаблицаВерсий = ХранилищеКонфигурации.ПолучитьТаблицаВерсий();
МассивАвторов = ХранилищеКонфигурации.ПолучитьАвторов();

v8unpack — https://github.com/dmpas/oscript-v8unpack

Порт компоненты для работы с контейнерами файлов 1С:Предприятие 8.

Среди людей, которые хоть раз занимались распаковой и анализом внешних обработок или конфигураций 1С (еще до 8.3.7), утилита v8unpack давно известна. Данный порт является переработкой данного приложения в виде компоненты на C# для вызова ее изнутри OneScript без всяких ЗапуститьПриложение(). На данный момент поддерживается только команда -parse в тех рамках, в которых она используется в приложении gitsync (о нем ниже).

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

ЧтениеФайла = Новый ЧтениеФайла8("ПутьКФайлу");
Для Каждого мЭлемент Из ЧтениеФайла.Элементы Цикл
Сообщить(мЭлемент.Имя);
ЧтениеФайла.Извлечь(мЭлемент, "Каталог", Истина);
КонецЦикла;

vanessa-behavior — https://github.com/silverbulleters/vanessa-behavior2

Фреймворк для разработки через BDD, упакованный в виде пакета.

Не совсем "библиотека", но по формальному признаку (отсутствие оберток для запуска из командной строки и наличие подключаемых модулей) отнесена в этот раздел. Используется для быстрой установки Vanessa Behavior на машину разработчика или в локальный каталог репозитория через команду opm install -l vanessa-behavior. Обращаю внимание, что данный пакет собирается из репозитория Vanessa-Behavior2, который в данный момент не поддерживается.

verbal-expressions — https://github.com/oscript-library/verbal-expressions

Библиотека для OneScript, помогающая собирать сложные регулярные выражения в объектной технике.

Регулярные выражения часто имеют один существенный недостаток. Они, что называется, write-only. Их не очень сложно написать, но сложно читать. Есть несколько подходов к упрощению разбора регулярных выражений. Данная библиотека (и мультиязычный проект verbal expressions) представляет один из них.

ВербальноеВыражение = Новый ВербальноеВыражение()
.НачалоСтроки()
.Затем("http")
.МожетБыть("s")
.Затем("://")
.ЧтоНибудьНоНе(" ")
.КонецСтроки();

ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку();
Сообщить(ТекстРегулярногоВыражения); // #k8SjZc9Dxk(http)(s)?(://)([#k8SjZc9Dxk ]+)$

ЭкранироватьПереданноеЗначение = Ложь;

ВербальноеВыражение = Новый ВербальноеВыражение()
.НачалоСтроки()
.Затем(
Новый ВербальноеВыражение()
.Найти("http")
.МожетБыть("s")
.Либо("ftp")
.ВСтроку(),
ЭкранироватьПереданноеЗначение
)
.Затем("://")
.ЧтоНибудьНоНе(" ")
.КонецСтроки();

ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку();
Сообщить(ТекстРегулярногоВыражения); // #k8SjZc9Dxk(((http)(s)?)|(ftp))(://)([#k8SjZc9Dxk ]+)$

xml-parser — https://github.com/khorevaa/xml-parser

Библиотека для (де)cериализации данных в xml.

Данная библиотека пригодится для работы с XML как объектом (структурой или соответствием). Конечно, это не полноценная замена технологии DOM, но тем не менее есть поддержка вложенных тегов, атрибутов, комментариев, массивов и блоков CDATA.

//<ФайлПФР>
//    <ИмяФайла>
//        <НазваниеФормата>fb2</НазваниеФормата>
//        <НазваниеПрограммы />
//    </ИмяФайла>
//</ФайлПФР>

ПутьКФайлу = "ТутНуженПутьКФайлу";

ПроцессорXML = Новый СериализацияДанныхXML();

РезультатЧтения = ПроцессорXML.ПрочитатьИзФайла(ПутьКФайлу);

Сообщить(РезультатЧтения["ФайлПФР"]["ИмяФайла"]["НазваниеФормата"]);

//////////////////////////////

ДанныеЗаписиXML = Новый Структура("name", "Наименование");

ПроцессорXML.ЗаписатьВФайл(ПутьКФайлу);

// Содержимое файла
//<name>Наименование</name>

yadisk — https://github.com/kuntashov/oscript-yadisk

Работа с Яндекс.Диск через RestAPI.

C помощью этого пакета можно автоматизировать загрузку/выгрузку файлов с помощью Яндекс.Диск, получать свойства диска (размер, свободное и занятое пространство), работать с корзиной и прочее. Вот здесь есть пример использования библиотеки от самого автора — отдельное приложение для загрузки файлов.

OAuth_Токен = "..."; // Используйте полученный токен для вашего приложения.

ЯндексДиск = Новый ЯндексДиск;
ЯндексДиск.УстановитьТокенАвторизации(OAuth_Токен);

ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".txt";
ПутьНаДиске = "/test-folder/" + ИмяФайла;

ЯндексДиск.ЗагрузитьНаДиск("c:/data/file-to-upload.txt"), ПутьНаДиске);

yaml — https://github.com/khorevaa/yaml

Библиотека для чтения и записи файлов в формате YAML.

Аналогично библиотекам json и xml-parser, yaml осуществляет сериализацию yaml-строки в объект (и обратно).

Процессор = Новый ПарсерYAML;

// Нижеследующий текст будет преобразован в массив строк
СтрокаYaml =
"
|--- # Favorite movies
| - Casablanca
| - North by Northwest
| - The Man Who Wasn't There";

ОбъектыМассив = Процессор.ПрочитатьYaml(СтрокаYaml);

// Нижеследующий текст будет преобразован в соответствие. Значения элементов соответствия
// будут разобраны согласно стандарту YAML.
СтрокаYaml =
"---
|a: 123                     # an integer
|b: ""123""                 # a string, disambiguated by quotes
|c: 123.0                   # a float
|d: !!float 123             # also a float via explicit data type prefixed by (!!)
|e: !!str 123               # a string, disambiguated by explicit type
|f: !!str Yes               # a string via explicit type
|g: True                     # a boolean True (yaml1.1), string ""Yes"" (yaml1.2)
|h: Yes we have No bananas  # a string, ""Yes"" and ""No"" disambiguated by context.
|...";

ОбъектыСоответствие = Процессор.ПрочитатьYaml(СтрокаYaml);

Приложения

Как я писал выше, приложения — это те же самые скрипты для интерпретатора OneScript, но предназначенные для запуска из командной строки. При установке таких приложений через opm в PATH добавляются обертки в виде bat/sh-файлов, позволяющие запускать их без лишних телодвижений. Например, вместо строки

"C:Program Files (x86)OneScriptinoscript.exe" "C:Program Files (x86)OneScriptlibgitsyncsrcgitsync.os"

можно просто вызвать приложение "gitsync". Целью создания таких приложений является упрощение выполнения каких-то типовых задач "в одну строку", без написания собственных скриптов. Часто эти же запуск этих приложений встраивается в сборочные линии, например, на Jenkins CI. Аналогично библиотекам, часть приложений поставляется в "стандартном наборе", остальные доступны для установки через opm.

Поставляемые приложения

1bdd — https://github.com/artbear/1bdd

Фреймворк для разработки через BDD в OneScript.

Приложение позволяет запускать проверки поведения по заранее написанным feature-файлам. Реализации шагов (step_definitions) описываются в виде скриптов для OneScript. Имеются возможности по пакетному запуску прогона фич, генерации реализаций шагов по feature-файлам, представление результатов отчета в формате jUnit, собственная библиотека шагов. Пакет может быть подключен как библиотека через #Использовать, например, для реализации программного запуска прогона сценариев и файлов задач (tasks) пакетного менеджера opm.

1bdd ./features -junit-out out/

1testrunner — https://github.com/artbear/1testrunner

Фреймворк для разработки через TDD в OneScript.

Пакет является портом фреймфорка xUnitFor1C. Предназначен для запуска tdd-тестов. Реализация тестов описывается в виде скриптов для OneScript. Можно запускать отдельные тесты или каталог с тестами целиком. Так же, как и в 1bdd, есть представление результатов тестирования в виде отчета jUnit и подключение как библиотеки через #Использовать.

# запустит все тесты из каталога tests и сформирует отчет о результатах тестирования в каталоге build
1testrunner -runall ./tests xddReportPath ./build

gitsync — https://github.com/oscript-library/gitsync

Синхронизация хранилища 1С с репозиторием git.

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

gitsync export c:/storage/zup src/cf

Прочие приложения

autodocgen — https://github.com/bia-tech/autodocgen

Инструмент генерации документации на основании файлов исходных кодов конфигурации 1С:Предприятие.

Позволяет автоматически генерировать документацию в формате HTML и/или экспортировать в пространства Confluence. Поддерживается разбор описаний методов, работа с Областями.

autodocgen generate . -git -format html

changelog-generate — https://github.com/KrapivinAndrey/ChangeLogGenerator

Генератор changelog.md на OneScript.

Обновляет лог изменений, разбивая описания коммитов по группам. Ориентируется на первое слово. По умолчанию следует правилам разбиения keepachangelog, однако позволяет переопределить настройки через специальный yaml-файл.

Обновление файла CHANGELOG.md разницей между коммитом с хэшем xxx и HEAD:

changelog-generate xxx

cpdb — https://github.com/arkuznetsov/cpdb

Приложение-комбайн по работе базой данных в файловом формате и MS SQL Server.

Позволяет автоматизировать загрузку/выгрузку базы, отправку базы на Yandex.Диск, работу с сетевыми дисками, выполнять архивацию и прочие частые операции. С полным списком команд можно ознакомится в README проекта.

Пример выполнения бэкапа и отправки его на Я.Диск:

cpdb backup -sql-srvr MySQLName MyDatabase -sql-user sa -sql-pwd 12345 -bak-path "d:MSSQLBackupMyDatabase_copy.bak"
cpdb putyadisk -file "d:MSSQLBackupMyDatabase_copy.bak" -ya-token XXXXXXXXXXXXXXXXXXXXXXXXXXXXX -ya-path "/transfer/MyDatabase_copy.bak" -delsrc

deployka — https://github.com/oscript-library/deployka

Развертывание конфигураций 1С.

Приложение позволяет автоматизировать обновление конфигураций из хранилища/файла конфигурации/файла обновления. Приятным дополнением является возможность управления активными сеансами через родные для 1С утилиты rac/ras.

# Блокировка базы с удалением всех сеансов
deployka session kill -ras myserver:1545 -db-user admin -db-pwd pass -lockuccode "123"
# Обновление конфигурации из хранилища
deployka loadrepo /FC:Infobase C:Хранилище1С -db-user admin -db-pwd pass -storage-user admin -storage-pwd pass -uccode "123"
# Обновление БД
deployka dbupdate /FC:Infobase -db-user admin -db-pwd pass -uccode "123"
# Разблокировка базы
deployka session unlock -ras myserver:1545 -db-user admin -db-pwd pass

gitrules — https://github.com/otymko/gitrules

Версионирование правил обмена 1С с помощью git.

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

Имеется возможность запуска распаковки/запаковки из консоли.

Установка инструмента в репозиторий осуществляется в одну простую команду:

gitrules install

oscript-config — https://github.com/nixel2007/oscript-config

Работа с файлом конфигурации OneScript oscript.cfg

Позволяет зачитывать и устанавливать настройки приложения oscript.exe из командной строки. Этот пакет необходим для работы системы автодополнения кода по библиотекам OneScript в редакторе кода Visual Studio Code.

> oscript-config get lib.system
C:Program Files (x86)OneScriptlib

> oscript-config set lib.additional "./oscript_modules"

packman — https://github.com/oscript-library/packman

Сборка тиражных релизов конфигураций 1С:Предприятие 8.

Данное приложение позволяет автоматизировать создание поставки конфигурации, как в виде файлов поставки, так и в виде setup.exe. Дополнительно получившийся дистрибутив можно упаковать в zip-архив.

Простой пример работы:

packman load-storage С:/Хранилище1С -storage-user admin -storage-pwd pass
packman make-cf
packman МанифестПоставки.edf -out ./build -setup
packman zip-dist -in ./build -out ./dist

precommit1c — https://github.com/xDrivenDevelopment/precommit1c

Приложение для разборки внешних обработок при выполнении коммита в git.

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

precommit1c --install

precommit4onec — https://github.com/bia-tech/precommit4onec

Утилита для автоматической обработки исходных файлов конфигурации, внешних отчетов и обработок для платформы 1С:Предприятие при помещении в репозиторий git.

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

Помимо собственно разбора файлов (обычные тоже поддерживаются через v8unpack), precommit4onec содержит несколько встроенных обработчиков, "вычищяющих" код. Это, например, такие плагины как:

  • КорректировкаXMLФорм — при выполнении данного сценария, файлы описаний форм (Form.xml) проверяются на наличие задублировавшихся индексов элементов, которые образуются при объединениях. Если дубли есть, то они исправляются
  • ДобавлениеПробеловПередКлючевымиСловами — при выполнении данного сценария, в файлах модулей перед ключевыми словами добавляются отсутсвующие пробелы. На данный момент обрабатывается только ключевое слово Экспорт.
  • УдалениеЛишнихКонцевыхПробелов — при выполнении данного сценария, в файлах модулей удаляются лишние пробелы и табы в конце не пустой строки.
  • СортировкаДереваМетаданных — при выполнении данного сценария, выполняется упорядочивание объектов метаданных в дереве за исключением подсистем, они остаются в том порядке, который задал разработчик.

Установка в конкретный репозиторий проста:

precommit4onec install repo_name

Рекомендую подробно ознакомиться с README данного проекта.

scenex — https://github.com/arkuznetsov/scenex

Исполнитель сценариев, объявленных декларативно в JSON-файле.

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

Запуск:

scenex batch "./deploy_scenario.json"

Пример файла сценариев:

{
"stages": {
"Вывод справки oscript": {
"description": "Вывод справки oscript",
"tool": "oscript",
"command": ""
},
"Вывод справки deployka (команда loadcfg)": {
"description": "Вывод справки deployka",
"tool": "deployka",
"command": "help",
"params": [
"loadcfg"
]
}
}
}

vanessa-runner — https://github.com/silverbulleters/vanessa-runner

Автоматизация различных операций 1С-разработчика и dev-ops.

Приложение является большим комбайном из возможностей, частично портированных из других библиотек. Умеет разбирать и собирать файлы cf/cfe/epf/erf, упрощает запуск тестирования с помощью фреймворков Vanessa Behavior и xUnitFor1C, создавать и обновлять информационные базы, выполнять миграцию данных конфигураций, построенных на БСП, запускать синтаксический контроль с выводом результата проверки в формат jUnit, делать привязку баз к хранилищу. Полный список возможностей лучше изучать через вывод команды vrunner help. Конфигурируется через параметры командной строки, переменные среды и файл настроек в формате JSON. 

# Выполнение миграции
vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute $runnerRoot/epf/ЗакрытьПредприятие.epf --ibname /FC:Инфобаза1С
# Запуск проверки поведения с помощью фреймворка Vanessa Behavior
vrunner vanessa --settings tools/vrunner.json --ibname /FC:Инфобаза1С

vanessa-tfs — https://github.com/oscript-library/vanessa-tfs

Приложение для скачивания артефактов сборки из VSTS и TFS (2024/2024).

vanessa-tfs --user username --password password --collectionURI http://localhost:8080/tfs/Collection --project Project1 --buildId 1 --out ./artifacts.zip

Заключение

Данным обзором я постарался разом ответить на большинство вопросов вида "А есть ли библиотека/приложение для вот этого". Если вдруг готовой библиотеки не оказалось, не бойтесь писать свои и выкладывайте их на GitHub. Сообщество будет вам крайне благодарно 🙂 Обсуждение имеющихся библиотек сосредоточено в Gitter-канале EvilBeaver/oscript-library и в Issues каждой конкретной библиотеки.

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

Спасибо за внимание!

P.S. В последних релизах расширения поддержки языка 1С в VSCode появился полноценный Синтакс-Помощник по OneScript.Web и всем классам и модулям всех установленных библиотек. При наличии README в пакете выводится и он. Обновляйтесь, нажимайте ctrl-f1 и выбирайте в выпадающем меню новые разделы OneScript.Web и oscript-library. Так же не забывайте ставить пакет oscript-config для получения частичной поддержки автодополнения по модулям и классам библиотек прямо при наборе кода.

 

86 Comments

  1. artbear

    Первое впечатление — очень круто и наглядно!

    Спасибо.

    Reply
  2. 🅵🅾️🆇

    Спасибо, обязательно повнимательнее позже прочту, да и сама OneScript давно пылиться без дела.

    Первое ощущение от статьи «Python енто ти?»

    Reply
  3. nixel

    (2)

    Первое ощущение от статьи «Python енто ти?»

    если вопрос про opm, то он изначально делался с закосом под рубивский gem, а сейчас дописывается в духе npm.

    Reply
  4. Evil Beaver

    Героическая работа!

    Reply
  5. nixel

    (4) спасибо 🙂 от автора всей этой движухи это услышать особенно приятно

    Reply
  6. script

    А вызывать OneScript из 1С программно можно типа через OneScript = Новый(«OneScript»)?

    Reply
  7. nixel

    (6) на данный момент через Новый нельзя. Но можно через запустить приложение

    Reply
  8. Evil Beaver

    (6) Нет, это две независимых друг от друга программы и вызывать одну из другой можно только запуская их в явном виде.

    Но можно с небольшими допилками и при соблюдении границ применимости просто копипастить код из одной системы в другую

    Reply
  9. iolko

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

    Reply
  10. ImHunter

    Супер! Очень вовремя! Как раз начал заниматься автоматизацией сборок.

    Reply
  11. awk

    Что значит «от покинувшего нас Валерия Агеева»?

    Reply
  12. nixel

    (11) к сожалению, значит как раз то, что кажется. Валерий скончался в этом году.

    Reply
  13. awk

    (12) Огромная и невосполнимая потеря.

    Reply
  14. premierex

    (0) Не удалось осилить всего описания. Но труд, несомненно титанический: «+» .

    Есть вопрос: а поддержка работы с Windows registry имеется?

    Reply
  15. nixel

    (14) не сталкивался. Может быть Сергей Ушаков что-то копал в этом направлении (по крайней мере он делал компоненту по работе со службами Windows, а где службы, там и реестр недалеко).

    Но если мне не изменяет память, реестр физически хранится в виде файлов на диске. А файловый доступ и чтение/запись файлов есть. Библиотеки по работе с файлами ini-формата тоже есть, но, судя по всему, не в хабе.

    Reply
  16. premierex

    (15) У файлов Windows registry довольно сложный формат. Сам когда-то его изучал. Так без специальной обертки (библиотеки) работать с ними не просто. Автору проекта надо бы взять на заметку.

    Reply
  17. awk

    (16) Что мешает использовать «WScript.Shell»?

    Новый СОМОюъект(«WScript.Shell»)
    Reply
  18. Perfolenta

    Вот интересно, когда я выложу разрабатываемый мной полноценный компилятор под .net с языка похожего на 1С меня сильно заклюют? Конечно все на стадии 0 пока, но возможности OneScript уже давно перекрыты… Беспокоит только как публика встретит…

    Конечно язык отличается от 1С в связи с тем, что он типизирован и поддерживает нетовские штучки, но надеюсь программистам 1С будет очень легко с ним работать…

    Черт за язык дернул, извините, но очень уж хочется знать интересно это кому-то или нет…

    Reply
  19. karpik666

    (12) очень жаль, спасибо за информацию.

    Reply
  20. premierex

    (17) Что тогда мешает использовать в качестве сценарного движка Windows Script Host? Если всё равно придется на другом сценарном языке писать?

    Reply
  21. artbear

    (20) Код-то 1с будет, не какой-то другой.

    очень удобно и просто.

    Тем более, что примеров использования WSH для 1С полно.

    Копипаст простейший.

    Пойми — главное, что язык 1С, который мы знаем от и до, и пишем почти без Синтакс-помощника 🙂

    Reply
  22. artbear

    (18) Уже есть реализации и для Go, но что-то не взлетает 🙂

    Были и другие реализации, похожего на 1С-языка, не удачны.

    Например, один из авторов такой реализации (Сергей Батанов) сейчас активнейший разработчик как раз OneScript 🙂

    Вся фишка именно в совместимости с языком 1С, чтобы минимум расхождений.

    Reply
  23. artbear

    (18)

    но возможности OneScript уже давно перекрыты

    Вот тут бы поаккуратнее 🙂

    Какие Ваши доказательства? (с)

    Reply
  24. Evil Beaver

    (18) В принципе, да, не так давно появился проект Гонец, но про него ничего сказать не могу, не запускал. Меня больше волнует другой момент: зачем сообществу несколько несовместимых движков? Даже если все другие будут лучше чем 1Script, то чем они будут лучше друг-друга? Это напоминает зарю становления браузеров. Последствия расхлебываем до сих пор.

    Я точно клевать не буду, обещаю, но делать еще одно такое же, но другое — сомнительная идея.

    Ну и да, наша лицензия MPL2 все-таки запрещает прямую копипасту в закрытые проекты.

    Reply
  25. Perfolenta

    (23) пока нет доказательств, еще месяца три по моим подсчетам до релиза альфы.. приблизительно… но сравнение не совсем корректное, конечно, т.к. у меня компилятор, а тут скриптовый движок, т.е. назначение не по всем пунктам может пересекаться…

    говорю же, черт за язык дернул… проболтался раньше времени… фальстарт… 🙂

    Reply
  26. Perfolenta

    (24) я согласен с вами, на счет того, что в разнос пускать не желательно… но все же у меня компилятор, а у вас скриптовый движок, это разные ниши, хотя и пересекающиеся… вот и мозгую над тем, как бы сделать большую совместимость…

    Reply
  27. Perfolenta

    (24)

    проект Гонец

    посмотрел проект Гонец… у него конечно особая ниша, он возможно понравится тем кто одновременно пишет на 1С и GO…. цитата: «позволяет создавать высокопроизводительные вэб-приложения и микросервисы, с низким треббованием к системным ресурсам». Т.е. позиционирует себя не так, как 1Скрипт и вряд ли пересечется из-за завязанности на GO…

    А я круче замахнулся и не факт, что сдюжу :)… у меня фактически конкурент C# и VB.Net намечается 🙂 шучу…

    Reply
  28. nixel

    (26) я видимо чего-то не знаю, но с каких пор на c# можно писать что-то компилируемое? .Net runtime же все равно нужен, CLR и прочее.

    Reply
  29. lustin

    (18) история с WScript.Sheell мы уже проходили — ключевое слово «Серый кардинал» http://forum.script-coding.com/viewtopic.php?id=2496

    По ссылке можно внезапно обнаружить никнейм artbear и неизбежное ИМХО в постах.

    Почему отказались и переросли — можно долго диccкутировать, но EvilBEaver в статье на ХабраХабр немного затронул эту тему в своей статье https://habrahabr.ru/post/301064/

    1Script — автоматиматизация русскокодирующих программистов бех холиваров какой скриптовый язык выбрать… и главное кроссплатформенный

    (20) не заклюём, но лично я НЕ пойму — опять же советую обратить внимание на всех нас… после появления 1Script большинство из нас выбросило свои поделки (вы когда-нибудь видел Groovy на русском ?) и начали решать свои задачи с помощью экосистемы.

    зачем надо пилить Гонец — мне не понятно, можно было эти силы направить на доработку v8unpack и на доработку движка и сразу получить все плюшки и уважуху.

    то же самое касается и вашего будущего продукта — зачем ? почему это время не потратить на форк и pull-request ?

    Электронная подпись коммита на GitHub теперь позволяет четко видеть вклад каждого… По крайней мере за перебивкой копирайтов вроде как никто не был замечен.

    P.S. все опечатки сделаны сознательно для эффффекта.

    P.S. (24) повторюсь — попробуйте сделать функциональность которую вам нужно на 1Script — быстрей получите благодарных бета-тестеров.

    Reply
  30. lustin

    (28) чую я там может быть Kotlin, а не C#

    Reply
  31. Infactum

    (29) По вашей логике можно было не тратить силы на 1Script а пользоваться Python. Много базового функционала, написанного для 1Script, не пришлось бы делать с нуля. Это я не холивара ради 🙂

    И про мантру «русскоговорящие» программисты не могут / не хотят изучать другой язык (путь даже очень простой) помню. Но за таких «программистов», честно говоря, стыдно.

    Но как известно, сослагательного наклонения в истории нет, так что спасибо всем активным разработчикам 1Script за инструменты решения некоторых повседневных задач.

    Reply
  32. baton_pk

    (18)

    но возможности OneScript уже давно перекрыты

    работа с конфигуратором? гитсинк? Если да, то с удовольствием бы посмотрел!

    когда я выложу разрабатываемый мной полноценный компилятор под .net с языка похожего на 1С

    я немножко потроллю, но пока вы там его втихаря в одиночку разрабатываете, тот же самый ОдноСкрипт может уже вас опередить на этом поприще 😉

    Reply
  33. baton_pk

    (28)

    .Net runtime же все равно нужен, CLR и прочее.

    нынче это тоже считается компиляцией. В противовес интерпретации, когда каждый раз бегаешь именно по исходникам. Так-то ОднСкрипт тоже компилируется в свой байткод.

    Reply
  34. awk

    (18) В чем будет изюминка? Если отличия надо изучать, то не проще будет взять другой существующий язык?

    Reply
  35. premierex

    (21) Это-то я как раз понял. Но если код 1С, то почему бы не сделать обертку над некоторыми функциями WSH, чтобы не было копипаста, а был понятный для нас всех язык 1С? С регулярными выражениями та же история. Тоже использовать РегулярноеВыражение = Новый COMОбъект(«VBScript.RegExp»);?

    Reply
  36. baton_pk

    (35) регулярки есть : http://oscript.io/syntax/page/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0­%BD%D0%BE%D0%B5%D0%92%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0­%B8%D0%B5

    обёртку над WSH можно сделать, просто никому до сих пор это, видимо, не понадобилось.

    Reply
  37. artbear

    (35) У нас 1скрипт — это кроссплатформенный движок.

    Регулярки будут работать не только в Винде, но и в Линуксе.

    В отличие от WSH

    Reply
  38. baton_pk

    (37)

    1скрипт — это кроссплатформенный движок.

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

    Reply
  39. Perfolenta

    (28) да, вы не в курсе… C# компилирует в IL, но при первом запуске программы IL компилируется в машинный код JIT компилятором… т.е. реально работает машинный код. CLR это как бы окружение работающей программы, т.е. разного рода внешний по отношению к программе код, выполняющий разные служебные действия… ну и набор базовых библиотек заодно… JIT компилятор связывает CLR и вашу программу в одно целое…

    Reply
  40. Perfolenta

    (32) я писал только про возможности языка, но не про библиотеки… и я не оспариваю ценность OneScript… в конце концов живут же вместе Java и JavaScript, Vb.Net и Vb.Script… и каждому находится свое применение… языков много именно потому, что каждый кому-то приглянулся… и Microsoft сделала великую вещь, позволив языкам работать сообща, особенно после выхода на кроссплатформенность…

    Reply
  41. baton_pk

    (40)

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

    а, ну тут не хитро дело переплюнуть 🙂

    Reply
  42. Perfolenta

    (34)

    В чем будет изюминка? Если о

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

    Изюминка только в том, что программисту 1С становится доступным весь функционал .Net…

    Например, такое вот:

    ИмпортИмен System.Collections.Generic

    Словарь = Новый Dictionary<Строка,Целое>{{«ключ1»,1},{«ключ2»,2}}

    уже можно свою dll написать и потом хоть в C# ее используй, хоть в 1С…

    думаю найдется применение…

    Reply
  43. Perfolenta

    (41) к сожалению, оказалось, что чем дальше в лес, тем больше дров… когда стал делать классы, интерфейсы, перечисления и т.д., то свет в конце тоннеля несколько потускнел… но через годик прояснился… еще месяца три и выложу на обозрение… а пока благодарен всем, кто написал пару слов… уже понятно, что какой-то интерес будет…

    Reply
  44. awk

    (42)

    Словарь = Новый Dictionary{{«ключ1»,1},{«ключ2»,2}}

    Данную конструкцию можно и сейчас написать в C#. И все будет работать. В чем смысл? Почему не взять C#?

    Например: Есть java, а есть groovy. Groovy позволяет писать программы гораздо быстрее за счет сокращения количества строк кода.

    В чем же преимущества вашего языка?

    Reply
  45. Perfolenta

    (44)

    Groovy позволяет писать программы гораздо быстрее за счет сокращения количества строк кода.

    но, тем не менее, на него почему-то все толпой не побежали… люди продолжают писать на десятках других языков… и причин этому много… мне, например, нравится писать на родном языке, что бы там не говорили другие… сейчас у меня такой возможности нет, точнее у меня уже есть :), а как решу, что уже можно в народ пустить, то и еще у кого-нибудь появится, надеюсь месяца за три достаточно отладить…

    вместо Dictionary надо было конечно написать Соответсвие, это я просто из теста скопировал, когда Соответствия у меня еще не было…

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

    Reply
  46. awk

    (45) Я привел пример «изюминки». Если вы не готовы ответить на вопрос: «В чем «изюминка» вашего языка» — будучи разбуженным посреди ночи, то можете забить на то, что кто-то кроме вас будет его использовать.

    В OneScript изюминка — это похожесть до безразличия на 1С.

    Reply
  47. Perfolenta

    (46) я думаю, что изюминка OneScript в другом, он дает программисту 1С новые возможности на знакомом языке… хотя вам все равно понадобиться некоторое время на изучение, что бы начать им пользоваться… изучить новые библиотеки, подумать в каких задачах сможете использовать…

    того же пытаюсь добиться и я… например, можно написать внешнюю компоненту к 1С на знакомом языке… или написать DLL на языке 1С и отдать ее в проект на C#… или утилитку какую-нибудь быстренько написать… да мало-ли еще новых возможностей появляется… надеюсь, что народ примет, а там посмотрим…

    Reply
  48. IntelInside

    (24)

    Меня больше волнует другой момент: зачем сообществу несколько несовместимых движков?

    Ответ:

    1) Политика 1С

    2) Амбиции

    3) Проблемы монетизации

    4) Невыраженность Миссии проекта

    Можно поговорить на эти темы. Если что, то пункт «2» я перерос. Большое дело можно сделать только командой и никак иначе.

    Почему 1с++ v7 так и не дал БСП++? Бух++? и т.д.++?

    Reply
  49. IntelInside

    (47)

    Словарь = Новый Dictionary<Строка,Целое>{{«ключ1»,1},{«ключ2»,2}}

    Вы используете uniforn initialization form {..}. Это требует от русского программиста еще чаще переключать раскладку. Зачем? Вы explicity указываете типы для Dictionary. Зачем? Они могут быть выведены из строки инициализации. Хотелось бы видеть объявление типа Dictionary. И т.д. и т.п.

    По видимому вы увлечены C# и реализуете 1С#. Но язык 1С — это Бейсик. Политика 1С — это простота. Сообщество привыкло к простому языку. Разрабатывая язык Вы в первую очередь разрабатываете синтаксис. Все языки отличаются, в конечном итоге, только синтаксисом. После того, как на языке начинают писать код, синтаксис поменять становится архисложно. Это очень большая проблема.

    И вообще. На том пути по которому Вы идете расшибли лоб об стену с десяток серьезных людей. В кровь, говно и слезы расшиблись. Нужно быть очень смелым и сильным человеком, чтобы пытаться изменить мир в одиночку. Подумайте над идеей присоединиться к команде OneScript. Или… Или никогда ни с кем не советуйтесь. Это делает человека слабее. Свое видение мира в мир нужно «вбить» и он покорится.

    Удачи. Я думаю Вы сделаете правильный выбор.

    Reply
  50. Evil Beaver

    (49)

    Подумайте над идеей присоединиться к команде OneScript

    Я сознательно не подключаюсь к беседе, ибо уже высказался. И фраза взятая в цитаты попала сюда случайно и никаких намеков не делаю 😉 Но, если будет желание добавить в 1Скрипт компиляцию в байт-код MSIL — милости просим.

    Reply
  51. IntelInside

    (50)

    Хотя об очках я подумываю уже серьезно, но не настолько чтобы ‘++’ сливалось в ‘#’.

    В качестве вдохновения для будущего (ох…) JIT у меня на операционном столе LLVM (swift, WebAssemly, etc.). Еще MSIL я просто не потяну, да и не вижу смысла — MS меня уже один раз с VB6 кинул.

    Над чем я сейчас хожу кругами — это google-gRPC компонента и, соответственно, protocol-buffers compiler для 1С-бейсик. Вернее для ES Language, который видится мне развитием 1С-бейсик. С классами, функторами, плюшками и т.п.

    Я от корки до корки прочитал весь http://oscript.io , но не нашел миссии Вашего проекта. Вернее Вашего отношения к развитию языка. Вы видите OneScript исключительно классическим 1С-бейсиком? Принципиально? Тогда не удивительно, что появляются Гонец, я, ‘1С-Peleng’ и проч. Все хотят развития, а не того же самого вид с боку. Прежде чем заняться своими классами и компиляторам я много над этим думал и пришел к выводу, что это системная проблема цивилизации 1С. Угрожающая, кстати, и самой 1С и всему сообществу.

    Если Вы где-то высказывались уже на эту тему — просто киньте ссылку. Ей богу не находил.

    Спасибо.

    Reply
  52. Evil Beaver

    (51) Вот прямо так «на бумаге» миссию проекта я не формулировал. Задумался, как бы поточнее выразить… Пожалуй пока не рискну. Но для себя я ее вывел достаточно давно.

    Вы видите OneScript исключительно классическим 1С-бейсиком? Принципиально?

    Вот этой фразы не понял. Что такое «классический 1С-бейсик»?

    Reply
  53. Perfolenta

    (51) О, нашего народу полно оказывается… 🙂 Ну вот и чудно, чей-то проект возможно и даст всё то, что люди хотят от языка похожего на 1С…. я не боюсь разбить лоб об это дело, мне просто интересно его делать… конечно надеюсь, что выстрелит, но если и не выстрелит, то море удовольствия я уже получил… у меня таких программ и раньше было много, которыми только я сам пользуюсь и еще наверное будет не одна… а цели у меня такие:

    1) как можно больше русского языка;

    2) как можно больше похоже на 1С;

    3) все что можно вызвать в Net должно вызываться (отсюда разные новинки в языке, но они могут понадобиться в каких-то случаях, а значит должны быть)

    4) компилятор должен быть переписан на новом языке…

    а у вас я так понял будет LLVM? так это чудесно, пусть будет еще и это…

    Reply
  54. Perfolenta

    (49)

    Они могут быть выведены из строки инициализации

    Не факт, например, Dictionary<Ключ,Значение>{{«ключ1»,1},{«ключ2″,»2»}}, если тип Значение может инициализироваться и числом и строкой, тогда то что в строке инициализации преобразуется к нужным типам во время выполнения…

    при добавлении новых возможностей в язык я больше на VB.Net ориентируюсь, чем на C#. Но язык 1С так был сделан изначально, ключевые слова и базовые функции слизаны с VBScript, а синтаксис (точки с запятой, квадратные скобки) с JavaScript….

    Все языки отличаются, в конечном итоге, только синтаксисом.

    это сильно упрощенное суждение… тут пока названия типам придумаешь, запаришься… много из уже реализованного в языке пришлось выкинуть после рассуждений в духе бритвы Оккама… оно плодится, а ты его режешь… иногда жаль, но на инструкцию к новому языку программист 1С должен потратить не больше дня и все ухватить и запомнить… вот где задача…

    Reply
  55. Perfolenta

    (52) а я вижу миссию вашего проекта именно как «Скриптовая машина»… это самоценная миссия… во-первых, она нужна, что бы прикручивать ее как часть пользовательского интерфейса к компилируемым приложениям, во-вторых, нужна там, где основная жизнь приложения проходит на стороне программиста (админка, сайты, серверные приложения, прослойка между сетью и 1С)

    Компилируемый язык нужен для другого, для выпуска приложений в юзерский мир в готовом виде… для написания библиотек, драйверов работы с оборудованием и т.д.

    Ниши конечно не однозначны и могут пересекаться, но главное, что бы версии языка отличались не на столько, что бы между ними было трудно переключаться… ваша версия выгодно отличается минимальными расхождениями, но из-за это кое-что вам реализовать трудно, например, классы и интерфейсы ни как не впишешь не меняя язык… у меня наоборот, язык развил, а совместимость потерял… у каждой медали две стороны…

    Reply
  56. Perfolenta

    (49) вот с раскладками невезуха, нам оставили только круглые скобки… но остальные можно автозаменой в редакторе вводить… например, ёх это [, ёъ это ], ЁХ это {, ЁЪ это }, ЁБ это <, ЁЮ это >… вполне удобно получается и быстро привыкаешь… хотя ЁБ для некоторых смешно 🙂

    Reply
  57. Perfolenta

    (51)

    MS меня уже один раз с VB6 кинул

    ну почему сразу кинул? прошло 16 лет с выхода Net, но все мои программы написанные на VB6 работают отлично… и нужные библиотеки я до сих пор пишу иногда на нем… а так как он работает в Windows 10, то еще долго будет жить… так можно сказать, что 1С тоже кинул всех при переходе с 7.7 на 8… изменения тоже были драматическими, потребовавшими большого труда на переобучение…

    Reply
  58. lustin

    (51) «прям миссия» — вот скажите… предположим такую ситуацию.

    * в Гиттере объявляется кличЬ — давайте сформулируем миссию.

    * наверное мы создадим ГуглоДокс где коллективно накидаем тезисы

    * дальше путем римского голосования выберем наиболее удачные формулировки

    и вот в репозиторий https://github.com/EvilBeaver/oscriptiocontent поехал пул-реквест с «МИССИЕЙ!!!»

    и вдруг, внезапно, OScript начал покорять мир… ни один 1С специалист больше не использует мышку для рутинных операций… ВСЁ автоматизировано. Количество библиотек превышает милион-сто-пятсот тысяч — движок стал быстрей в 800 раз, все поставили себе VSCode…

    Сегодня я в развитие такой ситуации верю… НО

    * тут надо отладить поведение WCF под Mono и пофиксить его работу в ночной сборке

    * нужно реализовать 3 библиотеки для PG — а то последний 9.6.5 прям просится на автоматизацию администрирования

    * <еще 100 issue>

    Как-то так… Формальные лендинг пейджЫ с миссиями наверное важны, но насколько я понимаю — сейчас приоритет на развитие экосистемы библиотек и компонентов.

    (52) но на досуге кстати покреативть можно…

    Reply
  59. lustin

    (31) тут давеча я подсмотрел тезис… делюсь

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

    этот тезис подсмотрен у товарищей из WSO2 — они там сплошь индусы, тайцы и комбоджийцы пишушие на Java.

    обратная сторона этого подхода ровно одна — огромная кодовая база на английском и огромная экосистема jar файлов/библиотек.

    для ускорения эти товарищи не пишут с нуля а пробрасывают вызовы в свой новый «интеграционно-ориентированный» язык из чистой Java…

    что очень напоминает подход в 1Script

    Reply
  60. KAV2

    (51)

    Все хотят развития, а не того же самого вид с боку.

    А есть ли смысл изменять язык уходя от стандарта вендора? Если уж менять язык координально, то проще всего выбрать другой язык и программировать на нем: Python, C#, TypeScript…

    Reply
  61. milanse

    Вижу на инфостарте много пиара на тему OneScript и это хорошо. При главном достоинстве — почти полной совместимости с 1С, уже много статей с пошаговыми примерами настройки рабочего окружения. Готовые простые кейсы по использованию как самого языка так и библиотек. А самое главное — все это опенсорс. По моему мнению 1С именно на открытости кода и вырос (не в части платформы, а в части конфигураций, конечно), чего и OneScript желаю.

    Сам озаботился автоматизацией работы по обновлению конфигурации, выбрал для этого OneScript + библиотеки. Что-то из библиотек подошло сразу, то чего нет — доработал / поправил, отправил пул реквесты. Все это с низким порогом вхождения — прочитал пару статей на инфостарте + исходники. Пару недель мучений проб и ошибок в свободное время и вот в ТимСити зелененькая галочка напротив задачи по обновлению продуктива.

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

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

    Reply
  62. KAV2

    (42) А почему просто не писать на C#?

    Reply
  63. IntelInside

    (60) Как-то кардинально изменять язык у меня и в мыслях не было. На 1С-бейсике уже написаны миллионы строе кода. Если бог даст и что-то получится, то только надмножество языка 1С. Т.е. любой код на 1С-бейсике будет оставаться корректным кодом. Как для TypeScript любой JavaScript остается корректным. Вообще между 1С-бейсиком и JavaScript много общего. Они пытаются решить одну задачу и проходят по одним и тем же граблям. Только JavaScript впереди. Путь следующий: а) сделать язык очень-очень простым, чтобы каждая домохозяйка могла себе написать сайт бухгалтерию; б) наваракозить на этом очень-очень простом языке целый ангуляр ЕРП; б) завыть матерно от 1005000 строк плохо структуированного и с трудом поддерживаемого кода; в) придумать TypeScript и все переписать. Нет другого пути. В 90-х прошлого века при переходе с С на С++ было то же самое. Либо вендор сам это сделает, либо я, либо еще кто-то, но это будет. Лучше бы, конечно, чтобы в самой 1С разум проснулся.

    Reply
  64. Perfolenta

    (62) Если вы уже владеете C#, то пишите на нем… C# в любом случае круче… тут же дело добровольное… а если не владеете, то порог входа надеюсь будет ниже на языке похожем на 1С… кому понравится на новом языке, тот и будет на нем что-то писать… есть такое понятие энтузиасты… если их найдется достаточное количество, то и экосистема языка быстро появится и плюшки с фишками… а нет так нет… провал, неудача и т.д. я отношусь к этому философски… без неудач не бывает… но раз я делаю язык, значит мне самому он нравится, т.е. я первый энтузиаст и есть… уже скоро выяснится будут ли другие… планирую альфа релиз к 8 марта…

    Reply
  65. Perfolenta

    (61)

    Получится ли у вас продвинуть продукт и втолковать прелести изменений языка «тупым одинесникам» ?

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

    Reply
  66. milanse

    (65) У OneScript уже есть сообщество, в этом его сила. Можно начинать пытаться перетащить часть участников их в свою разработку

    Reply
  67. Perfolenta

    (66) согласен, но ведь еще недавно его не было… возможно так же будет и с моим языком, сообщество возникнет, надеюсь… я ни кого не хочу перетаскивать, я бы мечтал о синергии… как сосуществуют VB и VBScript, Java и JavaScript, так, надеюсь смогут сосуществовать OneScript и мой компилируемый «аналог» (окончательного названия пока нет)…

    Reply
  68. artbear

    (67) OneScript взлетел, потому что мы начали активно применять его в своей работе и делясь результатами с соседями, коллегами, интернетом.

    Без использование в работе ничего не выйдет.

    Reply
  69. Perfolenta

    (68) ну, пользоваться то вы начали потому, что сама идея понравилась… скажу о себе, писать код по-русски для меня быстрее и приятнее даже не смотря на то, что до появления 1С 7.5 я уже почти 10 лет по-английски программировал и с тех пор тоже не прекращал… навыки быстрого чтения на родном языке позволяют так же быстро читать код, хоть чужой, хоть свой собственный… а технологии распознавания речи уже позволяют его диктовать, хотя и не слишком удобно пока, но всяко удобнее, чем на не родном языке…

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

    Reply
  70. mister_tula

    А есть ли решение для организации резервного копирования для файловой или sql (postgres) ?

    Reply
  71. Berckk

    (70) Есть же в статье https://infostart.ru/public/672461/ SQL

    Или cpdb — https://github.com/arkuznetsov/cpdb (Приложение-комбайн по работе базой данных в файловом формате и MS SQL Server.)

    Reply
  72. mister_tula

    Ну да, cpdb позволяет делать копии, но только MS. Первый вариант вообще не об этом. Интересно, есть ли решения для postgres?

    Reply
  73. nixel

    (72) для постгреса есть куча консольных утилит в коробке самого постгреса. файловая без проблем выгружается через vunessa-runner (скапитаню про «не надо делать dt, если у вас скульная база»)

    Reply
  74. mirco

    Вопрос:

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

    Как все это собрать в exe ?

    #Использовать «/относительный путь к библиотекам/»

    делаем make

    и раскладываю dll и скрипты библиотек в каталог с готовым exe (а потом все собираю в инсталятор)?

    Reply
  75. mirco

    (73)

    может подскажите алгоритм сборки в один файл ?

    Reply
  76. baton_pk

    (75)

    сборка в exe очень ограниченна в своих возможностях. Если используются DLL, то сборка работать не будет. Если используются ещё какие-либо внешние файлы — сборка работать не будет.

    В собранный exe будут включены только OS-файлы.

    Reply
  77. mirco

    (76)

    Спасибо.

    А есть идеи как хранить пароли внутри так, чтобы их нельзя было прочитать ?

    Reply
  78. baton_pk

    (77)

    А есть идеи как хранить пароли внутри так, чтобы их нельзя было прочитать ?

    есть идея, что это невозможно. Любой спрятанный пароль с ненулевой вероятностью можно вынуть.

    Reply
  79. Vladimir45
    ftp — https://github.com/dmpas/oscript-ftp

    FTP-клиент для OneScript.

    Имя библиотеки говорит само за себя — работа с файлами по протоколу ftp.

    Ругается на отсутствие длл в пакете. Где найти?

    Reply
  80. nixel

    (79) ставили через opm или просто скачивали zip с гитхаба?

    Reply
  81. Vladimir45

    (80) просто скачивал зип

    Reply
  82. nixel

    (81) значит, надо собрать ее из исходников с помощью Visual Studio 🙂

    поставьте ее через opm, установится готовый к использованию пакет со скомпилированной dll.

    Reply
  83. nixel

    Статья обновлена вышедшими за прошедший год пакетами.

    Добавленные в статью библиотеки:

    * add

    * cli

    * ClientSSH

    * configor

    * coverage

    * datetime

    * entity

    * irac

    * markdown

    * moskito

    * RabbitMQ

    * reflector

    * semver

    * telegrambot

    * TLog

    * TMail

    * TMSSQL

    * TRun1C

    * verbal-expressions

    * xml-parser

    * yaml

    Добавленные в статью приложения:

    * autodocgen

    * changelog-generate

    * gitrules

    * precommit4onec

    * vanessa-tfs

    Reply
  84. KAV2

    (83) Еще можно дополнить статью тем, что в текущей версии движка появились методы ПрочитатьJson и ЗаписатьJson.

    Reply
  85. kwazi
    Обсуждение имеющихся библиотек сосредоточено в Gitter-канале EvilBeaver/oscript-library и в Issues каждой конкретной библиотеки.

    Канал переехал в Телеграм.

    Reply

Leave a Comment

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