3.3.4. Изменения конструктора форм

В новой версии Synergy мы расширили возможности конструктора форм.

Ссылки для удобства навигации по разделу:

3.3.4.1. Отображение идентификаторов компонентов и признака наличия скрипта

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

Проблему поиска нужного компонента по идентификатору мы решили, добавив в конструкторе форм два специальных режима:

  • cid (от component ID) - отображать идентификаторы компонентов

  • tid (от table ID) - отображать идентификаторы вложенных таблиц

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

Рисунок 3.19. Браузерный поиск по компонентам формы

Браузерный поиск по компонентам формы

На скрине - форма «Инцидент», открытая в режиме конструктора. В правой верхней части рабочей области включен режим отображения идентификаторов компонентов cid. В строке поиска браузера введен запрос contact. Браузер нашел и выделил цветом все идентификаторы, в которых было найдено вхождение подстроки.

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

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

Теперь в режиме конструктора, независимо от того, отображаются ли идентификаторы компонентов формы, в ячейке компонента с пользовательским скриптом отображается </>:

Рисунок 3.20. Признак наличия скрипта у одного из компонентов

Признак наличия скрипта у одного из компонентов

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

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

Рисунок 3.21. Дочерние ноды формы в навигаторе

Дочерние ноды формы в навигаторе

При этом название ноды формируется по правилу: [%id_динтаблицы%.]%id_компонента%.js.

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

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

  2. если к компоненту уже был добавлен скрипт, то можно его открыть с помощью навигатора, дважды кликнув ЛКМ по ноде этого скрипта.

Рисунок 3.22. Пример внутренней вкладки со скриптом компонента формы

Пример внутренней вкладки со скриптом компонента формы

На скрине видно, что открыта вкладка с формой «Контакт» (сверху), в ней - внутренняя вкладка со скриптом компонента crm_form_contact_main_organization (снизу)

3.3.4.2. Скрипты формы

Еще одно нововведение - возможность добавлять к форме пользовательский скрипт, не привязывая его к компонентам этой формы. Теперь вместо того, чтобы размещать разные функции по разным компонентам формы, или, наоборот, писать весь код (который может быть очень большим) в скрипте одного служебного компонента, можно использовать единое пространство скриптов.

Для этого у каждой формы была добавлена дочерняя папка с названием «Скрипты формы». Изменить или удалить эту папку нельзя.

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

Рисунок 3.23. Пустое поле ввода названия скрипта

Пустое поле ввода названия скрипта

Название может содержать только буквы латинского алфавита, цифры, символы _ (нижнее подчеркивание) и . (точка), и не должно начинаться с цифры. Название скрипта должно быть уникальным для текущей формы.

Если введенное название соответствует этим правилам, кнопка «Сохранить» становится доступной:

Рисунок 3.24. Введено корректное название

Введено корректное название

После сохранения названия скрипта открывается внутренняя вкладка формы с редактором кода. Сохраняется скрипт одновременно с самой формой.

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

Выполнение скриптов формы осуществляется на стороне клиента в алфавитном порядке их названий, до выполнения скриптов отдельных компонентов. Код всех скриптов автоматически обернут в try/catch блок.

3.3.4.3. Выделение цветом вложенных таблиц

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

Мы реализовали выделение цветом границ вложенных таблиц и их управляющих элементов:

Рисунок 3.25. Вид конструктора форм, когда выделена ячейка вложенной таблицы

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

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

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

3.3.4.4. Настройка вспомогательного текста для компонентов формы

Мы реализовали возможность настройки произвольного вспомогательного текста (плейсхолдера) для таких компонентов, как «Однострочное поле», «Числовое поле» и «Многострочный текст».

Вспомогательный текст можно указать в настройках этих компонентов:

Рисунок 3.26. Настройка вспомогательного текста для компонента «Многострочный текст»

Настройка вспомогательного текста для компонента «Многострочный текст»

Рисунок 3.27. Вспомогательный текст в режиме заполнения формы

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

Примечание: если в компоненте с типом «Числовое поле» плейсхолдер не заполнен, будет применен текст по умолчанию: «Введите число».

3.3.4.5. Копирование содержимого ячеек между формами

Поскольку в Synergy IDE реализованы вкладки, позволяющие открыть несколько форм одновременно, также была реализована и возможность копирования компонентов формы не только внутри этой формы, но и между формами.

