4.4. Доработка форм

Мы продолжаем расширять возможности работы с формами Synergy.

4.4.1. Представления формы

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

Настроив несколько представлений для одной формы, разработчик Synergy сможет отрегулировать верстку формы для различных экранов - от мобильных до широкоформатных.

Другой вариант использования представлений - предоставление пользователю частичного отображения формы посредством Конструктора приложений или внешнего проигрывателя форм.

В Synergy IDE для форм добавлена новая дочерняя папка «Представления», которая создается автоматически вместе с формой:

../_images/image_18.png

При этом печатное представление формы вынесено в отдельную дочернюю ноду формы.

В контекстном меню папки «Представления» есть один пункт - «Добавить представление».

Имя нового представления должно соответствовать тем же правилам, что и имя папки в IDE, то есть должно состоять только из букв латинского алфавита, цифр и символа _, и не должно начинаться с цифры:

../_images/image_19.png

Созданное представление можно переименовать или удалить с помощью его контекстного меню.

Вкладка представления открывается внутри вкладки формы:

../_images/image_20.png

По сути представление формы - это способ расположения уже существующих компонентов основной формы. Поэтому в редакторе представления все компоненты представлены в виде двух основных разделов: «Новые» и «Существующие».

К новым компонентам относятся компоненты «Неизменяемый текст», «Таблица» и «Изображение». При этом функциональность компонента “Таблица” здесь существенно урезана - например, нельзя сделать таблицу динамической:

../_images/image_21.png

Все компоненты основной формы, в том числе настроенные динамические таблицы, расположены в существующих компонентах и сгруппированы по типам:

../_images/image_22.png

Рабочая область редактора представлений содержит основную таблицу, в которой расположены компоненты представления.

Для того, чтобы добавить в представление компонент формы, достаточно выделить ячейку основной таблицы представления и выбрать нужный компонент из левой части. Выбранный компонент будет добавлен в представление со своим кодом, настройками и внешним видом, используются размеры компонента по умолчанию. При этом изменение кода компонента и доступ к его свойствам заблокированы, но разработчик Synergy может изменить размеры компонента и его начертание:

../_images/image_23.png

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

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

../_images/image_24.png

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

../_images/image_25.png

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

../_images/image_26.png

Таким образом «перемешать» как компоненты разных динамических таблиц, так и компоненты из заголовка и блоков одной таблицы невозможно.

4.4.1.1. Использование представлений форм

В Конструкторе приложений компонент «Проигрыватель форм» содержит специальное свойство «Код представления». В этом свойстве можно указать название представления, настроенного для формы:

../_images/image_74.png

При использовании внешнего проигрывателя форм для отображения нужного представления используется метод showView:

this.player.model.showView(viewCode)

4.4.2. Новый компонент «Вычисляемое поле»

Очень часто возникает необходимость выполнить какие-либо арифметические операции с числами на форме. Ранее это можно было сделать только с помощью блокирующего процесса.

Мы реализовали новый тип компонента, который называется «Вычисляемое поле». Этот компонент позволяет производить вычисления с компонентами формы на основе настроенной формулы. Вычисления выполняются как на стороне клиента, так и на стороне сервера:

  1. при изменении значения поля, участвующего в выражении (в том числе в режиме предпросмотра формы в конструкторе), агрегирование значений компонентов в динтаблице выполняется также при изменении количества блоков в таблице;
  2. при изменении выражения (в конструкторе);
  3. при создании и открытии записи по форме;
  4. при сохранении данных по форме.

4.4.2.1. Описание компонента

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

Настройки вычисляемого поля:

../_images/image_27.png

4.4.2.2. Синтаксис формул

Поддерживаемые действия:

  • арифметические (+, -, *, /);
  • агрегирование значений компонентов (сумма SUM, среднее арифметическое AVG, минимум MIN, максимум MAX, количество элементов COUNT);
  • сравнения (<, <=, >, >=, =, !=);
  • условный оператор IF(<условие>, <значение, если истина>, <значение, если ложь>).

Обращение к компоненту:

  • ${cmp-id}, ${cmp-in-static-table} - значение указанного компонента;
  • #{cmp-id} - значение компонента cmp-id, расположенного в динтаблице, текущий блок (применяется только для формул в компонентах, расположенных в этом же блоке динтаблицы);
  • @{dyntable.cmp-id} - массив значений компонента cmp-id из всех блоков динтаблицы dyntable.

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

Выражение может быть оформлено разными способами:

  • с использованием арифметических действий: (${cmp1}+${cmp2})/3
  • с использованием функций агрегирования: MIN(@{dyntable.cmp1}), AVG(${cmp1},${cmp2})
  • комбинированный вариант: COUNT(@{dyntable.cmp1})*${cmp1}+1

