Перейти к содержанию

Смарт-скрипты

Смарт-скрипты — механизм автоматизации действий над объектами 1Формы. Скрипты выполняются на сервере (не в СУБД), что снижает нагрузку на базу и даёт полноценный язык программирования. С их помощью можно создавать задачи, заполнять таблицы, вызывать смарт-действия и хранимые процедуры, работать с циклами, массивами, файлами.

Смарт-скрипты могут заменять смарт-выражения и смарт-фильтры (в последнем случае должны возвращать true/false). Вызываются через смарт-действие Выполнить смарт-скрипт или из маршрута.

По кнопке Создать откроется окно создания автоматизации. В поле Режим редактирования выбирается язык скрипта.

Платформа поддерживает три языка: Lua, JavaScript и Python.

Язык Runtime Модель исполнения Таймаут Возврат результата
Lua NLua (in-process) Внутренний 5 мин RESULT = value
JavaScript Jint 4.6.0 (in-process) Внутренний 5 мин RESULT = value
Python Python Executor (HTTP) Внешний сервис 30 сек return value из execute(ctx)
OneScript OneScriptEngine (in-process) Внутренний 5 мин RESULT = value

Lua — основной язык, исполняется внутри процесса бэкенда через NLua. В скрипт передаётся: CONTEXT (задача/пользователь/письмо), EVENTPARAMS (параметры события), SESSION_USER (текущий пользователь), DB_TYPE, SYSTEM_INFO. Для отладки — var_dump() и print(). Поддерживается репозиторий библиотечных скриптов: подключение через include(id), глубина рекурсии — не более 5 уровней.

JavaScript — исполняется in-process через pure .NET движок Jint 4.6.0, без V8/Node.js. Лимиты: таймаут 5 минут, максимум 10 000 000 инструкций. Доступны те же API, что у Lua: SQL, SMART, HTTP, CACHE, REGISTRY, FILES, UTILS, include(id).

Python работает принципиально иначе: скрипт не исполняется внутри бэкенда, а отправляется HTTP-запросом (POST /execute/code) на отдельный внешний сервис Python Executor (Docker-контейнер). Структура скрипта: def execute(ctx): return value — результат через return, не через RESULT. Таймаут — 30 секунд. Нет доступа к SQL, HTTP, SMART, CACHE и другим API платформы — только данные из ctx. Для полноценной автоматизации (обращения к БД, HTTP-вызовы) нужны Lua или JS. Подробнее: Python-скрипты.

Ключевое архитектурное различие: Lua и JS — in-process, Python — внешний HTTP-сервис. Это влияет на деплой (нужен дополнительный Docker-контейнер для Python) и на передачу контекста (Python получает только сериализуемые данные).

OneScript — исполняется in-process через встроенный движок OneScriptEngine (1С:Enterprise Script). Поддерживает синтаксис 1С: предопределённые процедуры, типы данных, операторы. Доступны те же API, что у Lua и JS: SQL, SMART, HTTP, CACHE, REGISTRY, FILES, UTILS. Результат возвращается через RESULT = значение. Таймаут — 5 минут. Подходит для интеграций с существующими решениями на 1С и для команд, знакомых с экосистемой 1С.


Lua-скрипты

ℹ️ Lua-скрипт — это код, написанный на языке Lua

Во вкладке Lua доступны все настроенные в категории смарт-скрипты. В списке смарт-скриптов отображается колонка Язык, показывающая язык каждого скрипта (Lua, JavaScript, Python), и колонка Событие — название события, к которому привязан скрипт (если скрипт не привязан к событию, колонка пуста).

По сравнению с использованием SMART-выражений смарт-скрипты имеют ряд преимуществ:

  • Смарт-скрипты выполняются на сервере, а не в СУБД, а значит:

  • позволяют снизить нагрузку на СУБД;

  • выполняются быстрее чем SMART-выражения.

  • Смарт-скрипты позволяют работать с контекстными данными, еще не записанными в БД.

  • В отличие от SMART и SQL, Lua — это полноценный программный язык. В Lua-скриптах удобнее работать с циклами, массивами, файлами и пр.

  • Смарт-скрипты имеют более высокую степень безопасности (например, защищены от SQL-инъекций).

В смарт-скриптах можно вызывать любые смарт-действия и хранимые процедуры, т.е. можно использовать накопленный "багаж" разработок в "Первой Форме".

