Смарт-скрипты¶
Смарт-скрипты — механизм автоматизации действий над объектами 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-скриптами в прежнем интерфейсе администрирования
Полезные ссылки
Пример: данные из внешнего 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.