В выражениях допускается использование id компонентов любого типа. Операции выполняются с key компонентов, если они есть, если нет - то с value. Если ключ/значение хотя бы одного из используемых в выражении операндов (компонента или константы) - не число, или указан несуществующий компонент, то выражение считается некорректным.

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

В случае, если в компоненте указано некорректное выражение, в режиме конструктора и заполнения формы в этом компоненте отображается текст #NUM!#.

4.4.2.3. Работа с динамическими таблицами

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

  1. Выражение добавлено в компонент, расположенный в динтаблице:

    • если в выражении используется агрегирование значений компонентов, расположенных в этой же таблице, то выражение считается некорректным;
    • если в выражении используются арифметические действия с компонентами, расположенными в этой же таблице, то операции должны выполняться для компонентов в одном блоке;
    • допускается в выражении использовать агрегирование значений компонентов, расположенных в другой динамической таблице.
  2. Выражение добавлено в компонент, расположенный вне динтаблицы, и использует компонент в динтаблице:

    • если компонент из динтаблице используется без агрегирования, то выражение считается некорректным;
    • допускается в выражении использовать агрегирование значений компонентов, расположенных в разных динтаблицах.

Работа с массивами

Здесь массив - набор значений компонента cmp во всех блоках динтаблицы dyntable.

Массив может быть указан только в качестве аргумента функции агрегирования: AVG(@{dyntable.cmp}). Во всех остальных случаях при использовании массива в формуле выражение считается некорректным, в том числе при использовании массива в качестве аргумента арифметических операций: выражение вида SUM(@{dyntable.price}*@{dyntable.count}) будет считаться некорректным.

4.4.2.4. Пример

Рассмотрим пример формы «Заказ» со списком товаров и итоговой суммой. Форма может выглядеть так:

../_images/image_28.png

Коды компонентов, которые будут участвовать в вычислениях:

  • динамическая таблица со списком товаров: itemList
  • цена за единицу товара: price
  • количество: count

Сначала добавим компонент для вычисления стоимости товара в таблице. Для этого в столбец «Стоимость» добавим компонент «Вычисляемое поле» с кодом value:

../_images/image_29.png

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

../_images/image_30.png

Формула выглядит так: #{price}*#{count}. Здесь:

  • обращение к компонентам выполняется с использованием символа #, потому что необходимо использовать значение из текущей строки динамической таблицы;
  • значения компонентов price и count должны быть перемножены между собой.

Настроенная формула отображается в компоненте при просмотре формы в конструкторе:

../_images/image_31.png

Проверить вычисления можно в режиме заполнения формы:

../_images/image_32.png

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

Теперь настроим вычисление итоговой стоимости. Для этого на форму добавим еще один компонент «Вычисляемое поле» и настроим для него формулу:

../_images/image_33.png
../_images/image_34.png

Используется формула SUM(@{itemList.value}). Здесь:

  • SUM() - суммирование компонентов, перечисленных в скобках;
  • @{itemList.value} - обращение к компоненту value, расположенному в динамической таблице itemList.

Результатом вычисления будет сумма всех значений компонента value во всех строках динтаблицы.

Проверим формулу в режиме заполнения формы:

../_images/image_35.png

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

4.4.3. Поиск в компоненте «Выпадающий список»

Мы добавили возможность использовать текстовый поиск в компоненте «Выпадающий список». Это удобно при работе с большим количеством элементов в списке. Например, список содержит города Казахстана:

../_images/image_36.png

Для того, чтобы использовать в поле текстовый поиск, нужно в настройках компонента «Выпадающий список» включить флаг «Позволять поиск»:

../_images/image_37.png

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

../_images/image_38.png

4.4.4. Изменение логики работы метода для заполнения значений компонента «Выбор вариантов»

В версии 4.1 был обновлен метод setValue, используемый в интерпретаторе для заполнения значений в компоненте «Выбор вариантов».

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

4.4.4.1. Пример

Предположим, что на форме расположен компонент «Выбор вариантов», элементами которого являются элементы справочника:

../_images/checkbox1.png
../_images/checkbox2.png

Создадим новый скрипт интерпретатора с кодом:

var form = platform.getFormsManager().getFormData (dataUUID);
form.load();
//в компоненте checklist включить элементы item1 и item3, остальные отключить
form.setValue("checklist","item3, item1");
form.save();
var result=true;
var message = "OK";

С помощью пробного запуска проверим работу скрипта на тестовой записи:

../_images/checkbox3.png

После выполнения скрипта в записи выделены только те элементы, которые были перечислены в методе setValue, остальные элементы выключены:

../_images/checkbox4.png