Механизм копирования компонентов между формами ровно такой же, как и копирование внутри одной формы: достаточно выделить одну непустую ячейку в исходной форме, нажать Ctrl+C, потом в целевой форме выделить одну ячейку и нажать Ctrl+V. Компонент будет скопирован вместе со всеми своими настройками.

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

3.3.4.6. Заполнение создающим пользователем в динамической таблице

В версии hamming реализовано заполнение создающим пользователем для компонента Объект Synergy, находящегося в динамической таблице. Компонент будет заполняться пользователем, который добавляет блок в динамическую таблицу.

Рисунок 3.28. Заполнение поля пользователем, добавляющим блок в динамическую таблицу

Заполнение поля пользователем, добавляющим блок в динамическую таблицу

3.3.4.7. Доработка компонента «Ссылка на реестр»

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

3.3.4.7.1. Новые настройки компонента

В настройках компонента «Ссылка на реестр» добавлены новые флаги:

  1. «Позволять мультивыбор»

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

  3. «Отправлять созданную запись на активацию?»

  4. «Добавлять в создаваемой записи ссылку на текущую запись?»: доступно указание ID компонента для вставки - выпадающее поле с поиском.

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

  6. «Запретить выбор произвольной записи»: если флаг включен, выбор записи реестра заблокирован (не открывается диалог выбора записи). Если включена возможность создания или редактирования выбранных записей, то эти возможности остаются доступными при наличии у пользователя соответствующих прав.

  7. «Открывать в диалоге»: флаг, регулирующий, как открывать выбранную запись для просмотра - в диалоговом окне или в новом окне документа.

  8. «Ширина диалога» и «Высота диалога» - числовые поля, в которых можно указать размер диалогового окна для создания, редактирования и просмотра записей реестра. Если они не заполнены, то будет открыто окно размером 840х600px.

Пример использования новых настроек

На форму добавлен компонент «Ссылка на реестр»:

Рисунок 3.29.


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

Рисунок 3.30.


В результате ниже поля выбора записей реестра отображен лейбл «+ Создать», видимый как в режиме конструктора форм, так и в режиме редактирования:

Рисунок 3.31.


Перейдем в режим редактирования формы и выберем несколько записей реестра «Сервисы»:

Рисунок 3.32.


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

В режиме просмотра формы выбранные записи реестра отображаются по одной в строке:

Рисунок 3.33.


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

Рисунок 3.34. Диалоговое окно «Редактирование»

Диалоговое окно «Редактирование»

Для создания новой записи выбранного реестра нужно кликнуть по лейблу «Создать». Откроется диалоговое окно создания записи:

Рисунок 3.35. Диалоговое окно «Создание»

Диалоговое окно «Создание»

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

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

Рисунок 3.36. Диалоговое окно «Просмотр»

Диалоговое окно «Просмотр»

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

3.3.4.7.2. Новые возможности сопоставлений

Помимо возможности мультивыбора, создания и редактирования записей «на лету», мы существенно доработали возможности сопоставлений данных из записей, выбранных в реестре.

В настройках компонента «Ссылка на реестр» была добавлена новая вкладка «Сопоставления», которая позволяет настроить один из двух видов сопоставлений:

  • из выбранной записи в текущую

  • из текущей записи в новую создаваемую

Рисунок 3.37. Вкладка «Сопоставления»

Вкладка «Сопоставления»

Обратите внимание: сопоставление возможно только в том случае, если у компонента отключен мультивыбор.

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

Рисунок 3.38. Возможность текстового поиска и фильтрации id компонентов в таблице сопоставлений

Возможность текстового поиска и фильтрации id компонентов в таблице сопоставлений

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

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

Рассмотрим пример использования вложенных компонентов.

Предположим, что в приложении есть такие формы:

Рисунок 3.39. Форма “Физическое лицо

Форма “Физическое лицо

Рисунок 3.40. Форма «Адресный регистр»

Форма «Адресный регистр»

Рисунок 3.41. Форма «Заявление», где в качестве заявителя указывается запись реестра «Физические лица»

Форма «Заявление», где в качестве заявителя указывается запись реестра «Физические лица»

Необходимо из формы заявления формировать отказ в регистрации. Причем на форме отказа должно быть достаточно выбрать только заявление-основание, остальные сведения должны быть заполнены автоматически:

Рисунок 3.42.


Видно, что напрямую из формы «Заявление» невозможно взять такие сведения, как ФИО заявителя, его ИИН и дату рождения. А для того, чтобы найти сведения об адресе проживания человека, необходимо использовать форму «Адресный регистр».

