Для чего создан?

*Тут и далее речь пойдет о мобильной платформе NodaLogic, о веб – абзац в конце.
В NodaLogic и клиентская (мобильный и веб-клиент) и серверная логика базируется на Python-обработчиках и все бы хорошо – самый распространённый в мире язык программирования, единый стек на все задачи. Но есть несколько хотелок, о них дальше.
1. Выражения на самом-самом фронте
Допустим, у вас строка списка, в которой есть в данных цена и количество. И я хочу вычислять сумму в этой строке.
Как это делалось «до»: разработчик просто кладет сумму в _data сразу же, как готовит список, в отдельную переменную, например sum. Все. Ее можно забрать из данных через @sum (такой в NL оператор обращения к данным)
Но это громоздко, я хочу просто добавить в разметку функцию
Сумма=Количество*Цена
Почему не привинтить python? Во-первых, отступы (даже в данном примере, возможно, понадобится несколько строк, например, проверить, есть ли реквизиты в данных, а могут быть условия и циклы) а отступы как соблюдешь в разметке? Нереально. Во-вторых – производительность. На тысячи строк списка делать вызов питон-движка не очень идея – будет тормозить (проверил).
А на NodaScript (так я его назвал) – пожалуйста. У него высокопроизводительное ядро, и можно не думать о производительности.
Теперь в элементе разметки можно написать так
Возврат _data.quantity*_data.price
Вот так это выглядит в разметке, для понимания (этот элемент в NL - просто надпись, в value задается текст надписи либо просто в виде константы, либо через @(взять из данных), теперь добавилось # - выражение на NodaScript)
{"type":"Text","value":"#Если _data.qty!=Неопределено и _data.price!=Неопределено Тогда возврат _data.qty*_data.price Иначе возврат '--' КонецЕсли",
"gravity":"right"}
Можно писать любой код, в том числе циклы, например. Но чаще всего думаю, будет что-то типа тернарного оператора:
#return ?(_date.balance<0,'--',_date.balance)
Да, сразу признаюсь, что ради того, чтобы вписывать в разметку (разметка у меня JSON) и не заморачиваться с экранированием (нечитаемо) строковые константы задаются как в двойных кавычках, так и в одинарных. И в разметке как раз удобно в одинарных, потому что сам элемент уже в двойных. Это, конечно, не канон, зато удобно в JSON.
2.Скрипты без лишних файлов
Python скрипты позволяют создавать любую логику, но они тащат за собой py-файлы. На каждое событие можно подписать python-методы. Но в целом, для простых вещей эта конструкция может показаться громоздкой
Теперь можно писать просто вот так – событие и его скрипт. Это база для автономных решений-файлов, где данные упакованы вместе с компактной конфой, как Excel с макросами и NS один из шагов этой автономности. *Тут и далее среда разработки nmaker, поэтому цвета разметки не 1С-ные.

3.Скрипты в разметке
Помните, как в HTML можно вставлять JavaScript – скрипты? Вот теперь то же самое можно (если хочется) делать прямо в NL-разметки (а NL-разметку в свою очередь теперь не обязательно запускать из Python-скриптов, можно просто в классе прописать)

4.Не забываем про 1С-ников
Я провел опрос среди SimpleUI-разработчиков, почему они не переходят на NL? Оказалось, что многие сидят на онлайн обработчиках SimpleUI+1C. Python для них чужероден и непонятен. Но с онлайном теряются плюсы самостоятельных решений. Мне кажется, сейчас это довольно актуально стало? И вот тогда я и сделал скриптовый язык с двумя лексерами – похожий на JS и похожий на 1С. Т.е. можно теперь писать, как привыкли.
5. Итог
В итоге, на NS, думаю, можно сгрузить все рутинные задачи, связанные с интерфейсом, оставив для Python бизнес-логику, интеграции и что то сложное. Это не обязательная рекомендация, просто возможность.
Область действия и устройство
Из предыдущих абзацев понятна область действия, но я бы сформулировал принципы так
- Скриптовый язык работает всегда с _data конкретного узла (в NodaLogic _data – это все данные узла и ОЗУ и ПЗУ, так сказать). Он может брать из _data и писать в _data. Это его основное назначение.
- Он может быть вызван как скрипт и как get-функция в возвратом значения. Как get функция он используется для вычисления выражений в разметке, указывается через #<текст скрипта return значение>, оператор # указывает на NodaScript
Из назначения вытекает, что он должен уметь работать с JSON-образными типами (в 1С это Массив и Структура) , логическими условиями, выражениями и т.д. Т.е., простыми словами, он должен уметь добраться до любого значения в _data, что-то с ним сделать, и записать любое значение в _data
Работа с объектами и списками тут, кстати, как в JS или 1С, не как в python.
Исходя из характера такой работы есть builtins для работы со строкам, с датами. Без этого было бы сложно.
И, конечно, есть обращение к UI/UX функциям платформы.
Более подробно можно ознакомиться с инструкцией для 1С-like в русской документации: https://nodalogic-txt-ru.readthedocs.io/ru/latest/nodascript.html, для просто NodaScript -в английской документации: https://nodatxt.readthedocs.io/en/latest/nodascript.html.
Инструкции очень коротки (английская 200 строк), буквально на 1-2 листика влезут, книгу я издавать не планирую. Но даже их можно не читать, а просто скормить в контекст вашей LLM, чтобы она за вас писала. 26й год на дворе как-никак.
Двоемыслие
Работая с разными языками, постоянно сравниваешь «о, а вот тут это удобно, а тут это». Поэтому я просто без комментариев оставлю куски кода на оба синтаксиса, чтобы вы могли сравнить, как могло бы быть в 1С.
Условия в стиле 1С и скобочные:

Работа с объектами и массивами с литералами и без:

Тернарка:

Про Web-клиент
Веб-клиент играет важную роль в NL, но хотя стек разработки общий, реалии все-таки отличаются от мобильной платформы. Потому что это сервер, логика на python. Но тем не менее сделал порт на JS-движке, т.е. из этого прямо следует, что его место – чисто веб-страница, там он живет. Это быстро - не гоняются данные туда-сюда. Там есть _data узла в форме, из нее можно что-то взять, обработать. Немного более ограниченная функция, чем на Android - пока нет вызовов типа onClick в разметке - есть #-выражения и NodaScript через события. Сейчас он в текущем релизе.
Ссылки
Телеграмм канал проекта: https://t.me/thinknodes_ru
GitHub, чтобы развернуть локально (конструктор+сервер+веб-клиенты): https://github.com/dvdocumentation/nodalogic
Облако, чтобы попробовать сразу (конструктор+сервер+веб-клиенты): https://nmaker.pw/
Примеры (традиционно, так себе) в GitHub в Samples, сама NodaLogic живет там же.
Приложение в GooglePlay (мобильная платформа): https://play.google.com/store/apps/details?id=com.dv.noda и RuStore: https://www.rustore.ru/catalog/app/com.dv.noda
Вступайте в нашу телеграмм-группу Инфостарт