Введение
Для начала разберемся с терминами.
Тем, кто не знает, что такое OneScript, стоит познакомится с первой вводной статьей от самого автора Как решать повседневные задачи с помощью OneScript и с сайтом проекта OneScript. На Инфостарте недавно появилось несколько хороших статей на тему "быстрого старта".
Как только скриптописатель выходит за рамки Сообщить("Привет, мир!") и начинает решать прикладные задачи, у него появляется желание найти какие-то готовые куски кода или целиком разработанную функциональность. Большинство полезных скриптов упаковывается в так называемые пакеты, упрощающие установку этих скриптов на локальную машину и их последующее использование.
Все пакеты делятся на два типа:
- Библиотеки, подключаемые в скрипты через директиву #Использовать и добавляющие разные полезные классы и модули
- и Приложения, которые помимо реализованной на OneScript логики имеют специальные обертки запуска из командной строки (cmd/sh). Часть приложений помимо запуска из командной строки позволяют себя подключать через #Использовать (т.е. как библиотеки), но это скорее бонус и желание разработчика приложения, чем возможность, на которую всегда можно надеяться.
Все более-менее работающие и известные пакеты собраны в двух местах:
- Организация oscript-library на github.com — https://github.com/oscript-library — содержит оригиналы или форки репозиториев, в которых ведется разработка пакетов. Там лежит весь исходный код, чаще всего там же находится и баг-трекер.
- Собранные пакеты выложены на специальном хабе пакетов 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
Библиотека для создания временных файлов и каталогов.
Отличительной особенностью является создание файлов в некоторых "пулах", которые можно разом удалить методом ВременныеФайлы.Удалить(). Имеет два режима работы:
- Модуль ВременныеФайлы предоставляет общий пул временных файлов среди всех используемых скриптов
- Инициализация класса МенеджерВременныхФайлов создаст отдельный пул файлов, которым можно управлять независимо от всех остальных пулов.
ВременныйФайл = ВременныеФайлы.СоздатьФайл();
ВторойВременныйФайл = ВременныеФайлы.СоздатьФайл();
// мой очень полезный код
ВременныеФайлы.Удалить(); // удалит оба созданных временных файла
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 для получения частичной поддержки автодополнения по модулям и классам библиотек прямо при наборе кода.
Первое впечатление — очень круто и наглядно!
Спасибо.
Спасибо, обязательно повнимательнее позже прочту, да и сама OneScript давно пылиться без дела.
Первое ощущение от статьи «Python енто ти?»
(2)
если вопрос про opm, то он изначально делался с закосом под рубивский gem, а сейчас дописывается в духе npm.
Героическая работа!
(4) спасибо 🙂 от автора всей этой движухи это услышать особенно приятно
А вызывать OneScript из 1С программно можно типа через OneScript = Новый(«OneScript»)?
(6) на данный момент через Новый нельзя. Но можно через запустить приложение
(6) Нет, это две независимых друг от друга программы и вызывать одну из другой можно только запуская их в явном виде.
Но можно с небольшими допилками и при соблюдении границ применимости просто копипастить код из одной системы в другую
Автору, респект. В пользуюсь давно уже многими пакетами, нереально упрощает жизнь. Переписал все свои наработки по автоматизации на односкрип, с vbs. Работа с каждым релизом становиться все более комфортной. Ошибки исправляются просто на лету.
Супер! Очень вовремя! Как раз начал заниматься автоматизацией сборок.
Что значит «от покинувшего нас Валерия Агеева»?
(11) к сожалению, значит как раз то, что кажется. Валерий скончался в этом году.
(12) Огромная и невосполнимая потеря.
(0) Не удалось осилить всего описания. Но труд, несомненно титанический: «+» .
Есть вопрос: а поддержка работы с Windows registry имеется?
(14) не сталкивался. Может быть Сергей Ушаков что-то копал в этом направлении (по крайней мере он делал компоненту по работе со службами Windows, а где службы, там и реестр недалеко).
Но если мне не изменяет память, реестр физически хранится в виде файлов на диске. А файловый доступ и чтение/запись файлов есть. Библиотеки по работе с файлами ini-формата тоже есть, но, судя по всему, не в хабе.
(15) У файлов Windows registry довольно сложный формат. Сам когда-то его изучал. Так без специальной обертки (библиотеки) работать с ними не просто. Автору проекта надо бы взять на заметку.
(16) Что мешает использовать «WScript.Shell»?
Вот интересно, когда я выложу разрабатываемый мной полноценный компилятор под .net с языка похожего на 1С меня сильно заклюют? Конечно все на стадии 0 пока, но возможности OneScript уже давно перекрыты… Беспокоит только как публика встретит…
Конечно язык отличается от 1С в связи с тем, что он типизирован и поддерживает нетовские штучки, но надеюсь программистам 1С будет очень легко с ним работать…
Черт за язык дернул, извините, но очень уж хочется знать интересно это кому-то или нет…
(12) очень жаль, спасибо за информацию.
(17) Что тогда мешает использовать в качестве сценарного движка Windows Script Host? Если всё равно придется на другом сценарном языке писать?
(20) Код-то 1с будет, не какой-то другой.
очень удобно и просто.
Тем более, что примеров использования WSH для 1С полно.
Копипаст простейший.
Пойми — главное, что язык 1С, который мы знаем от и до, и пишем почти без Синтакс-помощника 🙂
(18) Уже есть реализации и для Go, но что-то не взлетает 🙂
Были и другие реализации, похожего на 1С-языка, не удачны.
Например, один из авторов такой реализации (Сергей Батанов) сейчас активнейший разработчик как раз OneScript 🙂
Вся фишка именно в совместимости с языком 1С, чтобы минимум расхождений.
(18)
Вот тут бы поаккуратнее 🙂
Какие Ваши доказательства? (с)
(18) В принципе, да, не так давно появился проект Гонец, но про него ничего сказать не могу, не запускал. Меня больше волнует другой момент: зачем сообществу несколько несовместимых движков? Даже если все другие будут лучше чем 1Script, то чем они будут лучше друг-друга? Это напоминает зарю становления браузеров. Последствия расхлебываем до сих пор.
Я точно клевать не буду, обещаю, но делать еще одно такое же, но другое — сомнительная идея.
Ну и да, наша лицензия MPL2 все-таки запрещает прямую копипасту в закрытые проекты.
(23) пока нет доказательств, еще месяца три по моим подсчетам до релиза альфы.. приблизительно… но сравнение не совсем корректное, конечно, т.к. у меня компилятор, а тут скриптовый движок, т.е. назначение не по всем пунктам может пересекаться…
говорю же, черт за язык дернул… проболтался раньше времени… фальстарт… 🙂
(24) я согласен с вами, на счет того, что в разнос пускать не желательно… но все же у меня компилятор, а у вас скриптовый движок, это разные ниши, хотя и пересекающиеся… вот и мозгую над тем, как бы сделать большую совместимость…
(24)
посмотрел проект Гонец… у него конечно особая ниша, он возможно понравится тем кто одновременно пишет на 1С и GO…. цитата: «позволяет создавать высокопроизводительные вэб-приложения и микросервисы, с низким треббованием к системным ресурсам». Т.е. позиционирует себя не так, как 1Скрипт и вряд ли пересечется из-за завязанности на GO…
А я круче замахнулся и не факт, что сдюжу :)… у меня фактически конкурент C# и VB.Net намечается 🙂 шучу…
(26) я видимо чего-то не знаю, но с каких пор на c# можно писать что-то компилируемое? .Net runtime же все равно нужен, CLR и прочее.
(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 — быстрей получите благодарных бета-тестеров.
(28) чую я там может быть Kotlin, а не C#
(29) По вашей логике можно было не тратить силы на 1Script а пользоваться Python. Много базового функционала, написанного для 1Script, не пришлось бы делать с нуля. Это я не холивара ради 🙂
И про мантру «русскоговорящие» программисты не могут / не хотят изучать другой язык (путь даже очень простой) помню. Но за таких «программистов», честно говоря, стыдно.
Но как известно, сослагательного наклонения в истории нет, так что спасибо всем активным разработчикам 1Script за инструменты решения некоторых повседневных задач.
(18)
работа с конфигуратором? гитсинк? Если да, то с удовольствием бы посмотрел!
я немножко потроллю, но пока вы там его втихаря в одиночку разрабатываете, тот же самый ОдноСкрипт может уже вас опередить на этом поприще 😉
(28)
нынче это тоже считается компиляцией. В противовес интерпретации, когда каждый раз бегаешь именно по исходникам. Так-то ОднСкрипт тоже компилируется в свой байткод.
(18) В чем будет изюминка? Если отличия надо изучать, то не проще будет взять другой существующий язык?
(21) Это-то я как раз понял. Но если код 1С, то почему бы не сделать обертку над некоторыми функциями WSH, чтобы не было копипаста, а был понятный для нас всех язык 1С? С регулярными выражениями та же история. Тоже использовать РегулярноеВыражение = Новый COMОбъект(«VBScript.RegExp»);?
(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 можно сделать, просто никому до сих пор это, видимо, не понадобилось.
(35) У нас 1скрипт — это кроссплатформенный движок.
Регулярки будут работать не только в Винде, но и в Линуксе.
В отличие от WSH
(37)
это не мешает людям пилить сторонние библиотеки, завязанные на винду.
(28) да, вы не в курсе… C# компилирует в IL, но при первом запуске программы IL компилируется в машинный код JIT компилятором… т.е. реально работает машинный код. CLR это как бы окружение работающей программы, т.е. разного рода внешний по отношению к программе код, выполняющий разные служебные действия… ну и набор базовых библиотек заодно… JIT компилятор связывает CLR и вашу программу в одно целое…
(32) я писал только про возможности языка, но не про библиотеки… и я не оспариваю ценность OneScript… в конце концов живут же вместе Java и JavaScript, Vb.Net и Vb.Script… и каждому находится свое применение… языков много именно потому, что каждый кому-то приглянулся… и Microsoft сделала великую вещь, позволив языкам работать сообща, особенно после выхода на кроссплатформенность…
(40)
а, ну тут не хитро дело переплюнуть 🙂
(34)
к сожалению, отличия надо будет изучать, но они не велики и связаны в основном тем, что язык будет типизированным…
Изюминка только в том, что программисту 1С становится доступным весь функционал .Net…
Например, такое вот:
ИмпортИмен System.Collections.Generic
Словарь = Новый Dictionary<Строка,Целое>{{«ключ1»,1},{«ключ2»,2}}
уже можно свою dll написать и потом хоть в C# ее используй, хоть в 1С…
думаю найдется применение…
(41) к сожалению, оказалось, что чем дальше в лес, тем больше дров… когда стал делать классы, интерфейсы, перечисления и т.д., то свет в конце тоннеля несколько потускнел… но через годик прояснился… еще месяца три и выложу на обозрение… а пока благодарен всем, кто написал пару слов… уже понятно, что какой-то интерес будет…
(42)
Данную конструкцию можно и сейчас написать в C#. И все будет работать. В чем смысл? Почему не взять C#?
Например: Есть java, а есть groovy. Groovy позволяет писать программы гораздо быстрее за счет сокращения количества строк кода.
В чем же преимущества вашего языка?
(44)
но, тем не менее, на него почему-то все толпой не побежали… люди продолжают писать на десятках других языков… и причин этому много… мне, например, нравится писать на родном языке, что бы там не говорили другие… сейчас у меня такой возможности нет, точнее у меня уже есть :), а как решу, что уже можно в народ пустить, то и еще у кого-нибудь появится, надеюсь месяца за три достаточно отладить…
вместо Dictionary надо было конечно написать Соответсвие, это я просто из теста скопировал, когда Соответствия у меня еще не было…
И, кстати, я тоже придумал немного фишек для сокращения строк кода по сравнению с языком 1С от которого естественно отталкивался…. однако, за годы программирования на языке 1С я уже привык, что «многа букаф» это даже хорошо, особенно в свете появления хороших распознавателей речи… сейчас можно код диктовать, а делать это удобнее полными словами, чем разными значками и символами…
(45) Я привел пример «изюминки». Если вы не готовы ответить на вопрос: «В чем «изюминка» вашего языка» — будучи разбуженным посреди ночи, то можете забить на то, что кто-то кроме вас будет его использовать.
В OneScript изюминка — это похожесть до безразличия на 1С.
(46) я думаю, что изюминка OneScript в другом, он дает программисту 1С новые возможности на знакомом языке… хотя вам все равно понадобиться некоторое время на изучение, что бы начать им пользоваться… изучить новые библиотеки, подумать в каких задачах сможете использовать…
того же пытаюсь добиться и я… например, можно написать внешнюю компоненту к 1С на знакомом языке… или написать DLL на языке 1С и отдать ее в проект на C#… или утилитку какую-нибудь быстренько написать… да мало-ли еще новых возможностей появляется… надеюсь, что народ примет, а там посмотрим…
(24)
Ответ:
1) Политика 1С
2) Амбиции
3) Проблемы монетизации
4) Невыраженность Миссии проекта
Можно поговорить на эти темы. Если что, то пункт «2» я перерос. Большое дело можно сделать только командой и никак иначе.
Почему 1с++ v7 так и не дал БСП++? Бух++? и т.д.++?
(47)
Словарь = Новый Dictionary<Строка,Целое>{{«ключ1»,1},{«ключ2»,2}}
Вы используете uniforn initialization form {..}. Это требует от русского программиста еще чаще переключать раскладку. Зачем? Вы explicity указываете типы для Dictionary. Зачем? Они могут быть выведены из строки инициализации. Хотелось бы видеть объявление типа Dictionary. И т.д. и т.п.
По видимому вы увлечены C# и реализуете 1С#. Но язык 1С — это Бейсик. Политика 1С — это простота. Сообщество привыкло к простому языку. Разрабатывая язык Вы в первую очередь разрабатываете синтаксис. Все языки отличаются, в конечном итоге, только синтаксисом. После того, как на языке начинают писать код, синтаксис поменять становится архисложно. Это очень большая проблема.
И вообще. На том пути по которому Вы идете расшибли лоб об стену с десяток серьезных людей. В кровь, говно и слезы расшиблись. Нужно быть очень смелым и сильным человеком, чтобы пытаться изменить мир в одиночку. Подумайте над идеей присоединиться к команде OneScript. Или… Или никогда ни с кем не советуйтесь. Это делает человека слабее. Свое видение мира в мир нужно «вбить» и он покорится.
Удачи. Я думаю Вы сделаете правильный выбор.
(49)
Я сознательно не подключаюсь к беседе, ибо уже высказался. И фраза взятая в цитаты попала сюда случайно и никаких намеков не делаю 😉 Но, если будет желание добавить в 1Скрипт компиляцию в байт-код MSIL — милости просим.
(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С и всему сообществу.
Если Вы где-то высказывались уже на эту тему — просто киньте ссылку. Ей богу не находил.
Спасибо.
(51) Вот прямо так «на бумаге» миссию проекта я не формулировал. Задумался, как бы поточнее выразить… Пожалуй пока не рискну. Но для себя я ее вывел достаточно давно.
Вот этой фразы не понял. Что такое «классический 1С-бейсик»?
(51) О, нашего народу полно оказывается… 🙂 Ну вот и чудно, чей-то проект возможно и даст всё то, что люди хотят от языка похожего на 1С…. я не боюсь разбить лоб об это дело, мне просто интересно его делать… конечно надеюсь, что выстрелит, но если и не выстрелит, то море удовольствия я уже получил… у меня таких программ и раньше было много, которыми только я сам пользуюсь и еще наверное будет не одна… а цели у меня такие:
1) как можно больше русского языка;
2) как можно больше похоже на 1С;
3) все что можно вызвать в Net должно вызываться (отсюда разные новинки в языке, но они могут понадобиться в каких-то случаях, а значит должны быть)
4) компилятор должен быть переписан на новом языке…
а у вас я так понял будет LLVM? так это чудесно, пусть будет еще и это…
(49)
Не факт, например, Dictionary<Ключ,Значение>{{«ключ1»,1},{«ключ2″,»2»}}, если тип Значение может инициализироваться и числом и строкой, тогда то что в строке инициализации преобразуется к нужным типам во время выполнения…
при добавлении новых возможностей в язык я больше на VB.Net ориентируюсь, чем на C#. Но язык 1С так был сделан изначально, ключевые слова и базовые функции слизаны с VBScript, а синтаксис (точки с запятой, квадратные скобки) с JavaScript….
это сильно упрощенное суждение… тут пока названия типам придумаешь, запаришься… много из уже реализованного в языке пришлось выкинуть после рассуждений в духе бритвы Оккама… оно плодится, а ты его режешь… иногда жаль, но на инструкцию к новому языку программист 1С должен потратить не больше дня и все ухватить и запомнить… вот где задача…
(52) а я вижу миссию вашего проекта именно как «Скриптовая машина»… это самоценная миссия… во-первых, она нужна, что бы прикручивать ее как часть пользовательского интерфейса к компилируемым приложениям, во-вторых, нужна там, где основная жизнь приложения проходит на стороне программиста (админка, сайты, серверные приложения, прослойка между сетью и 1С)
Компилируемый язык нужен для другого, для выпуска приложений в юзерский мир в готовом виде… для написания библиотек, драйверов работы с оборудованием и т.д.
Ниши конечно не однозначны и могут пересекаться, но главное, что бы версии языка отличались не на столько, что бы между ними было трудно переключаться… ваша версия выгодно отличается минимальными расхождениями, но из-за это кое-что вам реализовать трудно, например, классы и интерфейсы ни как не впишешь не меняя язык… у меня наоборот, язык развил, а совместимость потерял… у каждой медали две стороны…
(49) вот с раскладками невезуха, нам оставили только круглые скобки… но остальные можно автозаменой в редакторе вводить… например, ёх это [, ёъ это ], ЁХ это {, ЁЪ это }, ЁБ это <, ЁЮ это >… вполне удобно получается и быстро привыкаешь… хотя ЁБ для некоторых смешно 🙂
(51)
ну почему сразу кинул? прошло 16 лет с выхода Net, но все мои программы написанные на VB6 работают отлично… и нужные библиотеки я до сих пор пишу иногда на нем… а так как он работает в Windows 10, то еще долго будет жить… так можно сказать, что 1С тоже кинул всех при переходе с 7.7 на 8… изменения тоже были драматическими, потребовавшими большого труда на переобучение…
(51) «прям миссия» — вот скажите… предположим такую ситуацию.
* в Гиттере объявляется кличЬ — давайте сформулируем миссию.
* наверное мы создадим ГуглоДокс где коллективно накидаем тезисы
* дальше путем римского голосования выберем наиболее удачные формулировки
и вот в репозиторийhttps://github.com/EvilBeaver/oscriptiocontent поехал пул-реквест с «МИССИЕЙ!!!»
и вдруг, внезапно, OScript начал покорять мир… ни один 1С специалист больше не использует мышку для рутинных операций… ВСЁ автоматизировано. Количество библиотек превышает милион-сто-пятсот тысяч — движок стал быстрей в 800 раз, все поставили себе VSCode…
Сегодня я в развитие такой ситуации верю… НО
* тут надо отладить поведение WCF под Mono и пофиксить его работу в ночной сборке
* нужно реализовать 3 библиотеки для PG — а то последний 9.6.5 прям просится на автоматизацию администрирования
* <еще 100 issue>
Как-то так… Формальные лендинг пейджЫ с миссиями наверное важны, но насколько я понимаю — сейчас приоритет на развитие экосистемы библиотек и компонентов.
(52) но на досуге кстати покреативть можно…
(31) тут давеча я подсмотрел тезис… делюсь
«я тайландский программист, решаю бизнес-задачу для тайландских заказчиков совместно с тайландскими программистами… почему я должен писать код на английском».
этот тезис подсмотрен у товарищей из WSO2 — они там сплошь индусы, тайцы и комбоджийцы пишушие на Java.
обратная сторона этого подхода ровно одна — огромная кодовая база на английском и огромная экосистема jar файлов/библиотек.
для ускорения эти товарищи не пишут с нуля а пробрасывают вызовы в свой новый «интеграционно-ориентированный» язык из чистой Java…
что очень напоминает подход в 1Script
(51)
А есть ли смысл изменять язык уходя от стандарта вендора? Если уж менять язык координально, то проще всего выбрать другой язык и программировать на нем: Python, C#, TypeScript…
Вижу на инфостарте много пиара на тему OneScript и это хорошо. При главном достоинстве — почти полной совместимости с 1С, уже много статей с пошаговыми примерами настройки рабочего окружения. Готовые простые кейсы по использованию как самого языка так и библиотек. А самое главное — все это опенсорс. По моему мнению 1С именно на открытости кода и вырос (не в части платформы, а в части конфигураций, конечно), чего и OneScript желаю.
Сам озаботился автоматизацией работы по обновлению конфигурации, выбрал для этого OneScript + библиотеки. Что-то из библиотек подошло сразу, то чего нет — доработал / поправил, отправил пул реквесты. Все это с низким порогом вхождения — прочитал пару статей на инфостарте + исходники. Пару недель мучений проб и ошибок в свободное время и вот в ТимСити зелененькая галочка напротив задачи по обновлению продуктива.
Есть, конечно, вероятность, что когда-то авторам надоест разрабатывать и поддерживать продукт, но обычно это бывает к моменту достижения какого-то порога зрелости — надоело потому что все уже работает, и проект подхватывает кто-то другой, за счет того, что за время развития в него погрузилось достаточное количество разработчиков.
Пишущим свои велосипеды предлагаю обратить внимание именно на момент продвижения и популяризации ваших разработок. Я смотрю даже у 1С туго выходит пересадить разработчиков на управляемые приложения и на всякую асинхронщину — а это все в рамках одного языка и кучи типовых решений. Получится ли у вас продвинуть продукт и втолковать прелести изменений языка «тупым одинесникам» ?
(42) А почему просто не писать на C#?
(60) Как-то кардинально изменять язык у меня и в мыслях не было. На 1С-бейсике уже написаны миллионы строе кода. Если бог даст и что-то получится, то только надмножество языка 1С. Т.е. любой код на 1С-бейсике будет оставаться корректным кодом. Как для TypeScript любой JavaScript остается корректным. Вообще между 1С-бейсиком и JavaScript много общего. Они пытаются решить одну задачу и проходят по одним и тем же граблям. Только JavaScript впереди. Путь следующий: а) сделать язык очень-очень простым, чтобы каждая домохозяйка могла себе написать
сайтбухгалтерию; б) наваракозить на этом очень-очень простом языке целыйангулярЕРП; б) завыть матерно от 1005000 строк плохо структуированного и с трудом поддерживаемого кода; в) придумать TypeScript и все переписать. Нет другого пути. В 90-х прошлого века при переходе с С на С++ было то же самое. Либо вендор сам это сделает, либо я, либо еще кто-то, но это будет. Лучше бы, конечно, чтобы в самой 1С разум проснулся.(62) Если вы уже владеете C#, то пишите на нем… C# в любом случае круче… тут же дело добровольное… а если не владеете, то порог входа надеюсь будет ниже на языке похожем на 1С… кому понравится на новом языке, тот и будет на нем что-то писать… есть такое понятие энтузиасты… если их найдется достаточное количество, то и экосистема языка быстро появится и плюшки с фишками… а нет так нет… провал, неудача и т.д. я отношусь к этому философски… без неудач не бывает… но раз я делаю язык, значит мне самому он нравится, т.е. я первый энтузиаст и есть… уже скоро выяснится будут ли другие… планирую альфа релиз к 8 марта…
(61)
да кто же может ответить на такой вопрос до выхода продукта в свет… может быть сработает эффект новизны… может еще что-то из предложенного зацепит… а может провалится… но мне же самому нравится то, что я делаю, поэтому и надежда на то, что понравится другим, не умирает…
(65) У OneScript уже есть сообщество, в этом его сила. Можно начинать пытаться перетащить часть участников их в свою разработку
(66) согласен, но ведь еще недавно его не было… возможно так же будет и с моим языком, сообщество возникнет, надеюсь… я ни кого не хочу перетаскивать, я бы мечтал о синергии… как сосуществуют VB и VBScript, Java и JavaScript, так, надеюсь смогут сосуществовать OneScript и мой компилируемый «аналог» (окончательного названия пока нет)…
(67) OneScript взлетел, потому что мы начали активно применять его в своей работе и делясь результатами с соседями, коллегами, интернетом.
Без использование в работе ничего не выйдет.
(68) ну, пользоваться то вы начали потому, что сама идея понравилась… скажу о себе, писать код по-русски для меня быстрее и приятнее даже не смотря на то, что до появления 1С 7.5 я уже почти 10 лет по-английски программировал и с тех пор тоже не прекращал… навыки быстрого чтения на родном языке позволяют так же быстро читать код, хоть чужой, хоть свой собственный… а технологии распознавания речи уже позволяют его диктовать, хотя и не слишком удобно пока, но всяко удобнее, чем на не родном языке…
а в своей работе я уже свой язык использую, это позволяет находить ошибки, которые выжили после тестов, т.к. тесты на все случаи не придумаешь, жизнь богаче, а люди наверняка найдут ошибки о которых я даже теоретически не подозреваю… и на люди я его хочу вывести как можно быстрее, но совсем сырой стыдно выводить… поэтому еще месяца 2-3 буду сам отлаживать… что бы не опозорится с не работающим…. а потом назову альфа версией и рискну пойти в народ и будь что будет… как по мне, то ничего не делать хуже… даже велосипеды люди изобретают до сих пор, и иногда случаются у них очень интересные варианты…
А есть ли решение для организации резервного копирования для файловой или sql (postgres) ?
(70) Есть же в статьеhttps://infostart.ru/public/672461/ SQL
https://github.com/arkuznetsov/cpdb (Приложение-комбайн по работе базой данных в файловом формате и MS SQL Server.)
Или cpdb —
Ну да, cpdb позволяет делать копии, но только MS. Первый вариант вообще не об этом. Интересно, есть ли решения для postgres?
(72) для постгреса есть куча консольных утилит в коробке самого постгреса. файловая без проблем выгружается через vunessa-runner (скапитаню про «не надо делать dt, если у вас скульная база»)
Вопрос:
есть скрип, в нем используются библиотеки.
Как все это собрать в exe ?
#Использовать «/относительный путь к библиотекам/»
делаем make
и раскладываю dll и скрипты библиотек в каталог с готовым exe (а потом все собираю в инсталятор)?
(73)
может подскажите алгоритм сборки в один файл ?
(75)
сборка в exe очень ограниченна в своих возможностях. Если используются DLL, то сборка работать не будет. Если используются ещё какие-либо внешние файлы — сборка работать не будет.
В собранный exe будут включены только OS-файлы.
(76)
Спасибо.
А есть идеи как хранить пароли внутри так, чтобы их нельзя было прочитать ?
(77)
есть идея, что это невозможно. Любой спрятанный пароль с ненулевой вероятностью можно вынуть.
FTP-клиент для OneScript.
Имя библиотеки говорит само за себя — работа с файлами по протоколу ftp.
Ругается на отсутствие длл в пакете. Где найти?
(79) ставили через opm или просто скачивали zip с гитхаба?
(80) просто скачивал зип
(81) значит, надо собрать ее из исходников с помощью Visual Studio 🙂
поставьте ее через opm, установится готовый к использованию пакет со скомпилированной dll.
Статья обновлена вышедшими за прошедший год пакетами.
Добавленные в статью библиотеки:
* 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
(83) Еще можно дополнить статью тем, что в текущей версии движка появились методы ПрочитатьJson и ЗаписатьJson.
Канал переехал в Телеграм.