Show/Hide Toolbars

Руководство администратора

Работа с Lua-скриптами

Ссылки Назад Вверх Вперед

Для выполнения Lua-скрипта можно использовать смарт-действие Выполнить смарт-скрипт (раздел Прочее).

!warning Все названия регистрозависимы!

Отладка и тестирование

Для отладки и тестирования Lua-скрипта удобно использовать функции var_dump или print - они выводят результат выполнения исходного кода в область внизу страницы. Отличие между ними в том, что var_dump может принимать любые типы данных, а print - только строковые.

lua_var_dump

Вывод с помощью функции var_dump.

Контекст и параметры событий

В зависимости от контекста, в котором вызывается Lua-скрипт, в него передается разный набор контекстных параметров.

в параметр CONTEXT передаются задача Task, пользователь User или Email,

в параметр EVENTPARAMS в виде массива передаются параметры события, для которого вызывается Lua-скрипт,

в параметр SESSION_USER передаются данные о пользователе, от имени которого ведется работа в системе.

Параметры могут представлять собой структуру данных (Task - данные о задачи, User - данные о пользователе). В этом случае в коде можно обратиться к элементам этой структуры. Например, если в параметре CONTEXT передается задача, текст задачи можно получить так:

CONTEXT.Text

или

CONTEXT['Text']

или

CONTEXT["Text"]

Названия элементов структуры немного отличаются от названий полей соответствующих таблиц в БД. Чтобы посмотреть названия элементов структуры, при отладке используйте функцию var_dump:

lua_var_dump_structure

Просмотр структуры при отладке Lua-скрипта.

Результат

Результат, который возвращает Lua-скрипт, должен быть записан в переменную RESULT.

lua_result

Результат выполнения Lua-скрипта.

Функции

Использование подсказки по функциям

С помощью подсказки, которая вызывается нажатием на значок ?, вы можете посмотреть функции, которые можно использовать в Lua-скриптах, и параметры, которые эти функции принимают.

На вкладке Основное есть список доступных функций и их параметров. Функции сгруппированы в классы, название класса используется как префикс функции.

Например, вам нужно выполнить смарт-действие из Lua-скрипта. На вкладке Основное вы можете увидеть, что для этого используется класс SMART и функция execute_action. Там же вы можете посмотреть, какие параметры нужно передать этой функции. Обязательные параметры отмечены символом *. При наведении указателя мыши в правом верхнем углу всплывает значок копирования, по нажатию на нему в текущее место в коде будет добавлен шаблон вызова этой функции:

lua_smart_execute_action

Параметры для вызова SMART:execute_action.

SMART:execute_action('AttachSignature', @contextId, @contextType, {
  File = @string
})

!warning Если необязательные параметры не указываются, вместо них нужно передавать пустые значения: {} вместо параметра с типом LuaTable, '' вместо параметра с типом string.

 

На вкладке Смарт-действия есть список всех смарт-действий и их параметров. Для поиска нужного смарт-действия воспользуйтесь строкой поиска. При наведении указателя мыши на блок с описанием смарт-действия в правом верхнем углу всплывает значок копирования, по нажатию на нему в текущее место в коде будет добавлен шаблон вызова этого смарт-действия:

lua_smart_help_search

Поиск описания параметров смарт-действия.

SMART:execute_action('SetPriority', @contextId, @contextType, {
  Task = @int,
  Priority = @byte,
  ChangingUser = @int
})

Вызов смарт-действия

Для вызова смарт-действия из Lua-скрипта используется функция SMART:execute_action.

Например, вызов смарт-действия для изменения приоритета в Lua-скрипте будет выглядеть так:

SMART:execute_action(
  'SetPriority',         -- смарт-действие
  CONTEXT.Id,           -- контекст вызова смарт-действия
  'task',               -- тип контекста
  {                     -- параметры конкретного смарт-действия
    Task = EVENTPARAMS.TaskId.Id,
    Priority = 1,
    ChangingUser = EVENTPARAMS.InitiatorUserId.Id
  }
);

В данном примере предполагается, что скрипт вызывается по нажатию на дополнительную кнопку. Поэтому в нем доступны контекстные параметры события "нажатие на кнопку": EVENTPARAMS.TaskId - задача, в которой выполняется действие, и EVENTPARAMS.InitiatorUserId - пользователь, нажавший кнопку.

Вызов SQL запроса

Для выполнения смарт-запроса из Lua-скрипта используются функции SQL:scalar и SQL:query.

Например, так можно получить значение ИНН контрагента, выбранного в текущей задаче (ДП "Контрагент" имеет ID=11, ДП "ИНН" имеет ID=22):

local customerInn = SQL:scalar([[
  SELECT TOP 1 epv2.ExtParamValue
  FROM ExtParamValues epv1
     JOIN ExtParamValues epv2 ON epv2.TaskID = epv1.SelectedTaskId AND epv2.ExtParamId = 22
  WHERE epv1.TaskID = @taskId AND epv1.ExtParamId = 11
]], {taskId = CONTEXT.Id});
 
RESULT = customerInn

 

Так можно выбрать все активные задачи, где заказчиком является определенный пользователь:

RESULT = SQL:query(
  [[
    SELECT TaskID FROM Tasks WHERE UserId = @UserId AND IsActive = 1
  ]],
  { UserId = EVENTPARAMS.InitiatorUserId.Id }
);

В данном примере предполагается, что скрипт вызывается по нажатию на дополнительную кнопку. Поэтому в нем доступны контекстные параметры события "нажатие на кнопку", в том числе EVENTPARAMS.InitiatorUserId - пользователь, нажавший кнопку.

Вызов хранимой процедуры

Для вызова хранимой процедуры из Lua-скрипта также используется функция SQL:query.

Например, для вызова процедуры расчета бонусов из задачи вызывается хранимая процедура, в которую передается номер задачи:

SQL:query(
  [[
    exec [dbo].[calculate_bonus] @TaskId = @Id
  ]],
  { Id = CONTEXT.Id }
);

Вызов HTTP-запроса

Для выполнения HTTP-запроса из Lua-скрипта используется функция HTTP:send_http_request.

Например, так можно вызвать и обработать запрос, который получает курс валюты с сайта ЦБ:

local json_res = HTTP:send_http_request('get', 'https://www.cbr-xml-daily.ru/daily_json.js', {}, {}, '');
local content = json_res['HttpResponse']['ResponseContent'];     -- выделяем строку с телом ответа
local json_content = UTILS:json_decode(content);                 -- преобразуем строку с телом ответа в JSON
RESULT = json_content['Valute']['EUR']['Value'];

См. аналогичный пример, реализованный с помощью SMART.

Полезные ссылки