├── result.png ├── install └── onescript-engine_1.9.2_all.deb ├── kernels └── onescript │ ├── kernel.json │ └── onescript_kernel.py ├── bsl-lsp-server ├── plugin.jupyterlab-settings └── bsl-server-implementation.json ├── dockerfile ├── README.md └── Example1C.ipynb /result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rentgengl/onescript-kernel-jupyter/HEAD/result.png -------------------------------------------------------------------------------- /install/onescript-engine_1.9.2_all.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rentgengl/onescript-kernel-jupyter/HEAD/install/onescript-engine_1.9.2_all.deb -------------------------------------------------------------------------------- /kernels/onescript/kernel.json: -------------------------------------------------------------------------------- 1 | { 2 | "argv": [ 3 | "python", 4 | "/usr/local/share/jupyter/kernels/onescript/onescript_kernel.py", 5 | "-f", 6 | "{connection_file}" 7 | ], 8 | "display_name": "bsl", 9 | "language": "bsl" 10 | } -------------------------------------------------------------------------------- /bsl-lsp-server/plugin.jupyterlab-settings: -------------------------------------------------------------------------------- 1 | { 2 | "language_servers": { 3 | "bsl-server-implementation": { 4 | "version": 2, 5 | "argv": [ 6 | "java", 7 | "-jar", 8 | "/opt/bsl-language-server/bsl-language-server.jar" 9 | ], 10 | "languages": ["bsl"] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /bsl-lsp-server/bsl-server-implementation.json: -------------------------------------------------------------------------------- 1 | { 2 | "LanguageServerManager": { 3 | "language_servers": { 4 | "bsl-server-implementation": { 5 | "version": 2, 6 | "argv": [ 7 | "java", 8 | "-jar", 9 | "/opt/bsl-language-server/bsl-language-server.jar" 10 | ], 11 | "languages": ["bsl"], 12 | "mime_types": ["text/bsl", "text/x-bsl"], 13 | "display_name": "BSL LSP server" 14 | } 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /dockerfile: -------------------------------------------------------------------------------- 1 | # Базовый образ jupyter/base-notebook 2 | FROM jupyter/base-notebook:latest 3 | 4 | # Установка зависимостей 5 | USER root 6 | 7 | # Обновление системы и установка необходимых утилит 8 | RUN apt-get update && \ 9 | apt-get upgrade -y && \ 10 | apt-get install -y --no-install-recommends \ 11 | sudo mono-complete curl\ 12 | && apt-get install openjdk-17-jre -y \ 13 | && \ 14 | rm -rf /var/lib/apt/lists/* 15 | 16 | # Копирование и установка OneScript 17 | COPY ./install/onescript-engine_1.9.2_all.deb /tmp/onescript.deb 18 | 19 | RUN dpkg -i /tmp/onescript.deb || \ 20 | (apt-get update && apt-get install -f -y && rm -rf /var/lib/apt/lists/*) && \ 21 | rm /tmp/onescript.deb 22 | 23 | # Устанавливаю пакеты OneScript 24 | RUN opm update opm 25 | 26 | # Устанавливаю 27 | RUN pip install ipywidgets 28 | 29 | # Подсветка, контроль синтаксиса 30 | 31 | # Основной плагин поддержки языковых серверов 32 | RUN pip install jupyterlab-lsp python-lsp-server 33 | 34 | # Установка bsl-language-server для синтаксис-контроля 35 | ## Основной движок bsl-language-server 36 | # Скачиваем bsl-language-server 37 | RUN mkdir -p /opt/bsl-language-server 38 | RUN curl -L -o /opt/bsl-language-server/bsl-language-server.jar https://github.com/1c-syntax/bsl-language-server/releases/download/v0.24.2/bsl-language-server-0.24.2-exec.jar 39 | 40 | 41 | ## Подключение движка bsl-language-server к jupyterlab-lsp 42 | COPY ./bsl-lsp-server/bsl-server-implementation.json /opt/conda/etc/jupyter/jupyter_server_config.d/bsl-server-implementation.json 43 | COPY ./bsl-lsp-server/plugin.jupyterlab-settings /home/jovyan/.jupyter/lab/user-settings/@jupyter-lsp/jupyterlab-lsp/plugin.jupyterlab-settings 44 | 45 | 46 | # Копирование файла с примерами 47 | COPY ./Example1C.ipynb /home/jovyan/Example1C.ipynb 48 | 49 | # Настройка прав на директорию OneScript 50 | # Вместо chmod 777 — даём доступ пользователю jovyan 51 | RUN chown -R $NB_UID:$NB_GID /usr/share/oscript 52 | 53 | # Копирование ядра OneScript 54 | COPY ./kernels/. /usr/local/share/jupyter/kernels/ 55 | 56 | # Возвращаемся к пользователю по умолчанию 57 | USER $NB_UID 58 | 59 | # Рабочая директория 60 | WORKDIR $HOME 61 | 62 | # Запуск Jupyter Notebook 63 | CMD ["start-notebook.sh"] -------------------------------------------------------------------------------- /kernels/onescript/onescript_kernel.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | import tempfile 3 | from ipykernel.kernelbase import Kernel 4 | import logging 5 | 6 | class OneScriptKernel(Kernel): 7 | implementation = 'bsl' 8 | implementation_version = '1.0.2' 9 | language = 'bsl' 10 | language_version = '1.0.2' 11 | language_info = { 12 | 'name': 'bsl', 13 | 'mimetype': 'text/bsl', 14 | 'file_extension': '.bsl', 15 | } 16 | banner = "OneScript kernel for Jupyter Lab" 17 | 18 | def __init__(self, **kwargs): 19 | super().__init__(**kwargs) 20 | self.log = logging.getLogger(__name__) 21 | self.log.setLevel(logging.INFO) 22 | handler = logging.StreamHandler() 23 | handler.setLevel(logging.INFO) 24 | self.log.addHandler(handler) 25 | 26 | def do_execute(self, code, silent, store_history=True, user_expressions=None, allow_stdin=False): 27 | # Создаем временный файл для хранения кода 28 | if code[0:4]=="opm ": 29 | comand=code.split(" ") 30 | else: 31 | # Создаем временный файл для хранения кода 32 | with tempfile.NamedTemporaryFile(suffix='.os', mode='w', delete=False) as temp_file: 33 | temp_file.write(code) 34 | temp_file_path = temp_file.name 35 | 36 | comand=['oscript', temp_file_path] 37 | 38 | try: 39 | # Выполняем файл через OneScript 40 | result = subprocess.run( 41 | comand, 42 | capture_output=True, 43 | text=True 44 | ) 45 | 46 | # Читаем вывод и ошибки 47 | output = result.stdout.strip() 48 | error = result.stderr.strip() 49 | 50 | if error: 51 | stream_content = {'name': 'stderr', 'text': error} 52 | self.send_response(self.iopub_socket, 'stream', stream_content) 53 | else: 54 | stream_content = {'name': 'stdout', 'text': output} 55 | self.send_response(self.iopub_socket, 'stream', stream_content) 56 | 57 | finally: 58 | # Удаляем временный файл после выполнения 59 | import os 60 | try: 61 | os.unlink(temp_file_path) 62 | except Exception as e: 63 | self.log.info(f"Failed to delete temporary file: {e}") 64 | 65 | return { 66 | 'status': 'ok', 67 | 'execution_count': self.execution_count, 68 | 'payload': [], 69 | 'user_expressions': {}, 70 | } 71 | 72 | def do_shutdown(self, restart): 73 | pass # Нет процессов, которые нужно завершать 74 | 75 | if __name__ == '__main__': 76 | from ipykernel.kernelapp import IPKernelApp 77 | IPKernelApp.launch_instance(kernel_class=OneScriptKernel) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # onescript-kernel-jupyter 2 | Ядро onescript для jupyter notebook 3 | 4 | Для создания ядра Jupyter Notebook, которое будет использовать язык программирования OneScript, необходимо выполнить несколько шагов. OneScript — это скриптовый язык, совместимый с 1С:Предприятие, и для его интеграции в Jupyter потребуется создать пользовательское ядро. 5 | 6 | Ниже приведен пошаговый план и пример кода для реализации такого ядра. 7 | 8 | ## Upd 2025.08.21 9 | - Добавлен синтаксис-контроль с помощью связки [BSL Language Server](https://1c-syntax.github.io/bsl-language-server/dev/) и [jupyter-lsp](https://jupyterlab-lsp.readthedocs.io/en/latest/index.html) 10 | - Добавлен файл Example1C.ipynb с примерами использования движка OneScript 11 | 12 | 13 | 14 | ## Запуск в контейнере 15 | Для запуска контейнера необходимо собрать его образ 16 | 17 | ### Сборка образа 18 | 1. **Скачайте проект с данного репозитория** 19 | 20 | 2. **Запустите команду сборки образа** 21 | ```bash 22 | docker build -t jupyter-onescript . 23 | ``` 24 | 25 | ### Запустите контейнер 26 | Для запуска контейнера выполните команду 27 | ```bash 28 | docker run -e NOTEBOOK_ARGS="--NotebookApp.token='' --ip=0.0.0.0" -p 8888:8888 jupyter-onescript 29 | ``` 30 | 31 | ## Запуск без контейнера 32 | 33 | ### Шаг 1: Установка необходимых инструментов 34 | 1. **Установите Jupyter Notebook**: 35 | Если у вас еще не установлен Jupyter, выполните: 36 | ```bash 37 | pip install notebook 38 | ``` 39 | 40 | 2. **Установите OneScript**: 41 | Скачайте и установите OneScript с официального сайта: [https://oscript.io/](https://oscript.io/) или из папки install. 42 | 43 | 3. **Установите `jupyter_kernel`**: 44 | Для создания пользовательского ядра используется пакет `jupyter_kernel`. Установите его: 45 | ```bash 46 | pip install jupyter_kernel 47 | ``` 48 | 49 | --- 50 | 51 | ### Шаг 2: Создание ядра OneScript 52 | Ядро Jupyter Notebook — это программа, которая взаимодействует с Jupyter через протокол ZeroMQ. Мы будем использовать Python для создания интерфейса между Jupyter и OneScript. 53 | 54 | #### 1. Скопируйте каталог с ядром из репозитория в каталог ~/.local/share/jupyter/ 55 | Эти файлы содержат логику ядра для OneScript. 56 | Должно получиться: 57 | 58 | ~/.local/share/jupyter/kernels/onescript/kernel.json 59 | 60 | ~/.local/share/jupyter/kernels/onescript/onescript_kernel.py 61 | 62 | ### Шаг 3: Запуск Jupyter Notebook 63 | 1. Запустите Jupyter Notebook: 64 | ```bash 65 | jupyter notebook 66 | ``` 67 | 68 | 2. При создании новой записной книжки выберите ядро "OneScript" из списка доступных ядер. 69 | 70 | --- 71 | 72 | ### Пример использования 73 | Теперь вы можете писать код на OneScript прямо в Jupyter Notebook. Например: 74 | ```onescript 75 | // Простой пример 76 | Перем a; 77 | a = 5 + 3; 78 | Сообщить(a); 79 | ``` 80 | 81 | Результат выполнения будет отображаться в ячейке вывода. 82 | 83 | ![result](https://github.com/user-attachments/assets/6e01e457-6cb6-491f-8c85-9cb84d8b14ba) 84 | -------------------------------------------------------------------------------- /Example1C.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "3142130d-bddf-41c4-b4e1-a875bbcc7b16", 6 | "metadata": {}, 7 | "source": [ 8 | "# Пример выполнение кода 1С\n", 9 | "Можно выполнить любой код в синтаксисе 1С с помощью движка OneScript\n", 10 | "\n", 11 | "[Документация по синтаксису](https://oscript.io/learn/syntax-basics)" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": null, 17 | "id": "737f60d6-03d2-40e7-b084-cd711382e682", 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "Сообщить(\"Привет мир!\");\n", 22 | "Сообщить(3+6);" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "id": "b0886ce2-79e6-4ae8-97e0-166da66d1c97", 28 | "metadata": {}, 29 | "source": [ 30 | "# Установка дополнительных модулей\n", 31 | "Данное ядро позволяет устанавливать дополнительные модули для OneScript с помощью пакета opm\n", 32 | "\n", 33 | "[Список доступных пакетов](https://github.com/oscript-library)" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "id": "a4621ca3-7b02-4ac5-b1d9-4bbe39134da2", 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "opm install yaml" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "id": "8261205d-c39e-4bbd-a82e-83b8d3d6714b", 49 | "metadata": {}, 50 | "source": [ 51 | "# Использование установленных пакетов" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": null, 57 | "id": "74120ece-55a5-4ea8-974e-eb71b3d878a8", 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "#Использовать yaml\n", 62 | "\n", 63 | "Процессор = Новый ПарсерYAML;\n", 64 | "\n", 65 | "// Нижеследующий текст будет преобразован в массив строк\n", 66 | "СтрокаYaml = \"\n", 67 | "|--- # Favorite movies\n", 68 | "| - Casablanca\n", 69 | "| - North by Northwest\n", 70 | "| - The Man Who Wasn't There\";\n", 71 | "\n", 72 | "ОбъектыМассив = Процессор.ПрочитатьYaml(СтрокаYaml);\n", 73 | "\n", 74 | "Для Каждого ЭлементМассива Из ОбъектыМассив Цикл\n", 75 | "\tСообщить(ЭлементМассива);\n", 76 | "КонецЦикла;\n" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "id": "81c2f802-56da-4dac-8d2f-f4cb3ff0d9b6", 82 | "metadata": {}, 83 | "source": [ 84 | "# Пример использования Открытого Пакета Интеграций\n", 85 | "[Документация на пакет](https://openintegrations.dev/)" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "id": "dfeb18e3-b65d-45e6-81d3-662af99f1118", 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": [ 95 | "#Использовать oint\n", 96 | "Токен = \"Токен\";\n", 97 | "IDЧата = \"Чат\";\n", 98 | "\n", 99 | "Результат = OPI_Telegram.ОтправитьКонтакт(Токен,IDЧата,\"Leonov\",\"Aleksandr\",\"+79987654321\");\n", 100 | "\n", 101 | "Для Каждого Эл Из Результат Цикл\n", 102 | " Сообщить(Эл.Ключ + \" - \" + Эл.Значение);\n", 103 | "КонецЦикла;\n" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "id": "8708254b-8417-4407-9c63-17813bf6e195", 110 | "metadata": {}, 111 | "outputs": [], 112 | "source": [] 113 | } 114 | ], 115 | "metadata": { 116 | "kernelspec": { 117 | "display_name": "bsl", 118 | "language": "bsl", 119 | "name": "onescript" 120 | }, 121 | "language_info": { 122 | "file_extension": ".bsl", 123 | "mimetype": "text/bsl", 124 | "name": "bsl" 125 | } 126 | }, 127 | "nbformat": 4, 128 | "nbformat_minor": 5 129 | } 130 | --------------------------------------------------------------------------------