Перейти к основному содержимому

Lua

Модуль 1С/OSOPI_LuaКоманда CLIlua#Использоватьoint/api/lua

Этот раздел посвящен библиотеке для работы с Lua в 1С:Предприятие и OneScript. На данной странице описаны все действия, необходимые для полноценного начала работы

Для реализации некоторых функции в этой библиотеке используется внешняя компонента
Пожалуйста, ознакомьтесь с разделом "О внешних компонентах" перед началом работы

Начало работы

Библиотека позволяет встраивать и выполнять скрипты Lua непосредственно в 1С:Предприятие и OneScript. Поддерживаются две версии Lua VM:

  • Lua54 - стандартная версия Lua 5.4
  • LuaJIT - Just-In-Time компилятор Lua для повышенной производительности

Для повторного использования одного контекста Lua (глобальные переменные, загруженные пакеты, объявленные функции) создайте экземпляр VM и передавайте его в последующие вызовы:

// Создание VM Lua 5.4
VM = OPI_Lua.СоздатьVM("Lua54");

// Создание VM LuaJIT
VM = OPI_Lua.СоздатьVM("LuaJIT");

// Выполнение кода из строки
КодLua = "return 2 + 2";
Результат = OPI_Lua.ВыполнитьКодИзСтроки(VM, КодLua);

// Выполнение кода из файла
Результат = OPI_Lua.ВыполнитьКодИзФайла(VM, "C:\Scripts\script.lua");

// Определение функции
КодLua = "
|function sum(a, b)
| return a + b
|end
|";
OPI_Lua.ВыполнитьКодИзСтроки(VM, КодLua);

// Вызов функции с параметрами
Параметры = Новый Массив;
Параметры.Добавить(5);
Параметры.Добавить(3);

Результат = OPI_Lua.ВызватьФункцию(VM, "sum", Параметры); // Вернет 8

Для одноразового вызова без сохранения состояния VM можно использовать ВызватьФункциюСкрипта:

Параметры = Новый Массив;
Параметры.Добавить(6);
Параметры.Добавить(7);

Результат = OPI_Lua.ВызватьФункциюСкрипта("Lua54"
, "function mul(a, b) return a * b end"
, "mul"
, Параметры);
примечание

Ошибки при выполнении Lua кода вызывают исключения в 1С. Рекомендуется использовать конструкцию Попытка...Исключение для обработки возможных ошибок

Работа с глобальными переменными

Библиотека позволяет устанавливать и получать глобальные переменные в контексте Lua:

// Установка глобальной переменной
OPI_Lua.УстановитьГлобальнуюПеременную(VM, "myvar", "Значение");

// Получение глобальной переменной
Значение = OPI_Lua.ПолучитьГлобальнуюПеременную(VM, "myvar");

Работа с пакетами

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

// Добавление пакета из строки
КодПакета = "
|local M = {}
|function M.hello(name)
| return 'Hello, ' .. name
|end
|return M
|";
OPI_Lua.ДобавитьПакетИзСтроки(VM, "mymodule", КодПакета);

// Добавление пакета из файла
OPI_Lua.ДобавитьПакетИзФайла(VM, "mymodule", "C:\Scripts\module.lua");

// Использование пакета
OPI_Lua.ВыполнитьКодИзСтроки(VM, "calc = require('mymodule')");

Параметры = Новый Массив;
Параметры.Добавить("World");

Результат = OPI_Lua.ВызватьФункцию(VM, "calc.hello", Параметры);

Работа с байт-кодом

Для повышения производительности код скрипта может быть предварительно скомпилирован в байт-код Lua:

// Компиляция кода в байт-код
КодLua = "return 2 + 2";
БайтКод = OPI_Lua.СкомпилироватьКодИзСтроки(VM, КодLua);

// Выполнение байт-кода
Результат = OPI_Lua.ВыполнитьБайтКод(VM, БайтКод);

// Компиляция из файла
БайтКод = OPI_Lua.СкомпилироватьКодИзФайла(VM, "C:\Scripts\script.lua");

Поддерживаемые типы данных

Для обмена между 1С и Lua разрешены следующие типы данных

  • Примитивные типы: строка, число, булево, Неопределено
  • Структуры и соответствия (как Lua-таблицы)
  • Массивы (как Lua-таблицы)
  • ДвоичныеДанные