Смарт-скрипты могут использоваться как вместо смарт-выражений, так и вместо смарт-фильтров (в последнем случае они должны возвращать значение true/false). Но обычно с помощью смарт-скриптов автоматизируют какие-то действия (создать задачу, заполнить таблицу и пр.). Если нужно просто вычислить и вернуть какое-то значение, чаще используют смарт-выражения.

Создание и редактирование смарт-скрипта

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

Вы можете создать смарт-скрипт по кнопке или отредактировать — по кнопке из окна редактирования смарт-действия, предварительно выбрав вариант параметра Lua скрипт.

В шапке редактора отображается название скрипта и бейдж с типом (Lua, JavaScript, Python). По кнопке открывается история версий скрипта. По кнопке ··· доступны дополнительные настройки: опция Из репозитория/библиотеки и переход в Репозиторий. Кнопка Сохранить сохраняет изменения. При попытке покинуть страницу с несохранёнными изменениями система запросит подтверждение.

По кнопке Библиотека откроется подсказка по работе с смарт-скриптом и вызову смарт-действий. Нажав кнопку Выполнить, вы можете протестировать исходный код. Результаты выполнения отображаются в нижней части окна.

Поля Id контекста и параметры события доступны в раскрывающейся панели Параметры выполнения над редактором.

Подсказка по работе с смарт-скриптом и вызову смарт-действий:

В редакторе поддерживается возможность выполнить часть выделенного фрагмента кода.

Репозиторий

В системе доступен репозиторий Lua-скриптов — он служит в качестве библиотеки, к которой можно обратиться при написании скрипта. Скрипт из репозитория можно импортировать в текущий скрипт и вызывать функции, которые в нем содержатся.

Перейти в репозиторий прямо из редактора — нажмите кнопку ··· в шапке редактора и выберите Репозиторий — в модальном окне откроется табличный список скриптов с описанием и ID скрипта. Нажатие по строке из списка откроет выбранный скрипт в новом окне.

У всех скриптов из репозитория активна опция Из репозитория/библиотеки.

Для подключения скрипта-библиотеки используется функция include:

  • include(id) — подключение скрипта по ID (рекомендуется).
  • include("Description") — подключение скрипта по описанию (не рекомендуется).
  • include(id, subcatId) — подключение скрипта по ID из указанной категории.
  • include("Description", subcatId) — подключение скрипта по описанию из указанной категории.

Без второго параметра подключать можно только скрипты из репозитория (с активной опцией Из репозитория/библиотеки). При указании ID категории (subcatId) это ограничение снимается — будет подключён любой скрипт из этой категории. Это позволяет создавать переносимые библиотеки, привязанные к категории, которые экспортируются вместе с конфигурацией.

Скрипты рекомендуется подключать только в начале исходного кода. В подключаемых скриптах не должно быть вычислений, только определения функций и глобальных переменных. Максимальная глубина рекурсии — 5. В системе запрещено удаление скриптов из библиотеки, которые используются в коде.

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

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

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

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

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

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

ℹ️ Для корректной работы циклических смартов не рекомендуется использовать смарт-скрипты, т.к. в них невозможна передача контекстных параметров "Номер итерации" и "Значение итератора"

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

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

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

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

  • параметр DB_TYPE позволяет получить тип используемой базы данных. Возможные варианты: MSSQL, PG.

  • параметр SYSTEM_INFO позволяет получить системную информацию. Возвращает объект с полями version - версия приложения, app - имя приложения: TC или Uniform.

ℹ️ Если смарт-скрипт не использует параметры события EVENTPARAMS, то он сохраняется с EventId = null

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

CONTEXT.Text

или

CONTEXT['Text']

или

CONTEXT["Text"]

Некоторые параметры из EVENTPARAMS передаются в скрипт как материализованный объект из БД. Например, EVENTPARAMS[InitiatorUserId] — это таблица объекта User. Для получения Id пользователя из нее необходимо писать: EVENTPARAMS[InitiatorUserId]["Id"], либо EVENTPARAMS[InitiatorUserId] — параметр распознает объект из БД и возьмет его Id.

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

CONTXT объекта Task:

{ 
"IsOverdue": false, 
"EdsSessionId": 1, 
"PriorityId": 1, 
"CreatedDate": 1631197651, 
"IsWaitingSign": false, 
"ConsisImplementAllow": false, 
"IsConfidential": false, 
"Guid": [],
"IsOrderedTimeLocked": false, 
"Id": 940840, 
"IsClosed": false, 
"SubcatId": 8091, 
"IsComplainted": false, 
"ExtParamValues": [ 
  { 
    "ExtParamValue": "", 
    "Id": 17205052, 
    "ExtParamId": 14484, 
    "Guid": [],
    "TaskId": 940840, 
    "IsEncrypted": false 
  }, 
  { 
    "SelectUserValue": 5354, 
    "ExtParamValue": "Фамилия Имя", 
    "Id": 17916307, 
    "ExtParamId": 15411, 
    "Guid": [],
    "TaskId": 940840, 
    "IsEncrypted": false 
}, 
  { 
    "ExtParamValue": "", 
    "Id": 17205051, 
    "ExtParamId": 25741, 
    "Guid": [],
    "TaskId": 940840, 
    "IsEncrypted": false 
  }, 
  { 
    "ExtParamValue": "", 
    "Id": 17205053, 
    "ExtParamId": 31041, 
    "Guid": [],
    "TaskId": 940840, 
    "IsEncrypted": false 
  }, 
  { 
    "ExtParamValue": "", 
    "Id": 17205054, 
    "ExtParamId": 43131, 
    "Guid": [],
    "TaskId": 940840, 
    "IsEncrypted": false 
}, 
  { 
    "ExtParamValue": "iFly Airlines", 
    "Id": 17205055, 
    "ExtParamId": 43141, 
    "SelectedTaskId": 879665, 
    "Guid": [],
    "TaskId": 940840, 
    "IsEncrypted": false 
  } 
],
"DueDateChangeCount": 0, 
"IsEncrypted": false, 
"OwnerId": 5354, 
"HasDueDate": false, 
"Text": "asdf", 
"ModifiedDate": 1635336755, 
"StateId": 1, 
"RespectTable": false 
}

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

Ошибки, связанные с работой смарт-скриптов, отображаются в общем Логе ошибок и в Логе ошибок бизнес-логики.

Результат

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

Функции

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

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

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

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

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

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

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

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

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

Для вызова смарт-действия из смарт-скрипта используется функция 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 — пользователь, нажавший кнопку.

Асинхронное выполнение

Смарт-действия могут быть вызваны из смарт-скрипта в асинхронном режиме.

Пример вызова:

SMART:execute_action(
'ExecuteSmartScript',
nil,
nil,
{
 Script = @string
}, true)

При асинхронном вызове результат не возвращается из execute_action, что значительно ускоряет работу.

В смарте, вызванном через ExecuteSmartScript (в любом режиме), доступны EVENTPARAMS пакета, из которого он вызван.

В смарт-действии, вызванном из смарт-скрипта в асинхронном режиме через ExecuteSmartScript доступны контекстные параметры (EVENTPARAMS) пакета, из которого он вызван.

Фоновый запуск другого смарт-скрипта (JavaScript)

В JavaScript-скриптах (Jint) доступен метод SMART.run_script_background — он запускает указанный смарт-скрипт асинхронно в фоновой задаче. Текущий скрипт не блокируется и продолжает выполнение, не ожидая завершения фонового.

⚠️ Метод доступен только в JavaScript-скриптах (Jint). В Lua-скриптах для фонового вызова используйте: SMART:execute_action('ExecuteSmartScript', nil, nil, { Script = @string }, true).

SMART.run_script_background(scriptId)
SMART.run_script_background(scriptId, contextId)
SMART.run_script_background(scriptId, contextId, eventParams)
SMART.run_script_background(scriptId, contextId, eventParams, extraParams)
Параметр Тип Описание
scriptId number ID смарт-скрипта для запуска
contextId number / null ID задачи-контекста исполнения. При null — скрипт выполняется без контекста
eventParams array / null Параметры события, передаваемые в целевой скрипт как EVENTPARAMS
extraParams object / null Произвольный JS-объект. Ключи доступны в целевом скрипте через именованные входные параметры

Примеры:

// Запустить скрипт #42 без контекста
SMART.run_script_background(42);

// С контекстом задачи
SMART.run_script_background(42, CONTEXT.Id);