До версии 4.0 одним из способов решения этой задачи был такой:

  1. На форму «Физическое лицо» добавить поле «Адрес проживания», скрыть его при необходимости. Заполнять это поле сопоставлением при выборе записи реестра «Адресный регистр».

  2. На форму «Заявление» добавить поля «ФИО», «ИИН», «Дата рождения», «Адрес проживания», скрыть их при необходимости. Заполнять эти поля сопоставлением при выборе заявителя.

  3. На форме «Отказ» настроить сопоставление в поле «Заявление».

Теперь можно достигнуть того же результата, используя всего одно сопоставление.

Сначала настроим форму отказа:

Рисунок 3.43.


Здесь:

  • поле «Заявление» - ссылка на реестр заявлений, идентификатор reglink-z

  • заявитель - однострочное поле, идентификатор fio

  • ИИН - однострочное поле, идентификатор iin

  • дата рождения - поле выбора даты, идентификатор birthday

  • адрес проживания - многострочное поле, идентификатор address

Теперь добавим на форму «Заявление» ссылку на реестр «Отказы», включим в настройках возможности создания новой записи, отправку этой записи на активацию и заполнение в новой записи ссылки на текущую запись:

Рисунок 3.44. Настройки ссылки на реестр «Отказы», свойства

Настройки ссылки на реестр «Отказы», свойства

Обратите внимание, что в текстовом поле для флага «Добавлять в создаваемой записи ссылку на текущую запись» также доступен поиск и фильтрация id компонентов формы того реестра, который выбран в настройках. Укажем в этом поле reglink-z - ссылка на реестр заявлений, расположенная на форме отказа.

Этот флаг в нашем случае включен для того, чтобы в созданной записи отказа была автоматически заполнена ссылка на заявление, к которому он относится.

Примечание: если в качестве компонента, куда требуется добавлять ссылку на родительскую запись, указан компонент, не являющийся ссылкой на реестр родителя (например, указан ID компонента «Однострочное поле»), то в это поле будет вставлен UUID родительской записи.

Теперь перейдем к настройке сопоставлений в этом компоненте.

В первую очередь выберем тип сопоставления «Из текущей записи в новую». Появится пустая таблица сопоставлений.

Теперь начинаем добавлять сопоставления. В общем случае формат вложенных сопоставлений можно описать так:

