Платформа 3V/Формы/Рекомендации по использованию и оптимизации: различия между версиями

Материал из 3v-wiki
Перейти к навигации Перейти к поиску
 
(не показаны 4 промежуточные версии 2 участников)
Строка 3: Строка 3:
 
# Если в формах используется получение значения связанных атрибутов справочников больших объемов, необходимо прописывать настройку данного атрибута как получение значения транзитивного атрибута справочника, а не как связанного, через конструкцию TransitiveAttributeDefinitionDto. Данная настройка используется потому, что связанный атрибут влечет построение всего связанного справочника, а транзитивный - только используемых значений. Аналогичную настройку необходимо использовать при настройке отчетов.
 
# Если в формах используется получение значения связанных атрибутов справочников больших объемов, необходимо прописывать настройку данного атрибута как получение значения транзитивного атрибута справочника, а не как связанного, через конструкцию TransitiveAttributeDefinitionDto. Данная настройка используется потому, что связанный атрибут влечет построение всего связанного справочника, а транзитивный - только используемых значений. Аналогичную настройку необходимо использовать при настройке отчетов.
 
# В формах должны присутствовать только те контролы, источники, выражения, правила/условия и действия, которые используются в текущей форме, не должно быть лишних источников, выражений, условий и действий, которые не используются.
 
# В формах должны присутствовать только те контролы, источники, выражения, правила/условия и действия, которые используются в текущей форме, не должно быть лишних источников, выражений, условий и действий, которые не используются.
# Для раскрывающегося списка, источником которого является большой справочник необходимо настроить серверный поиск.
+
# Для раскрывающегося списка, источником которого является большой справочник необходимо настроить серверный поиск. При серверном поиске выбор значения происходит при вводе и поиске введенного значения по справочнику.
 
# По возможности, не злоупотреблять настройкой disableDataEditingRuleId, где указывается условие блокировки контролов при открытии формы, лучше настраивать блокировку на уровне прав всей формы, либо для каждого контрола отдельно.  
 
# По возможности, не злоупотреблять настройкой disableDataEditingRuleId, где указывается условие блокировки контролов при открытии формы, лучше настраивать блокировку на уровне прав всей формы, либо для каждого контрола отдельно.  
# Желательно использовать меньше выражений типа EntryExpressionByDictionaryRequestDto, где происходит запрашивание справочника для каждого выражения данного типа.
+
# Желательно использовать меньше выражений типа EntryExpressionByDictionaryRequest и EntryExpressionDictionaryDataFilterByIndicatorParameter, где происходит запрашивание справочника для каждого выражения данного типа.
 
# Продумывать использование настройки doActionOnChangeValue для контрола, чтобы не происходило постоянного обновления зависимых объектов при изменении значения в контроле, включать данную настройку только для тех контролов, при изменении которых необходимо выполнение действия для дальнейшего заполнения формы.
 
# Продумывать использование настройки doActionOnChangeValue для контрола, чтобы не происходило постоянного обновления зависимых объектов при изменении значения в контроле, включать данную настройку только для тех контролов, при изменении которых необходимо выполнение действия для дальнейшего заполнения формы.
 
# Выключать настройку isReadOnly для справочников необходимо только в том случае, если действительно необходимо сохранение данных в источник при выполнении действия сохранения всех источников, чтобы не происходило сохранения тех источников, которые этого не требуют.
 
# Выключать настройку isReadOnly для справочников необходимо только в том случае, если действительно необходимо сохранение данных в источник при выполнении действия сохранения всех источников, чтобы не происходило сохранения тех источников, которые этого не требуют.
# Для источников формы необходимо описывать в настройках dictionaryAttributes только те атрибуты, которые необходимы для использования в текущей форме, т.е. все лишние атрибуты, которые не используются, в форме запрашиваться не должны.
+
# Для минимизации перестроения источников необходимо проверить необходимость присутствия в контроле "rebuildDependentsObjectOnChange": true, и выставить "rebuildDependentsObjectOnChange": false для тех контролов, которые не предполагают обновления других элементов на странице при смене значения.
 +
# Проверить наличие действий во время открытия формы в conditionActionIdsOnOpen и удостовериться, что все действия по открытию карточки действительно нужны и быстро отрабатывают.
 +
<div class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;">
 +
<div style="font-weight:bold;line-height:1.6;">Пример задания серверного поиска в контроле выпадающего списка</div>
 +
