Доработка форм ----------------- Мы продолжаем расширять возможности работы с формами Synergy. Представления формы ~~~~~~~~~~~~~~~~~~~~~ В новой версии была добавлена возможность создания **представлений формы** - вариантов внешнего вида и компоновки компонентов формы. Настроив несколько представлений для одной формы, разработчик Synergy сможет отрегулировать верстку формы для различных экранов - от мобильных до широкоформатных. Другой вариант использования представлений - предоставление пользователю частичного отображения формы посредством Конструктора приложений или внешнего проигрывателя форм. В Synergy IDE для форм добавлена новая дочерняя папка "Представления", которая создается автоматически вместе с формой: .. figure:: ../_static/image_18.png При этом печатное представление формы вынесено в отдельную дочернюю ноду формы. В контекстном меню папки "Представления" есть один пункт - "Добавить представление". Имя нового представления должно соответствовать тем же правилам, что и имя папки в IDE, то есть должно состоять только из букв латинского алфавита, цифр и символа ``_``, и не должно начинаться с цифры: .. figure:: ../_static/image_19.png Созданное представление можно переименовать или удалить с помощью его контекстного меню. Вкладка представления открывается внутри вкладки формы: .. figure:: ../_static/image_20.png По сути представление формы - это способ расположения уже существующих компонентов основной формы. Поэтому в редакторе представления все компоненты представлены в виде двух основных разделов: "Новые" и "Существующие". К **новым** компонентам относятся компоненты "Неизменяемый текст", "Таблица" и "Изображение". При этом функциональность компонента “Таблица” здесь существенно урезана - например, нельзя сделать таблицу динамической: .. figure:: ../_static/image_21.png Все компоненты основной формы, в том числе настроенные динамические таблицы, расположены в **существующих** компонентах и сгруппированы по типам: .. figure:: ../_static/image_22.png Рабочая область редактора представлений содержит основную таблицу, в которой расположены компоненты представления. Для того, чтобы добавить в представление компонент формы, достаточно выделить ячейку основной таблицы представления и выбрать нужный компонент из левой части. Выбранный компонент будет добавлен в представление со своим кодом, настройками и внешним видом, используются размеры компонента по умолчанию. При этом изменение кода компонента и доступ к его свойствам заблокированы, но разработчик Synergy может изменить размеры компонента и его начертание: .. figure:: ../_static/image_23.png Существующий компонент, добавленный в представление, перестает отображаться в левой части. Динамическая таблица при добавлении в представление состоит из одной ячейки основного блока таблицы и одной ячейки заголовка, если он был настроен: .. figure:: ../_static/image_24.png При выделении ячейки заголовка динамической таблицы в левой части отображаются только компоненты, которые были расположены в строке заголовка этой таблицы в основной форме: .. figure:: ../_static/image_25.png Аналогично, если выделена ячейка основного блока динамической таблицы, слева будут отображены только компоненты из блоков этой таблицы: .. figure:: ../_static/image_26.png Таким образом "перемешать" как компоненты разных динамических таблиц, так и компоненты из заголовка и блоков одной таблицы невозможно. Использование представлений форм """"""""""""""""""""""""""""""""" В Конструкторе приложений компонент "Проигрыватель форм" содержит специальное свойство "Код представления". В этом свойстве можно указать название представления, настроенного для формы: .. figure:: ../_static/image_74.png При использовании внешнего проигрывателя форм для отображения нужного представления используется метод ``showView``: ``this.player.model.showView(viewCode)`` Новый компонент "Вычисляемое поле" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Очень часто возникает необходимость выполнить какие-либо арифметические операции с числами на форме. Ранее это можно было сделать только с помощью блокирующего процесса. Мы реализовали новый тип компонента, который называется "Вычисляемое поле". Этот компонент позволяет производить вычисления с компонентами формы на основе настроенной формулы. Вычисления выполняются как на стороне клиента, так и на стороне сервера: 1. при изменении значения поля, участвующего в выражении (в том числе в режиме предпросмотра формы в конструкторе), агрегирование значений компонентов в динтаблице выполняется также при изменении количества блоков в таблице; 2. при изменении выражения (в конструкторе); 3. при создании и открытии записи по форме; 4. при сохранении данных по форме. Описание компонента """""""""""""""""""" Вычисляемое поле расположено в разделе "Специальные". Внешний вид компонента на форме полностью аналогичен числовому полю, заблокированному от изменений пользователем, но без плейсхолдера. Настройки вычисляемого поля: .. figure:: ../_static/image_27.png Синтаксис формул """""""""""""""""" Поддерживаемые действия: * арифметические (+, -, *, /); * агрегирование значений компонентов (сумма ``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!#``. Работа с динамическими таблицами """"""""""""""""""""""""""""""""" При вычислении с использованием компонентов, расположенных в динамических таблицах, выделяются два случая: #. Выражение добавлено в компонент, расположенный в динтаблице: * если в выражении используется агрегирование значений компонентов, расположенных в этой же таблице, то выражение считается некорректным; * если в выражении используются арифметические действия с компонентами, расположенными в этой же таблице, то операции должны выполняться для компонентов в одном блоке; * допускается в выражении использовать агрегирование значений компонентов, расположенных в другой динамической таблице. #. Выражение добавлено в компонент, расположенный вне динтаблицы, и использует компонент в динтаблице: * если компонент из динтаблице используется без агрегирования, то выражение считается некорректным; * допускается в выражении использовать агрегирование значений компонентов, расположенных в разных динтаблицах. **Работа с массивами** Здесь *массив* - набор значений компонента ``cmp`` во всех блоках динтаблицы ``dyntable``. Массив может быть указан только в качестве аргумента функции агрегирования: ``AVG(@{dyntable.cmp})``. Во всех остальных случаях при использовании массива в формуле выражение считается некорректным, в том числе при использовании массива в качестве аргумента арифметических операций: выражение вида ``SUM(@{dyntable.price}*@{dyntable.count})`` будет считаться некорректным. Пример """""""" Рассмотрим пример формы "Заказ" со списком товаров и итоговой суммой. Форма может выглядеть так: .. figure:: ../_static/image_28.png Коды компонентов, которые будут участвовать в вычислениях: * динамическая таблица со списком товаров: ``itemList`` * цена за единицу товара: ``price`` * количество: ``count`` Сначала добавим компонент для вычисления стоимости товара в таблице. Для этого в столбец "Стоимость" добавим компонент "Вычисляемое поле" с кодом ``value``: .. figure:: ../_static/image_29.png Теперь нужно в настройках этого компонента указать формулу для вычисления: .. figure:: ../_static/image_30.png Формула выглядит так: ``#{price}*#{count}``. Здесь: * обращение к компонентам выполняется с использованием символа ``#``, потому что необходимо использовать значение из текущей строки динамической таблицы; * значения компонентов ``price`` и ``count`` должны быть перемножены между собой. Настроенная формула отображается в компоненте при просмотре формы в конструкторе: .. figure:: ../_static/image_31.png Проверить вычисления можно в режиме заполнения формы: .. figure:: ../_static/image_32.png При изменении значений в числовых компонентах автоматически пересчитываются вычисляемые поля. В каждой строке таблицы используются значения компонентов этой же строки. Теперь настроим вычисление итоговой стоимости. Для этого на форму добавим еще один компонент "Вычисляемое поле" и настроим для него формулу: .. figure:: ../_static/image_33.png .. figure:: ../_static/image_34.png Используется формула ``SUM(@{itemList.value})``. Здесь: * ``SUM()`` - суммирование компонентов, перечисленных в скобках; * ``@{itemList.value}`` - обращение к компоненту ``value``, расположенному в динамической таблице ``itemList``. Результатом вычисления будет сумма всех значений компонента ``value`` во всех строках динтаблицы. Проверим формулу в режиме заполнения формы: .. figure:: ../_static/image_35.png Таким образом на форме можно выполнять арифметические действия без использования скриптинга и блокпроцессов. Поиск в компоненте "Выпадающий список" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Мы добавили возможность использовать текстовый поиск в компоненте "Выпадающий список". Это удобно при работе с большим количеством элементов в списке. Например, список содержит города Казахстана: .. figure:: ../_static/image_36.png Для того, чтобы использовать в поле текстовый поиск, нужно в настройках компонента "Выпадающий список" включить флаг "Позволять поиск": .. figure:: ../_static/image_37.png После этого в поле списка можно вводить текст, который будет использоваться как фильтр элементов списка: .. figure:: ../_static/image_38.png Изменение логики работы метода для заполнения значений компонента "Выбор вариантов" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ В версии 4.1 был обновлен метод ``setValue``, используемый в интерпретаторе для заполнения значений в компоненте "Выбор вариантов". Теперь метод принимает на вход массив значений, которые должны быть выделены у компонента. Все остальные элементы при выполнении метода выключаются. Пример """"""" Предположим, что на форме расположен компонент "Выбор вариантов", элементами которого являются элементы справочника: .. figure:: ../_static/checkbox1.png .. figure:: ../_static/checkbox2.png Создадим новый скрипт интерпретатора с кодом: .. code-block:: js var form = platform.getFormsManager().getFormData (dataUUID); form.load(); //в компоненте checklist включить элементы item1 и item3, остальные отключить form.setValue("checklist","item3, item1"); form.save(); var result=true; var message = "OK"; С помощью пробного запуска проверим работу скрипта на тестовой записи: .. figure:: ../_static/checkbox3.png После выполнения скрипта в записи выделены только те элементы, которые были перечислены в методе ``setValue``, остальные элементы выключены: .. figure:: ../_static/checkbox4.png