$npx -y skills add yellow-hammer/skills-onescript --skill onescriptПишет и структурирует код на OneScript (BSL без 1С). Использовать при работе с файлами .os, проектами OneScript, packagedef, opm, директивой #Использовать, классами и модулями.
| 1 | # OneScript |
| 2 | |
| 3 | Навык для написания и структурирования кода на OneScript — кроссплатформенном интерпретаторе языка 1С:Предприятие 8 без платформы 1С. Код выполняется из текстовых файлов `.os`, аналогично Python или Node.js. |
| 4 | |
| 5 | ## Структура модуля |
| 6 | |
| 7 | Модуль — текстовый файл с расширением `.os`. Три секции (сверху вниз): |
| 8 | |
| 9 | 1. **Секция переменных** — `Перем ИмяПеременной;` |
| 10 | 2. **Секция методов** — процедуры и функции |
| 11 | 3. **Секция тела модуля** — код, выполняемый при запуске (обязательно внизу файла) |
| 12 | |
| 13 | Минимальный скрипт: |
| 14 | |
| 15 | ```bsl |
| 16 | Сообщить("Привет, Мир!"); |
| 17 | ``` |
| 18 | |
| 19 | Процедуры и функции: |
| 20 | |
| 21 | ```bsl |
| 22 | Процедура МояПроцедура(Параметр1, Параметр2) |
| 23 | // операторы |
| 24 | КонецПроцедуры |
| 25 | |
| 26 | Функция МояФункция(Параметр1, Параметр2) |
| 27 | Возврат Параметр1 + Параметр2; |
| 28 | КонецФункции |
| 29 | ``` |
| 30 | |
| 31 | ## Типы и литералы |
| 32 | |
| 33 | Типизация динамическая. Примитивы: Строка, Число, Булево, Дата; специальные: Неопределено, Null. |
| 34 | |
| 35 | - Число: `12345.899` |
| 36 | - Строка: `"Текст"`, кавычка внутри — `""`. Многострочная: новая строка начинается с `|`, пробелы до `|` отбрасываются. |
| 37 | - Дата: `'20250212235959'` или `'2025-02-12 23:59:59'` |
| 38 | |
| 39 | ## Блоки кода |
| 40 | |
| 41 | Условие: |
| 42 | |
| 43 | ```bsl |
| 44 | Если Условие Тогда |
| 45 | // ... |
| 46 | ИначеЕсли ДругоеУсловие Тогда |
| 47 | // ... |
| 48 | Иначе |
| 49 | // ... |
| 50 | КонецЕсли; |
| 51 | ``` |
| 52 | |
| 53 | Циклы: |
| 54 | |
| 55 | ```bsl |
| 56 | Для Счетчик = 0 По 10 Цикл |
| 57 | Сообщить(Счетчик); |
| 58 | КонецЦикла; |
| 59 | |
| 60 | Для Каждого Элемент Из Массив Цикл |
| 61 | Сообщить(Элемент); |
| 62 | КонецЦикла; |
| 63 | |
| 64 | Пока Условие Цикл |
| 65 | // ... |
| 66 | КонецЦикла; |
| 67 | ``` |
| 68 | |
| 69 | Исключения: |
| 70 | |
| 71 | ```bsl |
| 72 | Попытка |
| 73 | // код |
| 74 | Исключение |
| 75 | Сообщить(ОписаниеОшибки()); |
| 76 | ВызватьИсключение; // rethrow |
| 77 | КонецПопытки; |
| 78 | |
| 79 | ВызватьИсключение "Текст ошибки"; |
| 80 | ``` |
| 81 | |
| 82 | ## Структура проекта |
| 83 | |
| 84 | Рекомендуемая структура каталогов: |
| 85 | |
| 86 | - `src/` — исходный код (в дистрибутив) |
| 87 | - `src/Классы/` — файлы `.os`, подключаемые как классы (создание через `Новый`) |
| 88 | - `src/Модули/` — файлы `.os`, подключаемые как общие модули |
| 89 | - `tests/` — тесты |
| 90 | - `tasks/` — служебные скрипты (сборка, тесты) |
| 91 | - Корень: `packagedef` (манифест), README, LICENSE |
| 92 | |
| 93 | Точка входа (например `src/main.os`) должна импортировать свой каталог: |
| 94 | |
| 95 | ```bsl |
| 96 | #Использовать "." |
| 97 | |
| 98 | // далее использование классов и модулей |
| 99 | Сообщить(МойМодуль.Метод()); |
| 100 | ``` |
| 101 | |
| 102 | ## Манифест packagedef |
| 103 | |
| 104 | В корне проекта — файл без расширения `packagedef`. Минимум: имя, версия, состав. |
| 105 | |
| 106 | ```bsl |
| 107 | Описание.Имя("my-package") |
| 108 | .Версия("1.0.0") |
| 109 | .ВерсияСреды("2.0.0") |
| 110 | .ЗависитОт("fs", "1.0.0") |
| 111 | .ЗависитОт("asserts", "1.3.0") |
| 112 | .ВключитьФайл("packagedef") |
| 113 | .ВключитьФайл("src") |
| 114 | .ВключитьФайл("oscript_modules") |
| 115 | .ИсполняемыйФайл("src/my-script.os"); |
| 116 | ``` |
| 117 | |
| 118 | Основные свойства: `Имя`, `Версия`, `ВерсияСреды`, `ЗависитОт`, `ВключитьФайл`, `ИсполняемыйФайл`. |
| 119 | |
| 120 | ## Библиотеки и #Использовать |
| 121 | |
| 122 | Подключение в начале модуля (до переменных): |
| 123 | |
| 124 | - По имени (поиск в каталогах библиотек): `#Использовать json`, `#Использовать fs` |
| 125 | - По пути (относительно файла): `#Использовать "."`, `#Использовать "lib/mylib"` |
| 126 | |
| 127 | Класс из библиотеки — новый тип, создаётся через `Новый ИмяКласса()`. Модуль — глобальный объект с методами: `ИмяМодуля.Метод()`. |
| 128 | |
| 129 | Стандартный загрузчик: файлы из подкаталога `Классы` регистрируются как классы, из `Модули` — как модули. Имя файла (без .os) = идентификатор класса/модуля. |
| 130 | |
| 131 | ## OPM |
| 132 | |
| 133 | - Сборка пакета из каталога с манифестом: `opm build .` |
| 134 | - Публикация в хаб: `opm push my-file.ospx --token ТОКЕН` |
| 135 | - Установка пакета: через opm или клонирование в каталог библиотек |
| 136 | |
| 137 | ## Дополнительно |
| 138 | |
| 139 | Подробности синтаксиса, отличия от 1С (Формат/ДФ, вызов конструктора в выражении, параметризованные исключения, rethrow с ИнформацияОбОшибке) — в [reference.md](reference.md). |
| 140 | |
| 141 | Документация: [oscript.io/learn](https://oscript.io/learn/). |