<div class="mw-collapsible-content mw-collapsed-content">
  
 +
<syntaxhighlight lang="JSON" line>
 +
    {
 +
      "discriminator": "DictionarySourceEntry",
 +
      "dataSourceId": 1,
 +
      "expressionId": null,
 +
      "id": 1,
 +
      "caption": "Проекты",
 +
      "enable": true,
 +
      "enableRuleIds": [],
 +
      "searchSettings": {
 +
        "maxElements": 500,  //количество выводимых элементов в поиске
 +
        "minInputChars": 2,  // минимальное число символов для начала поиска
 +
        "searchMode": "Dictionaries", // обозначение серверного поиска
 +
        "debounceMs": 300 //время отклика
 +
      },
 +
      "hasServerFiltration": true,
 +
      "maxElements": 100,
 +
      "displayAttribute": {
 +
        "id": 2,
 +
        "discriminator": "OwnAttributeDefinitionDto"
 +
      },
 +
      "doActionOnChangeValue": true,
 +
      "hasMultipleValue": true,
 +
      "hasNullableValue": false
 +
    }
 +
</syntaxhighlight>
 +
</div></div>
 
=== Метрики ===
 
=== Метрики ===
 
Для анализа можно пользоваться метриками. Каждый сервис платформы предоставляет как стандартный набор метрик (потребление памяти и т. п.), так и специфические для конкретного сервиса, по адресу '''http(s)://<host>/<service>/metrics'''<br>
 
Для анализа можно пользоваться метриками. Каждый сервис платформы предоставляет как стандартный набор метрик (потребление памяти и т. п.), так и специфические для конкретного сервиса, по адресу '''http(s)://<host>/<service>/metrics'''<br>
  
 
Визуальное их отображение настроено в графане:
 
