Если вы прошли расширенные уроки, то можете смело переходить к разделу...
Работу с JSON будем рассматривать на примере карточки заказа, так как заказ имеет вложенные сущности и потенциально может иметь больше уровней вложенности. Теперь будет интересно увидеть, как изменится форма с использованием JSON-объекта.
Построение объекта
С формы заказа на сервер должен уходить JSON-объект подобного вида:
Так как JSON-объект представляет собой набор пар "ключ-значение", то нам необходимо создать структуру <Structure> типа Dictionary, которую присвоим в объект Variable:
Обратите внимание, что у тэга <MyObject> стоит атрибут ChangeForm со значением False - этот объект вспомогательный, форма не должна его учитывать при проверке наличия изменений.
Добавим необходимые ключи в структуру и укажем источники данных:
Для поля client_id из OrderPrimaryGetDataConnection необходимо получить одно единственное значение - для этого используем атрибут GetScalar со значением True.
Для поля order_position, содержащего массив объектов, используем конструкцию <Array> с преобразованием массива строк из ConvertDataConnection в массив словарей.
У тэгов <Parameter> и <DataConnection> появился атрибут Refresh, который определяет, будет ли обновляться значение у тэгов <Key> и <Array>, если изменится значение источника. Таким образом, значение объекта OrderDictionaryVariable не будет пересчитываться каждый раз, когда измениться какой-либо источник.
Для ручного пересчета OrderDictionaryVariable нужно использовать команду ValueSetCommand для вызова set-проперти Refresh у объекта Variable:
Команда SerializeToJsonCommand при формировании JSON-объекта преобразует все даты со временем к UTC относительно пользовательских настроек временной зоны.
Сохранение изменений
Добавьте кнопку сохранить, как делали на экране со списком ТМЦ.
Создадим SetDataConnection, который в параметре Model будет передавать на сервер сериализованный JSON-объект:
Реализуйте функцию template.order_save(json). Функция должна возвращать order_id, который необходимо отлавливать на форме TemplateOrderEdit.xml и писать в параметр OrderId.
Не забывайте про работу с датой со временем и временные зоны. В JSON-строке на сервер даты со временем придут в UTC. Для приведения времени во временную зону сервера используйте функцию public.convert_date_json(timestamp without time zone).