Python — внешний исполнитель для смарт-скриптов¶
Python-скриптинг в 1Форме реализован через внешний HTTP-сервис Python Executor, на который платформа отправляет код смарт-скрипта. Ниже описаны протокол обмена, настройки подключения, состав передаваемого контекста и отличия Python от остальных языков смарт-скриптов (Lua, JavaScript, OneScript, C#).
Статус и обзор¶
Реализовано. Python-скриптинг доступен в продакшене с версии 2.268.35. Frontend-редактор поддерживает выбор Python в v2.268.38.
Платформа поддерживает четыре языка смарт-скриптов:
| Язык | Движок | ScriptLanguage (enum) |
LanguageId (БД) |
Модель исполнения |
|---|---|---|---|---|
| Lua | NLua | Lua = 0 |
0 |
Внутри платформы |
| JavaScript | Jint 4.6.0 | JavaScript = 1 |
1 |
Внутри платформы |
| Python | Python Executor (HTTP) | Python = 2 |
2 |
Внешний сервис |
| OneScript | OneScript | OneScript = 3 |
3 |
Внутри платформы |
| C# | Roslyn Scripting 4.12 | CSharp = 4 |
4 |
Внутри платформы |
Ключевое отличие Python от Lua и JavaScript: скрипт исполняется не внутри платформы, а отправляется HTTP-запросом на внешний сервис Python Executor.
Версионирование Python SmartScript — обязательно¶
Каждый Python SmartScript обязан содержать комментарий с версией и датой в начале скрипта. Правило версионирования критично для отладки и отката: без явной версии невозможно определить, какой код выполнялся на момент инцидента.
# v1 | 2026-03-08 15:30 | Начальная версия
# v2 | 2026-03-08 16:45 | Добавлена проверка прав
Версия увеличивается при каждом изменении. Соглашение о версионировании единое для всех языков смарт-скриптов — подробнее в разделе Паттерны JS-скриптов.
Как платформа выполняет Python-скрипт¶
Когда смарт-действие запускает скрипт с языком Python, платформа определяет язык скрипта, собирает контекст и отправляет код на внешний сервис Python Executor по HTTP. Результат выполнения возвращается обратно и используется в смарт-действии. Скрипты на остальных языках (Lua, JavaScript, OneScript, C#) платформа выполняет сама, без обращения к внешнему сервису.
Протокол обмена с Python Executor¶
Запрос к Python Executor:
POST {PythonExecutor.ApiUrl}/execute/code
Headers:
Content-Type: application/json
X-Api-Key: {ApiKey} (если настроен)
Body:
{
"ScriptCode": "def execute(ctx):\n return ctx['task_id']",
"Context": { ... },
"Timeout": 30
}
Ответ при успешном выполнении:
{
"Status": "ok",
"Result": 12345,
"Output": "debug output...",
"DurationMs": 42
}
Ответ при ошибке:
{
"Status": "error",
"Error": "NameError: name 'foo' is not defined",
"Output": "",
"DurationMs": 5
}
Обработка ошибок. Платформа прерывает смарт-действие с ошибкой в следующих случаях: сетевая ошибка или таймаут при обращении к сервису; ответ со статусом error (текст ошибки берётся из поля Error); не задан адрес сервиса (ApiUrl).
Контекст скрипта¶
Python-скрипт получает данные только через объект ctx. Платформа собирает контекст и передаёт его в скрипт, отфильтровывая значения по типу:
| Тип значения | Что передаётся |
|---|---|
| Объекты платформы (задача, пользователь и т.п.) | Только идентификатор (Id) |
| Примитивы (строка, число, логическое значение, дата) | Передаются как есть |
| Коллекции (списки, словари) | Только если содержат значения, пригодные для передачи в JSON |
| Сложные объекты | Пропускаются |
Дополнительно в контекст автоматически добавляется session_user_id — идентификатор текущего пользователя.
Шаблон по умолчанию для нового скрипта:
def execute(ctx):
pass
Конфигурация и Frontend (AdminSPA)¶
Настройки подключения к Python Executor хранятся в настройках сервиса:
| Параметр | Описание |
|---|---|
ApiUrl |
URL Python Executor (например, http://python-executor:8000) |
ApiKey |
API-ключ для авторизации (опционально) |
Timeout запроса: 30 секунд (фиксированный).
Редактор скриптов (AdminSPA). С версии 2.268.38 в редакторе смарт-скриптов можно выбрать Python из списка языков (Lua, JavaScript, Python, OneScript, C#). При выборе Python редактор включает подсветку синтаксиса Python и подставляет шаблон по умолчанию def execute(ctx):.

Сравнение с Lua/JS¶
Ключевые отличия Python от языков, выполняемых внутри платформы:
| Аспект | Lua (NLua) | JavaScript (Jint) | Python (Executor) |
|---|---|---|---|
| Модель | Внутри платформы | Внутри платформы | Внешний HTTP-сервис |
| Sandbox | Ограниченный | Строгий | Полная изоляция (отдельный процесс) |
| Таймаут | 5 мин | 5 мин | 30 сек |
| API-объекты (SQL, HTTP, SMART и т.д.) | Доступны | Доступны | Недоступны — только ctx |
| Библиотеки (include) | Да | Да | Нет |
| Возврат результата | RESULT = value |
RESULT = value |
return value из execute(ctx) |
| Зависимости | NLua + Lua DLL | Нет (pure .NET) | Python Executor (Docker) |
Ограничения Python: нет прямого доступа к SQL, HTTP, SMART, CACHE, REGISTRY, FILES API. Скрипт может оперировать только данными из контекста. Для полноценной автоматизации (обращения к БД, HTTP-вызовы) рекомендуются Lua или JavaScript.
Связанные документы домена Smart Actions¶
Документация по другим языкам смарт-скриптов:
- JavaScript в смарт-скриптах (Jint) — выполнение внутри платформы, изоляция, доступные API-объекты
- C# в смарт-скриптах (Roslyn) — компиляция и выполнение C#-кода
- Обработка ошибок Lua (pcall) — особенности NLua, обработка ошибок