Визуальное их отображение настроено в графане:
* [https://grafana.3v-group.net/d/BlsUbysGz/3v-kartochki?orgId=1 на стенде 3V]
+
* [https://grafana.3v-group.net/d/BlsUbysGz/3v-formy?orgId=1 на стенде 3v-group.net]
* [https://grafana.bright-soft.org/d/BlsUbysGz/3v-kartochki?orgId=1 на стенде bright-soft]
+
* [https://grafana.dev.3v-cloud.com/d/BlsUbysGz/3v-formy?orgId=1 на стенде dev.3v-cloud.com]
Следует обращать особое внимание на графики "макс. кол-во элементов справочников по Id карточек" (метрика cards_instance_max_dictionary_element_count) и "суммарное кол-во элементов справочников по Id карточек" (метрика cards_instance_total_dictionary_element_count) для обнаружения карточек, в которые загружаются большие справочники.<br>
+
* [https://grafana.3v-cloud.ru/d/BlsUbysGz/3v-formy?orgId=1 на стенде 3v-cloud.ru]
Также следует обращать внимание на кол-во открытых на данный момент карточек (метрика cards_instances_total). Если отображается кол-во, не соответствующее действительности (пользователь уже закрыл карточки, а они числятся открытыми), то это повод завести ошибку на платформу.
+
* [https://grafana.3v-cloud.com/d/BlsUbysGz/3v-formy?orgId=1 на стенде 3v-cloud.com]
 +
Следует обращать особое внимание на:
 +
* графики "макс. кол-во элементов справочников по Id форм" (метрика cards_instance_max_dictionary_element_count) и "суммарное кол-во элементов справочников по Id форм" (метрика cards_instance_total_dictionary_element_count) для обнаружения карточек, в которые загружаются большие справочники;
 +
* таблицы "среднее время открытия форм (сек)" и "максимальное время открытия форм (сек.)". Особое внимание стоит уделять формам, которые открывает или будет открывать обычный пользователь. Чем выше время, тем меньше людей смогут параллельно работать с системой. Рекомендуемое время открытия - менее 5 сек. Все что больше - это точно повод задуматься и посмотреть, что стоит настроить иначе;
 +
* на кол-во открытых на данный момент карточек (метрика cards_instances_total). Если отображается кол-во, не соответствующее действительности (пользователь уже закрыл карточки, а они числятся открытыми), то это повод завести ошибку на платформу.

Текущая версия на 13:26, 20 декабря 2022

Рекомендации по настройкам форм:

  1. Минимизировать действия при открытии формы, которые направлены на перестроение и получение данных из отчетов и справочников больших объемов. Например, открывать форму со значениями по умолчанию, либо, при открытии формы с параметром, настроить отложенное построение отчетов.
  2. Если в формах используется получение значения связанных атрибутов справочников больших объемов, необходимо прописывать настройку данного атрибута как получение значения транзитивного атрибута справочника, а не как связанного, через конструкцию TransitiveAttributeDefinitionDto. Данная настройка используется потому, что связанный атрибут влечет построение всего связанного справочника, а транзитивный - только используемых значений. Аналогичную настройку необходимо использовать при настройке отчетов.
  3. В формах должны присутствовать только те контролы, источники, выражения, правила/условия и действия, которые используются в текущей форме, не должно быть лишних источников, выражений, условий и действий, которые не используются.
  4. Для раскрывающегося списка, источником которого является большой справочник необходимо настроить серверный поиск. При серверном поиске выбор значения происходит при вводе и поиске введенного значения по справочнику.
  5. По возможности, не злоупотреблять настройкой disableDataEditingRuleId, где указывается условие блокировки контролов при открытии формы, лучше настраивать блокировку на уровне прав всей формы, либо для каждого контрола отдельно.
  6. Желательно использовать меньше выражений типа EntryExpressionByDictionaryRequest и EntryExpressionDictionaryDataFilterByIndicatorParameter, где происходит запрашивание справочника для каждого выражения данного типа.
  7. Продумывать использование настройки doActionOnChangeValue для контрола, чтобы не происходило постоянного обновления зависимых объектов при изменении значения в контроле, включать данную настройку только для тех контролов, при изменении которых необходимо выполнение действия для дальнейшего заполнения формы.
  8. Выключать настройку isReadOnly для справочников необходимо только в том случае, если действительно необходимо сохранение данных в источник при выполнении действия сохранения всех источников, чтобы не происходило сохранения тех источников, которые этого не требуют.
  9. Для минимизации перестроения источников необходимо проверить необходимость присутствия в контроле "rebuildDependentsObjectOnChange": true, и выставить "rebuildDependentsObjectOnChange": false для тех контролов, которые не предполагают обновления других элементов на странице при смене значения.
  10. Проверить наличие действий во время открытия формы в conditionActionIdsOnOpen и удостовериться, что все действия по открытию карточки действительно нужны и быстро отрабатывают.
Пример задания серверного поиска в контроле выпадающего списка
 1     {
 2       "discriminator": "DictionarySourceEntry",
 3       "dataSourceId": 1,
 4       "expressionId": null,
 5       "id": 1,
 6       "caption": "Проекты",
 7       "enable": true,
 8       "enableRuleIds": [],
 9       "searchSettings": {
10         "maxElements": 500,  //количество выводимых элементов в поиске
11         "minInputChars": 2,  // минимальное число символов для начала поиска
12         "searchMode": "Dictionaries", // обозначение серверного поиска
13         "debounceMs": 300 //время отклика
14       },
15       "hasServerFiltration": true,
16       "maxElements": 100,
17       "displayAttribute": {
18         "id": 2,
19         "discriminator": "OwnAttributeDefinitionDto"
20       },
21       "doActionOnChangeValue": true,
22       "hasMultipleValue": true,
23       "hasNullableValue": false
24     }

Метрики

Для анализа можно пользоваться метриками. Каждый сервис платформы предоставляет как стандартный набор метрик (потребление памяти и т. п.), так и специфические для конкретного сервиса, по адресу http(s)://<host>/<service>/metrics

Визуальное их отображение настроено в графане:

Следует обращать особое внимание на:

  • графики "макс. кол-во элементов справочников по Id форм" (метрика cards_instance_max_dictionary_element_count) и "суммарное кол-во элементов справочников по Id форм" (метрика cards_instance_total_dictionary_element_count) для обнаружения карточек, в которые загружаются большие справочники;
  • таблицы "среднее время открытия форм (сек)" и "максимальное время открытия форм (сек.)". Особое внимание стоит уделять формам, которые открывает или будет открывать обычный пользователь. Чем выше время, тем меньше людей смогут параллельно работать с системой. Рекомендуемое время открытия - менее 5 сек. Все что больше - это точно повод задуматься и посмотреть, что стоит настроить иначе;
  • на кол-во открытых на данный момент карточек (метрика cards_instances_total). Если отображается кол-во, не соответствующее действительности (пользователь уже закрыл карточки, а они числятся открытыми), то это повод завести ошибку на платформу.