%id_компонента_ссылки_на_реестр1_с_формой1%/%id_компонента_ссылки_на_реестр2_содержащегося_на_форме1%/.../
%id_компонента_ссылки_на_реестрN_содержащегося_на_форме(N-1)%/%id_компонента_значение_которого_нужно_вставить%`

В нашем случае нам нужно обратиться к форме записи, выбранной в компоненте текущей формы reglink_fl (ссылке на реестр «Физические лица») и найти на этой форме компонент с кодом fio (поле с ФИО физического лица). В поле «Источник» вводим значение reglink_fl/fio.

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

В поле «Приемник» указываем id компонента формы «Отказ», куда должна быть сопоставлена фамилия заявителя - у нас это fio.

Рисунок 3.45. Результат

Результат

Таким же образом настроим сопоставления ИИН и даты рождения:

Рисунок 3.46. Настроенные сопоставления

Настроенные сопоставления

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

Рисунок 3.47. Указание источника сопоставления для адреса

Указание источника сопоставления для адреса

В качестве источника указана конструкция reglink_fl/reglink-addr/address: то есть на форме записи, выбранной в компоненте reglink_fl, найти компонент reglink-addr, и на форме записи, выбранной в этом компоненте, взять значение поля address.

Таким образом может быть настроено сопоставление любого уровня вложенности.

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

3.3.4.8. Настройка условных действий с компонентами формы

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

В новой версии мы реализовали интерфейс, позволяющий аналитикам самостоятельно настраивать действия с компонентами формы в зависимости от условий, без применения скриптинга.

Во-первых, для этого мы в настройках каждого компонента формы добавили свойство «Скрытое поле». Его действие аналогично команде view.setVisible(false), выполняемой в скрипте формы: если флаг включен, то в режиме редактирования и просмотра формы это поле не отображается, и настройки обязательности для него не проверяются.

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

Для того, чтобы добавить новую группу условий, нужно в контекстном меню папки «Условные действия» выбрать пункт «Добавить группу действий». Откроется диалоговое окно, в котором нужно ввести название группы:

Рисунок 3.48. Название новой группы действий

Название новой группы действий

Здесь, как и для скрипта формы, нужно ввести название группы, которое может содержать только буквы латинского алфавита, цифры, символы _ (нижнее подчеркивание) и . (точка), и не должно начинаться с цифры. Название действия должно быть уникальным для текущей формы.

После указания и сохранения корректного имени открывается новая внутренняя вкладка формы:

Рисунок 3.49. Пустая группа действий во внутренней вкладке формы

Пустая группа действий во внутренней вкладке формы

На скрине видно, что созданная группа отображена как дочерняя нода в папке «Условные действия». Группу можно переименовать или удалить с помощью контекстного меню ее ноды.

Кнопка «Добавить» добавляет в группу новое действие:

Рисунок 3.50. Новое действие в группе

Новое действие в группе

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

Состав условия в общем случае:

  1. левый операнд: поле выбора ID компонента - выпадающий список с возможностью текстового поиска;

  2. оператор сравнения:

    • числовые сравнения: =, !=, <, <=, >, >=

    • строковые сравнения: «равен строке»/«не равен строке», «содержит»/«не содержит», «начинается с»/«не начинается с», «заканчивается на»/«не заканчивается на»

    • проверка заполненности компонента: «заполнен»/«не заполнен»

Примечание: все операторы сравнения доступны вне зависимости от типа компонента, выбранного в левом операнде; контроль сравнимости левой и правой частей условия остается за разработчиком Synergy.

Если у обоих операндов есть key, то сравнение выполняется по нему, иначе - по value (см. формат компонентов формы в документации). Записи в ссылках на реестр сравниваются по их UUID.

  1. выбор типа правого операнда:

    • «компонент»: для сравнения с компонентами текущей формы;

    • «текстовое значение» для сравнения со строкой или числом, этот же тип используется для сравнения key левого операнда с некоторым фиксированным значением - например, для определения выбранного элемента справочника;

    • «дата»: выбор эталонной даты;

    • «пользователь», «должность» и «подразделение»: сравнение с объектами оргструктуры;

    • «документ реестра»: для сравнения с эталонной записью выбранного реестра.

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

  1. правый операнд: поле ввода, тип которого зависит от выбранного типа операнда:

    • если выбран тип «Компонент формы», то поле - выпадающий список компонентов формы с возможностью текстового поиска;

    • для пункта «Текстовое значение» - текстовое поле ввода;

    • для пункта «Дата»: поле выбора даты, поле ввода времени;

    • для пункта «Пользователь»: поле выбора пользователей без мультивыбора;

    • для пункта «Должность»: поле выбора должностей без мультивыбора;

    • для пункта «Подразделение»: поле выбора подразделений без мульвыбора;

    • для пункта «Документ реестра»: поле выбора записи реестра, выбранного в левом операнде. Если левый операнд - не «Ссылка на реестр», или в нем не выбран реестр, то будет отображена ошибка.

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

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

Состав действия в общем случае:

  1. поле выбора компонента формы - выпадающий список идентификаторов всех компонентов формы с возможностью текстового поиска;

  2. выполняемое действие - выпадающий список действий, которые могут быть выполнены с выбранным компонентом:

    • «Сделать обязательным»: аналогично флагу «Обязательное поле» в настройках компонента.

    • «Сделать не обязательным»: снимается пометка обязательности поля.

    • «Включить доступность для редактирования»: поле разблокируется, доступно изменение его значения.

    • «Заблокировать от изменений»: аналогично флагу «Заблокировать от изменений пользоваетелем» в настройках компонента.

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

    • «Пометить неправильно заполненным»: при попытке сохранить запись по форме поле будет выделено красным, будет отображаться ошибка «Введите корректное значение».

    • «Скрыть»: в режиме просмотра и редактирования формы компонент не отображается, для него не выполняется проверка обязательности и корректности заполнения.

    • «Отобразить»: снимается пометка скрытого компонента.

Следует понимать, что соответствующие этим действиям флаги в настройках компонента (например, флаг «Заблокировать от изменений пользователем» или «Обязательное поле») регулируют начальное состояние компонента - то, которое он будет иметь сразу при открытии формы. Это состояние могут менять как заданные действия, так и скрипты формы или отдельных компонентов.

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

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

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

  • Если выполняется сравнение компонентов динтаблицы между собой, то сравниваться будут key/value компонентов в одном блоке.

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

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

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

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

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

3.3.4.8.1. Пример настройки: одно поле влияет на состав отображаемых полей

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

  1. «Техподдержка»: инцидент должен содержать детальное описание, используемую версию, ход выполнения и файл с логами;

  2. «Генерация лицензий»: для предоставления лицензий необходимо знать название клиента, количество пользователей и срок действия лицензии;

  3. «Сертификация»: в этом случае доступен выбор типа сертификата.

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

Создадим такую форму:

Рисунок 3.51. Форма «Инцидент» в режиме конструктора

Форма «Инцидент» в режиме конструктора

Видно, что все компоненты, которые нужно показывать/отображать опционально, расположены в отдельных таблицах. В нашем случае эти таблицы такие:

  • table-support - таблица с описанием инцидента для категории «Техподдержка»

  • table-license - таблица со сведениями о лицензии

  • table-sert - таблица с выбором сертификата.

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

Поле «Категория» у нас типа «Выпадающий список», у него задан идентификатор type и настроены элементы:

Рисунок 3.52. Элементы компонента «Категория»

Элементы компонента «Категория»

Настроим начальное состояние компонентов: поскольку у нас в поле «Категория» по умолчанию выбрано значение «Техподдержка», то и отображенной оставим только таблицу table-support, а в настройках таблиц table-license и table-sert включим флаг «Скрытое поле». В режиме редактирования формы результат будет выглядеть так:

Рисунок 3.53. Начальное состояние формы «Инцидент»

Начальное состояние формы «Инцидент»

Теперь перейдем к настройке условий. В навигаторе выделим папку «Условные действия», которая расположена в нашей форме, и выберем пункт «Добавить группу действий». В появившемся диалоге введем название case_category - здесь будут расположены условия, реагирующие на состояние поля «Категория»:

Рисунок 3.54. Новая группа условий

Новая группа условий

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

Добавим первое условие. В нем укажем, что в случае, когда в поле «Категория» выбрано значение «Техподдержка», нужно отобразить таблицу со сведениями об инциденте:

Рисунок 3.55. Действие 1: отобразить таблицу support

Действие 1: отобразить таблицу support

Здесь в качестве левого операнда выбран компонент type, который сравнивается с текстовым значением 01 - кодом элемента «Техподдержка» в списке элементов компонента. Если это сравнение истинно, то нужно включить видимость компонента table-support.

Кроме отображения нужной таблицы с описанием инцидента нужно еще и скрыть таблицы, относящиеся к другим категориям. Добавим эти действия:

Рисунок 3.56. Действие 1: отобразить таблицу support, скрыть таблицы sert и license

Действие 1: отобразить таблицу support, скрыть таблицы sert и license

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

Рисунок 3.57. Настроенные действия

Настроенные действия

Здесь для каждого элемента выпадающего списка «Категория» указано, что одна из таблиц должна быть отображена, остальные таблицы - скрыты.

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

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

Теперь вернемся в режим конструктора формы. В таблице table-license есть поле ввода даты окончания действия лицензии date-end и флаг check, который означает, что у лицензии неограниченный срок действия:

Рисунок 3.58. Сведения о лицензии на форме

Сведения о лицензии на форме

В этом случае логично как минимум не требовать заполнения даты date-end, а еще лучше - блокировать поле ввода даты при включении флага. Такое поведение тоже можно реализовать с помощью условий и действий.

Во-первых, проверим элементы компонента «Выбор вариантов» - нам понадобится код элемента «Не ограничен»:

Рисунок 3.59. Элементы компонента check

Элементы компонента check

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

Рисунок 3.60. Группа действий для даты окончания действия

Группа действий для даты окончания действия

Здесь мы в качестве оператора использовали текстовое сравнение «Содержит», поскольку в ключе компонента «Выбор вариантов» хранятся коды всех выбранных элементов (см. описание формата компонентов форм). Правый операнд - код элемента «Не ограничен» not_limited.

Первое условие расшифровывается так: если key компонента check содержит элемент not_limited, то необходимо снять обязательность заполнения компонента date-end и заблокировать его от изменений.

Второе условие - обратное к первому: если key компонента check не содержит элемент not_limited, то необходимо разблокировать компонент date-end и сделать его обязательным для заполнения.

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

Рисунок 3.61. Режим заполнения формы, указана категория «Сертификация»

Режим заполнения формы, указана категория «Сертификация»

Для категории «Сертификация» отображен только выбор типа сертификата, остальные сведения скрыты.

Рисунок 3.62. Режим заполнения формы, указана категория «Генерация лицензий», флаг отключен

Режим заполнения формы, указана категория «Генерация лицензий», флаг отключен

Для категории «Генерация лицензий» при отключенном флаге поле выбора даты доступно. После клика в этом поле оно подсвечено красным, как обязательное.

Рисунок 3.63. Режим заполнения формы, указана категория «Генерация лицензий», флаг включен

Режим заполнения формы, указана категория «Генерация лицензий», флаг включен

В том же случае после включения флага поле ввода даты блокируется.

3.3.4.8.2. Пример настройки: работа с динамическими таблицами

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

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

Создадим форму для этого заказа:

Рисунок 3.64. Форма «Заказ»

Форма «Заказ»

На форме есть два компонента, содержащие максимальную цену за единицу товара (max_price) и максимальное количество единиц (max_count), доступные без обоснования. В нашем примере эти поля имеют значение по умолчанию и не скрываются.

Создадим в папке «Условные действия» новую группу действий max_control, в которой настроим нужную нам логику:

Рисунок 3.65. Настроенные действия для заказа

Настроенные действия для заказа

Первое условие: если в таблице цена за единицу (значение поля price в таблице) больше, чем максимально допустимая max_price, или указанное количество (поле count в таблице) больше максимально допустимого max_count, то поле обоснования reason в этой же строке сделать обязательным.

Второе условие: если оба поля (и цена за единицу, и количество) не превышают допустимых значений, то сделать ввод обоснования не обязательным.

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

Рисунок 3.66. Пример заполнения формы «Заказ»

Пример заполнения формы «Заказ»

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

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

Рисунок 3.67. Форма мероприятий

Форма мероприятий

У компонента type, регулирующего длительность, есть два элемента:

  • «Вручную» с кодом 01

  • «На постоянной основе» с кодом 02

Так же, как и в первом примере, настроим условные действия для этой формы:

Рисунок 3.68. Условия для компонентов в динамических таблицах

Условия для компонентов в динамических таблицах

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

Рисунок 3.69. Пример работы действий

Пример работы действий

3.3.4.9. Настройка произвольной маски поля

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

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

Регулярные выражения (RegExp) - язык формального описания шаблонов для поиска текста и проверки соответствия текста этому шаблону.

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

В Synergy IDE регулярные выражения используются для настройки шаблона текста, введенного в поле. Значение поля считается корректным, если в нем нашлась подстрока, соответствующая шаблону, и некорректным в противном случае.

3.3.4.9.1. Основы синтаксиса

Простое сравнение

Простой вариант сравнения строки с шаблоном - сравнение введенного символа с некоторой константой. Иначе говоря, сравнение символа с самим собой. Для этого достаточно в выражение добавить нужный символ, например, @. В этом случае сравнение будет успешным в том случае, если в введенной строке нашелся указанный символ (или последовательность символов).

Специальные символы и экранирование

Синтаксис RegExp поддерживает большое количество специальных символов, в частности: . ^ $ * + ? { } [ ] | ( ) Для поиска этих символов в введенной строке следует экранировать их в шаблоне с помощью символа /, например:

  • /. - для указания точки

  • /$ - для указания символа $

Поиск и сравнение строк

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

  1. найдена подстрока, соответствующая выражению; подстрока, соответствующая выражению, может располагаться в любой части введенной строки. Например, выражению abc соответствуют строки abcd, abcabcabc, wwwabcz и так далее.

  2. вся строка целиком соответствует выражению; для этого необходимо заключать шаблон в специальные символы ^ (начало строки) и $ (конец строки). Так, шаблону ^abc$ будет соответствовать ровно строка abc, но не строки abcd, abcabcabc, wwwabcz и так далее.

Наборы символов и диапазоны

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

Наборы заключаются в квадратные скобки [ ]. В качестве примера можно привести набор [ABC] - ему соответствут любой из символов A, B или C (но не a, b или c), расположенный в произвольной подстроке.

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

  • [A-Z] - соответствует любой букве латинского алфавита в верхнем регистре;

  • [0-9] - соответствует любой цифре;

  • [а-я] - любая буква кириллического алфавита.

Наборы можно комбинировать произвольным образом:

  • [A-Za-z0-9] - любая буква латинского алфавита в верхнем или нижнем регистре или любая цифра;

  • [А-Яа-яЁё] - любая буква кириллического алфавита; обратите внимание, что буква Ё не входит в диапазон А-Я и требует отдельного явного указания.

Если первым символом в наборе (сразу после [) указан символ ^, то он служит маркером отрицания: соответствовать набору будут строки, содержащие любые символы, кроме перечисленных в наборе:

  • [^0-9] - строка не содержит цифр;

  • [^ёЁ] - строка не содержит букв Ё/ё.

Квантификаторы (повторения)

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

Количество повторений символов из набора указывается после этого набора в фигурных скобках { }.

Квантификатор Число повторений Пример выражения Подходящие строки

{n}

Ровно n раз

[0-9]{12}

123456789012, 999999999999

{m,n}

От m до n включительно

[a-z]{3,6}

qwerty, abcd, zzz

{m,}

Не менее m раз

[A-Za-z]{2,}

com, ru, net, domain

{,n}

Не более n раз

[0-9]{,3}

99, 182, 0

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

Квантификатор Аналог Значение

?

{0,1}

Ноль или одно вхождение

*

{0,}

Ноль или более вхождений

+

{1,}

Одно или более

Некоторые Escape-последовательности

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

  • . (точка) - любой символ (в том числе пробел, знак препинания и так далее);

  • /s - любой пробельный символ (пробел, табуляция, перенос строки)

  • /S - любой не пробельный символ, т,е, не являющийся пробелом, символом табуляции или переноса строки

  • /d - любая цифра

  • /D - любой символ, не являющийся цифрой

  • /w - символы латиницы, цифры и нижний пробел _

  • /W - любой символ, кроме латиницы, цифр и нижнего пробела

  • /b - граница слова

  • /B - не граница слова

Перечисления

Чтобы проверить, удовлетворяет ли строка одному из шаблонов, можно воспользоваться аналогом оператора OR, который в регулярных выражениях записывается с помощью символа |. Например, шаблону /d{16}|[A_Za-z]{2}[A-Za-z0-9]{18} будет соответствовать как 16-значный номер платежной карточки, так и 20-значный номер счета (если они введены без пробелов и дефисов).

3.3.4.9.2. Использование в конструкторе форм

В настройках компонента «Однострочное поле» добавлен новый флаг «Регулярные выражения»:

Рисунок 3.70. Настройки компонента «Однострочное поле»

Настройки компонента «Однострочное поле»

Когда этот флаг включен, маска, указанная в настройках, интерпретируется как регулярное выражение. Соответствующим образом при включенном флаге меняется и текст подсказок, отображаемых по нажатию на :

Рисунок 3.71. Подсказки при использовании регулярных выражений

Подсказки при использовании регулярных выражений

Вы можете вставить выражение из подсказки, просто кликнув по нему.

Вид и поведение поля с настроенной таким образом маской:

  • если поле пусто, то в режиме конструктора и заполнения формы поле содержит только плейсхолдер (а не ___, например, в отличие от маски старого вида):

Рисунок 3.72. Пустое поле с настроенной маской и плейсхолдером

Пустое поле с настроенной маской и плейсхолдером

  • по мере ввода текста, не соответствующего выражению, поле подсвечивается красным:

Рисунок 3.73. Поле с настроенной маской при вводе некорректного значения

Поле с настроенной маской при вводе некорректного значения

  • подсветка поля пропадает, когда содержимое поля становится соответствующим выражению:

Рисунок 3.74. Поле с настроенной маской при вводе корректного значения

Поле с настроенной маской при вводе корректного значения

Если значение поля не соответствует указанному регулярному выражению, оно считается некорректно заполненным, и данные формы с таким значением не сохраняются.

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

Для упрощения разработки RegExp можно использовать специальные сайты, позволяющие проверить настроенный шаблон, например:

  • regex101 - ресурс позволяет не только проверить соответствие текстовых строк выражению, но и содержит некоторые часто используемые подстановки, упрощающие описание выражения;

  • regexr

3.3.4.9.3. Обязательность поля с настроенной маской

До версии Synergy 4.0 поле с настроенной маской было всегда обязательным, вне зависимости от состояния флага «Обязательное поле» в настройках этого компонента. Так происходило потому, что пустое поле не соответствовало маске, следовательно, считалось заполненным некорректно. Из-за этого невозможно было настроить поведение вида «поле с номером телефона должно соответствовать маске, но не обязательно для заполнения».

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