// Без контекста, с параметрами события
SMART.run_script_background(42, null, [p1, p2]);

// С произвольными именованными параметрами
SMART.run_script_background(42, CONTEXT.Id, null, { CommentId: commentId });

Типичный сценарий: скрипт выполняется в обработчике события (например, AfterPostComment) и запускает тяжёлую операцию в фоне, передавая произвольные данные (CommentId, UserId и т.п.) через extraParams, не блокируя основную цепочку обработки.

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

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

Например, так можно получить значение ИНН контрагента, выбранного в текущей задаче (ДП "Контрагент" имеет 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 — пользователь, нажавший кнопку.

SQL:query_one возвращает первую строку из результирующего запроса в виде Lua-таблицы, в отличии от SQL:query, которая возвращает весь набор как массив Lua-таблиц.

Пример использования функции SQL:query_one:

local Task = SQL:query_one("select top 5 TaskID, UserID from Tasks",{})

var_dump(Task)

var_dump(string.format("TaskID = %s UserID = %s",Task.TaskID,Task.UserID))

var_dump(string.format("№Задачи %s Идентификатор пользователя %s",Task["TaskID"],Task["UserID"]))

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

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

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

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

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

Для выполнения HTTP-запроса из смарт-скрипта используется функция 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.

ℹ️ Для обращения к API системы безопасным способом рекомендуется использовать выделенную сервисную учетную запись. Чаще всего для этой цели применяется системный аккаунт systemrobot (Робот 1Ф), либо специально созданный пользователь с правами администратора. Эта учетная запись может быть как локальной, так и синхронизированной с Active Directory, что особенно полезно при настроенном разделении доступа по доменам.

Права, с которыми будет выполнен HTTP-запрос, полностью определяются правами выбранного пользователя в системе. Это означает, что доступ через API будет идентичен доступу через веб-интерфейс, поэтому выбор пользователя должен основываться на тех операциях, которые необходимо выполнить на сервере

ℹ️ В функции send_http_request параметр useDefaultCredentials определяет, какие именно учетные данные используются для аутентификации при выполнении HTTP-запроса. Если для этого параметра установлено значение "true", запрос будет автоматически выполняться под системной Windows-учетной записью, от которой запущено приложение (например, от имени LocalSystem на сервере IIS), что обычно не подходит для внешней авторизации. При этом для получения учетных данных из строки подключения веб-сервисов используется SQL-функция fnWSCredentials, которая извлекает из строки подключения адрес, логин, пароль и домен

Примечание. HTTP-вызовы из платформы поддерживают согласование версии протокола: при недоступности HTTP/2 запрос может быть выполнен по HTTP/1.1.

Вызов POST HTTP-запроса с файлами в теле запроса

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

Пример использования функции post_files

Для отправки POST-запросов в формате multipart/form-data с комбинацией файлов и текстовых параметров в одном теле используется функция HTTP:post_multipart. Метод принимает таблицу parts, где каждый элемент может описывать либо текстовое поле (с именем и значением), либо файл (по его идентификатору). Для файлов можно дополнительно указать имя поля в запросе, имя файла и тип контента.

Пример использования функции post_multipart

Комментирование

Комментарий начинается с двойного дефиса -- и продолжается до конца строки. Вы можете управлять комментированием с помощью горячих клавиш:

CTRL + K + C — закомментировать выделенные строки в коде.

CTRL + K + U — раскомментировать выделенные строки в коде.

Lua подерживает блочные комментарии, которые начинаются с --[ и продолжаются до закрывающего ]. Вы можете закомментировать таким образом блок кода с помощью горячих клавиш: CTRL + /

Описание работы с LUA-скриптами в прежнем интерфейсе администрирования

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

Справочник по Lua на lua.org

Learn Lua in 15 minutes

Примеры смарт-скриптов

Пример: данные из внешнего API на портале

Чтение и запись секретов интеграций из смарт-скрипта

Серверные смарт-скрипты (Lua и JavaScript) могут обращаться к централизованному хранилищу интеграционных секретов IntegrationSecrets через объект UTILS. Секреты создаются администратором через Admin API или интерфейс хранилища; в смарт-скрипте они читаются в расшифрованном виде без хранения в логах платформы.

Получить одно значение:

-- Lua
local apiKey = UTILS:getsecretvalue("dadata-5", "ApiKey")
// JavaScript
var apiKey = UTILS.getsecretvalue("dadata-5", "ApiKey");

Получить весь набор значений секрета:

-- Lua
local creds = UTILS:getsecretpayload("sbis-3")
// JavaScript
var creds = UTILS.getsecretpayload("sbis-3");
  • serviceKey — ключ секрета в хранилище интеграционных секретов.
  • fieldName — имя поля внутри payload секрета.
  • Если секрет или поле не найдены — метод возвращает null; ошибка HTTP 500 не возникает.
  • Каждое обращение фиксируется в журнале аудита IntegrationSecretsAuditLog (источник smartScript).
  • Методы getsecretvalue и getsecretpayload используют единый провайдер ISecretsProvider: сначала выполняется поиск в новом хранилище IntegrationSecrets, а при отсутствии записи — автоматический fallback к legacy-источникам (*Credentials / *Settings). Это позволяет переводить интеграции на новое хранилище постепенно, без одновременной миграции всех сервисов.

Записать одно значение в секрет:

-- Lua
UTILS:set_secret_value("passwork", "accessToken", newToken)
// JavaScript
UTILS.set_secret_value("passwork", "accessToken", newToken);

Записать весь набор значений секрета:

-- Lua
UTILS:set_secret_payload("sbis-3", {accessToken = newToken, refreshToken = newRefresh})
// JavaScript
UTILS.set_secret_payload("sbis-3", {accessToken: newToken, refreshToken: newRefresh});
  • set_secret_value(serviceKey, fieldName, value) — обновляет одно поле payload секрета. Если секрет с указанным serviceKey не существует — создаётся автоматически (upsert).
  • set_secret_payload(serviceKey, payload) — записывает весь payload секрета целиком (upsert).
  • Запись фиксируется в журнале аудита IntegrationSecretsAuditLog с источником smartScript.
  • Типичный сценарий: скрипт запрашивает новый OAuth-токен у внешнего сервиса и сохраняет его обратно в хранилище без участия администратора.

Методы чтения секретов в смарт-скриптах используют Integration Secrets и предназначены для серверных сценариев автоматизации. Каждое обращение к секрету фиксируется в журнале аудита с источником smartScript. Если секрет или отдельное поле не найдены, методы возвращают null; ошибка выполнения скрипта из-за отсутствия секрета не генерируется автоматически.

Подробная справка по методам UTILS — в технической документации объекта UTILS. Об управлении хранилищем секретов — на странице Хранилище секретов интеграций.

META / МЕТА — доступ к конфигурации по именам

МЕТА (alias META) — глобальный объект SmartScript, который позволяет получать конфигурационные сущности по их именам и путям без использования жёстко заданных ID.

Поддерживаются два способа обращения:

Dotted path — путь строкой:

МЕТА.Категория("Продажи.Клиенты")
МЕТА.ПолучитьДП("Клиенты.Заказчик")
МЕТА.Состояние("Клиенты.Новый")
МЕТА.Шаг("Клиенты.Новый->В работе")
МЕТА.КолонкаДП("Клиенты.Заказы.Кол-во")

Fluent chain — цепочка типизированных объектов:

МЕТА.Раздел("Продажи").Категория("Клиенты").ПолучитьДП("Заказчик")

Dotted path использует жадный парсинг: если путь содержит несколько точек, платформа пытается определить максимально длинный префикс категории. Это позволяет работать с именами, в которых есть точки.

Если имя категории неуникально, резолвинг завершается ошибкой. В таком случае нужно уточнить путь через раздел или использовать цепочку: МЕТА.Раздел("Продажи").Категория("Клиенты").

Для шагов маршрута используется запись: Категория.Откуда->Куда.

Для табличных ДП используется запись: Категория.ДПТаблица.Колонка.

Если сущность не найдена или путь неоднозначен, скрипт получает ошибку времени выполнения.

Доступные объекты МЕТА: Категория, ПолучитьДП, Состояние, Шаг, Подпись, Событие, КолонкаДП, Раздел, Группа, Модуль, Отчёт, Дашборд, СписокДП, Справочник, ТипДП.

Только JavaScript. Объект МЕТА / META доступен только в JavaScript-скриптах (Jint). В Lua и Python этот API не реализован.

Техническая справка: META / МЕТА JS API, REST META API.