Поле

PDF
Средний

Добавление поля на страницу записи может быть реализовано двумя способами:

1. С помощью мастера разделов (см. статьи "Мастер разделов", "Как настроить поля страницы").

В результате работы мастера разделов в пользовательском пакете будут созданы схема замещающего базового объекта (например, объекта Активность) и схема замещающей модели представления базовой страницы записи (например, ActivityPageV2). В схему замещающей модели представления будет добавлена новая колонка. В схему замещающей модели представления страницы записи в массив diff будет добавлен конфигурационный объект с настройками расположения на странице нового поля.

На заметку.

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

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

2. Путем создания схемы замещающего базового объекта и схемы замещающей модели представления страницы средствами разработки.

Типы полей 

Поле с изображением 

Особенности добавления на страницу записи поля с изображением (фото контакта, товара, логотип контрагента и т.д.):

  1. Колонка объекта, которая используется для поля с изображением, должна иметь тип — "Ссылка на изображение". При этом ее следует указать в качестве системной колонки Изображение объекта.
  2. В коллекцию изображений схемы страницы записи необходимо добавить изображение по умолчанию.
  3. В массив diff схемы страницы записи поле с изображением добавляется с использованием вспомогательного контейнера-обертки с CSS-классом image-edit-container.
  4. Конфигурационный объект с настройками поля с изображением в свойстве values должен содержать свойства:
    • getSrcMethod — метод, который получает изображение по ссылке;
    • onPhotoChange — метод, который вызывается при изменении изображения;
    • readonly — свойство, которое определяет возможность редактирования (изменения, удаления) изображения;
    • generator — генератор элемента управления. Для поля с изображением необходимо указать ImageCustomGeneratorV2.generateCustomImageControl;
    • beforeFileSelected — метод, который вызывается перед вызовом диалогового окна выбора изображения.
  5. В коллекцию методов схемы страницы записи необходимо добавить:
    • метод, который получает изображение по ссылке;
    • метод, который вызывается при изменении изображения;
    • метод, который сохраняет ссылку на измененное изображение в колонке объекта;
    • метод, который вызывается перед вызовом диалогового окна выбора изображения.

Вычисляемое поле 

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

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

Общий алгоритм добавления вычисляемого поля 

  1. В схему объекта страницы добавить колонку для хранения значения вычисляемого поля.
  2. В модели представления страницы настроить зависимость атрибута, указав имена колонок, от которых он зависит, и задать имя обработчика.
  3. В коллекцию методов модели представления добавить реализацию метода-обработчика.
  4. Настроить визуальное отображение вычисляемого поля в свойстве diff модели представления.

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

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

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

  • сolumns — массив имен колонок, от значений которых зависит значение текущей колонки;
  • methodName — имя метода-обработчика.

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

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

Мультивалютное поле 

Одной из распространенных задач конфигурирования системы является добавление на страницу элемента управления Мультивалютное поле. Этот элемент предоставляет пользователю возможность не просто вводить денежную сумму, но и указывать ее валюту. Также он позволяет фиксировать эквивалент суммы в базовой валюте, которая задана в настройках системы. При изменении валюты существующая сумма автоматически пересчитывается с учетом обменных курсов валют. На рисунке 1 представлено мультивалютное поле в интерфейсе системы.

Рис. 1. — Мультивалютное поле

Для добавления мультивалютного поля на страницу записи необходимо:

1. Добавить в схему объекта четыре колонки:

  • колонку — справочник валюты;
  • колонку курса валюты;
  • колонку для хранения общей суммы в выбранной валюте;
  • колонку для хранения суммы в базовой валюте.

На заметку.

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

2. Указать в объявлении класса модели представления в качестве зависимостей три модуля:

  • MoneyModule,
  • MultiCurrencyEdit,
  • MultiCurrencyEditUtilities.

3. Подключить к модели представления миксин Terrasoft.MultiCurrencyEditUtilities и инициализировать его в переопределенном методе init().

4. Добавить конфигурационный объект с настройками мультивалютного поля в массив diff схемы модели представления страницы записи. В нем в свойстве values кроме общих для всех элементов управления свойств должны содержаться свойства:

  • primaryAmount — наименование колонки, которая содержит сумму в базовой валюте;
  • currency — наименование колонки, которая ссылается на справочник валют;
  • rate — наименование колонки, которая содержит курс валюты;
  • generator — генератор элемента управления. Для мультивалютного поля необходимо указать MultiCurrencyEditViewGenerator.generate.

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

Действия над полями 

Добавить валидацию к полю 

Валидация — это проверка значений заполненных полей на соответствие определенным требованиям. Валидация значений полей страницы Creatio реализуется на уровне колонок моделей представления страниц. Логика проверки значения поля выполняется в пользовательском методе-валидаторе.

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

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

Если валидация значения прошла успешно, то метод-валидатор возвращает объект с пустой строкой.

Чтобы валидация поля начала работать, нужно выполнить привязку соответствующей колонки модели представления конкретному валидатору. Для этого в модели представления необходимо переопределить базовый метод setValidationConfig(), в котором вызвать метод addColumnValidator().

Метод addColumnValidator() принимает два параметра:

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

Важно.

Если валидация поля реализуется в схеме замещающей модели представления базовой страницы, то для того, чтобы были корректно проинициализированы валидаторы полей базовой страницы, перед вызовом метода addColumnValidator() необходимо добавить вызов родительской реализации метода setValidationConfig().

Последовательность действий для добавления проверки корректности значения поля:

  1. Добавить в коллекцию методов модели представления метод-валидатор, проверяющий значение поля.
  2. Переопределить метод setValidationConfig(), в котором выполнить привязку валидатора к соответствующей колонке модели представления.

Установить для поля значение по умолчанию 

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

Установить значение по умолчанию можно двумя способами:

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

Виды значений по умолчанию:

Название Описание
Установить константу Строка, число, значение из справочника, логическое значение.
Установить из системной настройки Полный список настроек доступен из конфигурации в разделе Системные настройки, и он может быть дополнен пользовательской системной настройкой.
Установить из системной переменной

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

  • Новый идентификатор;
  • Новый последовательный идентификатор;
  • Текущий пользователь;
  • Контакт текущего пользователя;
  • Контрагент текущего пользователя;
  • Текущее значение даты и времени;
  • Текущее значение даты;
  • Текущее значение времени.
Не устанавливать значение по умолчанию  

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

Применить фильтрацию к справочным полям 

В Creatio существует два способа применения фильтрации к справочным полям страниц записи:

  1. Использование бизнес-правила FILTRATION.
  2. Явное указание фильтров в описании колонки в свойстве модели attributes.

Использование бизнес-правила FILTRATION целесообразно в случае, когда к полю необходимо применить простой фильтр — по определенному значению или атрибуту. Бизнес-правила подробно описаны в статье "Бизнес-правила и их применение". Подробный пример по использованию бизнес-правила FILTRATION приведен в статье "Пример применения правила FILTRATION".

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

Настройка фильтров справочного поля в свойстве модели attributes:

  1. В свойство attributes модели представления добавьте новый атрибут с именем колонки объекта, для которой устанавливаются фильтры.
  2. Для этой колонки объявите свойство lookupListConfig — конфигурационный объект, содержащий в себе такие свойства (опционально):
    • сolumns — массив имен колонок, которые будут добавлены к запросу дополнительно к Id и первичной для отображения колонке;

    • orders — массив конфигурационных объектов, которые определяют сортировку данных при отображении;

    • filter — метод, возвращающий объект класса Terrasoft.BaseFilter или его наследника, который будет применен к запросу;
    • или filters — массив фильтров (методов, возвращающих коллекции класса Terrasoft.FilterGroup).

Фильтры в коллекцию добавляются с помощью метода add(), который имеет следующие параметры:

Название Тип данных Описание
key String

Ключ.

item Mixed Элемент.
index Number Индекс для вставки. Если не указан, то не учитывается.

В качестве параметра item выступает объект класса Terrasoft.BaseFilter или его наследника. Методы создания фильтров с описаниями приведены в статье "Работа с фильтрами".

Важно.

По умолчанию фильтры в коллекции объединяются с использованием логической операции AND. Если необходимо применить операцию OR, ее нужно указать явно в свойстве logicalOperation объекта Terrasoft.FilterGroup.

Заблокировать поля 

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

Подробно механизм блокировки полей страницы записи описан в статье Механизм блокировки полей страницы записи.

Важно.

Механизм блокировки реализован в версиях приложения 7.11.1 и выше.

Добавить автонумерацию к полю 

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

Для реализации задачи автонумерации возможно два варианта решения:

  • реализовать автонумерацию на стороне клиента;
  • реализовать автонумерацию на сервере.

Чтобы реализовать автонумерацию на стороне клиента, необходимо переопределить базовый виртуальный метод onEntityInitialized() и в нем вызвать метод getIncrementCode() базовой схемы страницы записи BasePageV2.

Метод getIncrementCode() принимает два параметра:

  • callback — функция, которая будет вызвана при получении ответа от сервиса. Ответ необходимо передать в соответствующую колонку (атрибут);
  • scope — контекст, в котором будет вызвана функция callback (необязательный параметр).

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

  • Указать схему объекта, для которого будет осуществляться генерация.
  • Вызвать действие [Сгенерировать номер по порядку].
  • Передать сгенерированное значение в необходимую колонку объекта.

На заметку.

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

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

  • [Entity]CodeMask — маска номера объекта,
  • [Entity]LastNumber — текущий номер объекта,

где Entity — это наименование того объекта, к колонке которого будет применяться автонумерация. Например, InvoiceCodeMask (Маска номера счета) и InvoiceLastNumber (Текущий номер счета).

Добавить новое поле
Средний

Исходный код 

Пакет с реализацией примеров можно скачать по ссылке.

Пример 1 

Описание примера 

Добавить вручную на страницу активности новое поле Место встречи.

Алгоритм реализации примера 

1. Создать схему замещающего объекта и добавить в него новую колонку 

Создайте схему замещающего объекта Активность (Activity) и добавьте в него новую колонку Место встречи (Meeting place) типа "строка" (рис. 1). Процесс создания схему замещающего объекта описан в статье "Cоздать схему объекта".

Рис. 1. — Добавление пользовательской колонки в схему замещающего объекта

2. Создать схему замещающей модели представления страницы активности 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Cтраница редактирования активности (Activity edit page) (рис. 2). Процесс создания схемы замещающей модели представления страницы описан в статье "Cоздать клиентскую схему".

Рис. 2. — Свойства схемы замещающей модели представления страницы записи

3. Добавить локализуемую строку с заголовком поля 

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

Рис. 3. — Добавление в схему локализуемой строки

Для созданной строки укажите (рис. 4):

  • Название (Name) — "MeetingPlaceCaption";
  • Значение (Value) — "Место встречи" ("Meeting place").
Рис. 4. — Свойства пользовательской локализируемой строки

4. Добавить новое поле на страницу активности 

Добавьте в массив diff конфигурационный объект с настройками расположения поля Место встречи (Meeting place) на странице.

Свойства массива diff подробно описаны в статье "Массив diff".

Исходный код схемы замещающей модели представления:

define("ActivityPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Activity",
        // Отображение нового поля на странице записи.
        diff: /**SCHEMA_DIFF*/[
            // Метаданные для добавления поля [Место встречи].
            {
                // Операция добавления компонента на страницу.
                "operation": "insert",
                // Мета-имя родительского контейнера, в который добавляется поле.
                "parentName": "Header",
                // Поле добавляется в коллекцию компонентов
                // родительского элемента.
                "propertyName": "items",
                // Имя колонки схемы, к которой привязан компонент.
                "name": "UsrMeetingPlace",
                "values": {
                    // Заголовок поля.
                    "caption": {"bindTo": "Resources.Strings.MeetingPlaceCaption"},
                    // Расположение поля.
                    "layout": {
                        // Номер столбца.
                        "column": 0,
                        // Номер строки.
                        "row": 5,
                        // Диапазон занимаемых столбцов.
                        "colSpan": 12
                    }
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

После сохранения схемы и обновления страницы приложения с очисткой кэша на странице активности появится новое поле (рис. 5).

Рис. 5. — Демонстрация результата выполнения примера

Пример 2 

Описание примера 

Добавить вручную в профиль контакта на странице контакта поле Страна. Отличие данного примера в том, что колонка Страна уже присутствует в схеме объекта.

Алгоритм реализации примера 

1. Создать схему замещающей модели представления страницы контакта 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Схема отображения карточки контакта (Display schema - Contact card, ContactPageV2). Процесс создания схемы замещающей модели представления страницы описан в статье "Cоздать клиентскую схему".

2. Добавить поле Страна в профиль контакта 

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

Исходный код схемs замещающей модели представления:

define("ContactPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Contact",
        diff: [
            // Метаданные для добавления поля [Страна].
            {
                // Операция добавления компонента на страницу.
                "operation": "insert",
                // Мета-имя родительского контейнера, в который добавляется поле.
                "parentName": "ProfileContainer",
                // Поле добавляется в коллекцию компонентов
                // родительского элемента.
                "propertyName": "items",
                // Имя колонки схемы, к которой привязан компонент.
                "name": "Country",
                "values": {
                    // Тип поля — справочник.
                    "contentType": Terrasoft.ContentType.LOOKUP,
                    // Расположение поля.
                    "layout": {
                        // Номер столбца.
                        "column": 0,
                        // Номер строки.
                        "row": 6,
                        // Диапазон занимаемых столбцов.
                        "colSpan": 24
                    }
                }
            }
        ]
    };
});

После сохранения схемы и обновления страницы приложения в профиле контакта на странице контакта появится новое поле (рис. 6).

Рис. 6. — Демонстрация результата выполнения примера
Добавить поле с изображением
Сложный

Описание примера 

Добавить поле с логотипом на страницу статьи базы знаний.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающего объекта Статья базы знаний 

Создайте схему замещающего объекта Статья базы знаний (Knowledge base article) (рис. 1). Процесс создания схемы замещающего объекта описан в статье "Cоздать схему объекта".

Рис. 1. — Свойства схемы замещающего объекта

2. Добавить в схему замещающего объекта новую колонку 

Для созданной колонки укажите (рис. 2):

  • Заголовок (Title) — "Логотип статьи базы знаний" ("Knowledge base article logo");
  • Название (Name) — "UsrLogo";
  • Тип данных (Data type) — "Ссылка на изображение" ("Image Link").
Рис. 2. — Добавление пользовательской колонки в схему замещающего объекта

Обязательно укажите созданную колонку в качестве системной колонки Изображение (Image) объекта (рис. 3).

Рис. 3. — Установка созданной колонки в качестве системной

На заметку. Для отображения всех свойств объекта перейдите в режим расширенного отображения свойств объекта.

После установки всех свойств сохраните и опубликуйте схему замещающего объекта.

3. Создать схему замещающей модели представления страницы записи 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Knowledge base edit page (KnowledgeBasePageV2) (рис. 4). Процесс создания схему замещающей модели представления страницы описан в статье "Cоздать клиентскую схему".

Рис. 4. — Свойства схему замещающей модели представления страницы записи

4. Добавить изображение по умолчанию в ресурсы Images схемы страницы записи 

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

Рис. 5. — Добавление в ресурсы схемы изображения по умолчанию

Для созданного изображения укажите (рис. 6):

  • Название (Name) — "DefaultLogo";
  • Изображение (Image) — файл с изображением по умолчанию (рис. 7).
Рис. 6. — Свойства ресурса схемы
Рис. 7. — Изображение по умолчанию для статьи базы знаний

5. Настроить визуальное отображение поля с логотипом на странице записи 

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

В свойстве diff модели представления (см. исходный код ниже) в массив добавьте конфигурационный объект поля с логотипом с необходимыми параметрами, а также опишите модификации для полей верхней части страницы: Name, ModifiedBy и Type.

Поле с изображением добавляется на страницу с использованием вспомогательного контейнера-обертки PhotoContainer с классом "image-edit-container".

6. В коллекцию методов модели представления страницы добавить реализацию методов: 

  • getPhotoSrcMethod() — получает изображение по ссылке;
  • beforePhotoFileSelected() — вызывается перед открытием диалогового окна выбора изображения;
  • onPhotoChange() — вызывается при изменении изображения;
  • onPhotoUploaded() — сохраняет ссылку на измененное изображение в колонке объекта.

Исходный код схемы замещающей модели представления:

define("KnowledgeBasePageV2", ["KnowledgeBasePageV2Resources", "ConfigurationConstants"],
    function(resources, ConfigurationConstants) {
        return {
            // Название схемы объекта страницы записи.
            entitySchemaName: "KnowledgeBase",
            // Методы модели представления страницы записи.
            methods: {
                // Вызывается перед открытием диалогового окна выбора изображения.
                beforePhotoFileSelected: function() {
                    return true;
                },
                // Получает изображение по ссылке.
                getPhotoSrcMethod: function() {
                    // Получение ссылки на изображение из колонки объекта.
                    var imageColumnValue = this.get("UsrLogo");
                    // Если ссылка установлена, то метод возвращает url файла с изображением.
                    if (imageColumnValue) {
                        return this.getSchemaImageUrl(imageColumnValue);
                    }
                    // Если ссылка не установлена, то возвращает изображение по умолчанию.
                    return this.Terrasoft.ImageUrlBuilder.getUrl(this.get("Resources.Images.DefaultLogo"));
                },
                // Обрабатывает изменение изображения.
                // photo — файл с изображением.
                onPhotoChange: function(photo) {
                    if (!photo) {
                        this.set("UsrLogo", null);
                        return;
                    }
                    // Выполняется загрузка файла в базу данных. По окончании загрузки вызывается onPhotoUploaded.
                    this.Terrasoft.ImageApi.upload({
                        file: photo,
                        onComplete: this.onPhotoUploaded,
                        onError: this.Terrasoft.emptyFn,
                        scope: this
                    });
                },
                // Сохраняет ссылку на измененное изображение.
                // imageId — Id сохраненного файла из базы данных.
                onPhotoUploaded: function(imageId) {
                    var imageData = {
                        value: imageId,
                        displayValue: "Image"
                    };
                    // Колонке изображения присваивается ссылка на изображение.
                    this.set("UsrLogo", imageData);
                }
            },
            // 
            diff: /**SCHEMA_DIFF*/[
                // Контейнер-обертка, в который будет размещен компонент.
                {
                    // Операция добавления.
                    "operation": "insert",
                    // Мета-имя родительского контейнера, в который добавляется компонент.
                    "parentName": "Header",
                    // Изображение добавляется в коллекцию компонентов
                    // родительского контейнера.
                    "propertyName": "items",
                    // Мета-имя компонента схемы, над которым производится действие.
                    "name": "PhotoContainer",
                    // Свойства, передаваемые в конструктор компонента.
                    "values": {
                        // Тип элемента — контейнер.
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        // Имя CSS класса.
                        "wrapClass": ["image-edit-container"],
                        // Размещение в родительском контейнере.
                        "layout": { "column": 0, "row": 0, "rowSpan": 3, "colSpan": 3 },
                        // Массив дочерних элементов.
                        "items": []
                    }
                },
                // Поле [UsrLogo] — поле с логотипом контрагента.
                {
                    "operation": "insert",
                    "parentName": "PhotoContainer",
                    "propertyName": "items",
                    "name": "UsrLogo",
                    "values": {
                        // Метод, который получает изображение по ссылке.
                        "getSrcMethod": "getPhotoSrcMethod",
                        // Метод, который вызывается при изменении изображения.
                        "onPhotoChange": "onPhotoChange",
                        // Метод, который вызывается перед вызовом диалогового окна выбора изображения.
                        "beforeFileSelected": "beforePhotoFileSelected",
                        // Свойство, которое определяет возможность редактирования (изменения, удаления) изображения.
                        "readonly": false,
                        // View-генератор элемента управления.
                        "generator": "ImageCustomGeneratorV2.generateCustomImageControl"
                    }
                },
                // Изменение расположения поля [Name].
                {
                    // Операция слияния.
                    "operation": "merge",
                    "name": "Name",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values": {
                        "bindTo": "Name",
                        "layout": {
                            "column": 3,
                            "row": 0,
                            "colSpan": 20
                        }
                    }
                },
                // Изменение расположения поля [ModifiedBy].
                {
                    "operation": "merge",
                    "name": "ModifiedBy",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values": {
                        "bindTo": "ModifiedBy",
                        "layout": {
                            "column": 3,
                            "row": 2,
                            "colSpan": 20
                        }
                    }
                },
                // Изменение расположения поля [Type].
                {
                    "operation": "merge",
                    "name": "Type",
                    "parentName": "Header",
                    "propertyName": "items",
                    "values": {
                        "bindTo": "Type",
                        "layout": {
                            "column": 3,
                            "row": 1,
                            "colSpan": 20
                        },
                        "contentType": Terrasoft.ContentType.ENUM
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });

После сохранения схемы и обновления страницы приложения на странице статьи базы знаний появится изображение логотипа по умолчанию (рис. 8). При наведении курсора мыши на изображение отобразится меню действий, с помощью которого можно удалить изображение либо установить новое для определенной статьи базы знаний (рис. 9).

Рис. 8. — Логотип по умолчанию
Рис. 9. — Пользовательский логотип
Добавить вычисляемые поля
Средний

Описание примера 

Добавить на страницу заказа поле Остаток для оплаты (Payment balance), в котором будет отображаться разница между суммой заказа и суммой оплаты.

На заметку.

Добавление поля на страницу записи может быть реализовано двумя способами — с помощью мастера разделов и вручную. Процесс добавления поля на страницу записи описан в статье "Добавление нового поля".

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающего объекта 

Выберите пользовательский пакет и на вкладке Схемы (Schemas) выполните пункт меню Добавить (Add) — Замещающий объект (Replacing Object). Для нового объекта укажите в качестве родительского объект Заказ (Order) (рис. 1).

Рис. 1. — Свойства схемы замещающего объекта Заказ

Добавьте в схему замещающего объекта новую колонку Остаток для оплаты (Payment balance) с типом данных Деньги (рис. 2).

Рис. 2. — Добавление пользовательской колонки в схему замещающего объекта

Опубликуйте объект.

2. Создать схему замещающей модели представления страницы заказа 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Страница редактирования заказа (Order Edit Page, OrderPageV2) (рис. 3). Процесс создания схемы замещающей модели представления описан в статье "Разработка конфигурационных элементов".

Рис. 3. — Свойства схемы замещающей модели представления страницы записи

3. Настроить визуальное отображение поля Остаток для оплаты 

В свойстве diff модели представления опишите конфигурационный объект с необходимыми параметрами. Исходный код схемы страницы представлен ниже.

4. В схему модели представления добавить атибут UsrBalance 

В исходом коде схемы модели представления страницы добавьте атрибут UsrBalance в коллекцию атрибутов свойства attributes. В конфигурационном объекте атрибута UsrBalance нужно указать зависимость от колонок Amount и PaymentAmount, а также метод-обработчик — calculateBalance(), который будет рассчитывать значение для колонки UsrBalance.

5. В коллекцию methods модели представления добавить необходимые методы 

В коллекцию methods модели представления добавьте метод-обработчик события изменения колонок Amount и PaymentAmountcalculateBalance(). Этот метод используется в атрибуте UsrBalance.

Важно.

В методе-обработчике нужно учитывать тип данных, которые должны вернуться в расчетное поле в результате. Например, тип данных Дробное число (0.01) предполагает число с двумя знаками после запятой. В таком случае перед записью резальтата в поле объекта необходимо преобразовать его с помощью функции toFixed(). Код примера в таком случае мог бы выглядеть следующим образом:

// Расчет разницы между значениями в колонках [Amoun] и [PaymentAmount].
var result = amount - paymentAmount;
// Результат расчета присваивается в качестве значения колонке [UsrBalance].
this.set("UsrBalance", result.toFixed(2));

Переопределите базовый виртуальный метод onEntityInitialized(). Метод onEntityInitialized() срабатывает после окончания инициализации схемы объекта страницы записи. Добавление в данный метод вызов метода-обработчика calculateBalance(), обеспечит расчет суммы остатка для оплаты в момент открытия страницы записи, а не только после изменений в колонках-зависимостях.

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

define("OrderPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Order",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        // Свойство attributes модели представления.
        attributes: {
            // Название атрибута модели представления.
            "UsrBalance": {
                // Тип данных колонки модели представления.
                dataValueType: Terrasoft.DataValueType.FLOAT,
                // Массив конфигурационных объектов, определяющих зависимости колонки [UsrBalance].
                dependencies: [
                    {
                        // Значение колонки [UsrBalance] зависит от значений колонок [Amount] 
                        // и [PaymentAmount].
                        columns: ["Amount", "PaymentAmount"],
                        // Метод-обработчик, который вызывается при изменении значения одной из колонок [Amount] 
                        // и [PaymentAmount].
                        methodName: "calculateBalance"
                    }
                ]
            }
        },
        // Коллекция методов модели представления страницы записи.
        methods: {
            // Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized, который 
            // срабатывает после окончания инициализации схемы объекта страницы записи.
            onEntityInitialized: function() {
                // Вызывается родительская реализация метода.
                this.callParent(arguments);
                // Вызов метода-обработчика, который рассчитывает значение колонки [UsrBalance].
                this.calculateBalance();
            },
            // Метод-обработчик, который рассчитывает значение колонки [UsrBalance].
            calculateBalance: function() {
                // Проверка, проинициализованы ли в момент открытия страницы записи
                // колонки [Amount] и [PaymentAmount]. Если нет, то для них устанавливаются нулевые значения.
                var amount = this.get("Amount");
                if (!amount) {
                    amount = 0;
                }
                var paymentAmount = this.get("PaymentAmount");
                if (!paymentAmount) {
                    paymentAmount = 0;
                }
                // Расчет разницы между значениями в колонках [Amount] и [PaymentAmount].
                var result = amount - paymentAmount;
                // Результат расчета присваивается в качестве значения колонке [UsrBalance].
                this.set("UsrBalance", result);
            }
        },
        // Визуальное отображение поля [Остаток для оплаты] на странице записи.
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "parentName": "Header",
                "propertyName": "items",
                "name": "UsrBalance",
                "values": {
                    "bindTo": "UsrBalance",
                    "layout": {"column": 12, "row": 2, "colSpan": 12}
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

После сохранения схемы и обновления веб-страницы системы с очисткой кэша на странице заказа появится дополнительное поле Остаток для оплаты (Payment balance), которое будет рассчитываться в зависимости от значений в полях Итого (Total) и Сумма оплаты (Payment amount) (рис. 4).

Рис. 4. — Демонстрация результата выполнения кейса
Добавить мультивалютное поле
Сложный

Описание примера 

Необходимо добавить мультивалютное поле Итого на страницу проекта.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Добавить в схему замещающего объекта необходимые колонки 

В пользовательском пакете создайте схему замещающего объектаПроект (Project) (рис. 2). Подробно создание схему замещающего объекта и добавление колонок описано в статье "Добавление нового поля".

Рис. 2. — Свойства схемы замещающего объекта

В схему замещающего объекта добавьте четыре колонки, свойства которых приведены на рис. 3 — рис. 6. Свойства колонок в дизайнере объектов отображены в расширенном режиме.

Рис. 3. — Свойства колонки UsrCurrency
Рис. 4. — Свойства колонки UsrAmount
Рис. 5. — Свойства колонки UsrPrimaryAmount
Рис. 6. — Свойства колонки UsrCurrencyRate

Для колонки UsrCurrency добавьте значение по умолчанию - системная настройка Базовая валюта (рис. 7).

Рис. 7. — Значение по умолчанию для колонки UsrCurrency

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

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Страница редактирования проекта (Project edit page, ProjectPageV2) (рис. 8). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 8. — Свойства схему замещающей модели представления страницы Проекты

В объявлении класса модели представления в качестве зависимостей добавьте модули MoneyModule, MultiCurrencyEdit, MultiCurrencyEditUtilities (см. исходный код ниже).

3. Добавить необходимые атрибуты 

В свойстве attributes схему замещающей модели представления страницы определите атрибуты UsrCurrency, UsrCurrencyRate, UsrAmount, UsrPrimaryAmount, соответствующие добавленным колонкам схемы объекта.

Мультивалютный модуль работает только с колонкой Currency, поэтому дополнительно создайте атрибут Currency, в котором объявите виртуальную колонку. Эту колонку свяжите с созданной ранее колонкой UsrCurrency при помощи метода-обработчика.

Для корректной работы мультивалютного модуля добавьте атрибуты CurrencyRateList (коллекция курсов валют) и CurrencyButtonMenuList (коллекция для кнопки выбора валюты) (см. исходный код ниже).

4. Подключить к модели представления миксин Terrasoft.MultiCurrencyEditUtilities 

Объявите миксин Terrasoft.MultiCurrencyEditUtilities в свойстве mixins схемы замещающей модели представления страницы. Выполните его инициализацию в переопределенном методе init() схемы модели представления (см. исходный код ниже).

5. Реализовать логику пересчета суммы в зависимости от валюты. 

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

6. Добавить мультивалютное поле на страницу 

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

Исходный код схемы замещающей модели представления:

// В качестве зависимостей нужно указать модули
// MoneyModule, MultiCurrencyEdit и MultiCurrencyEditUtilities.
define("ProjectPageV2", ["MoneyModule", "MultiCurrencyEdit", "MultiCurrencyEditUtilities"],
    function(MoneyModule, MultiCurrencyEdit, MultiCurrencyEditUtilities) {
        return {
            // Название схемы объекта страницы записи.
            entitySchemaName: "Project",
            // Атрибуты модели представления.
            attributes: {
                // Валюта.
                "UsrCurrency": {
                    // Тип данных атрибута — справочник.
                    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
                    // Конфигурация справочнка валют.
                    "lookupListConfig": {
                        "columns": ["Division", "Symbol"]
                    }
                },
                // Курс.
                "UsrCurrencyRate": {
                    "dataValueType": this.Terrasoft.DataValueType.FLOAT,
                    // Зависимости атрибута.
                    "dependencies": [
                        {
                            // Колонки, от которых зависит атрибут.
                            "columns": ["UsrCurrency"],
                            // Метод-обработчик.
                            "methodName": "setCurrencyRate"
                        }
                    ]
                },
                // Сумма.
                "UsrAmount": {
                    "dataValueType": this.Terrasoft.DataValueType.FLOAT,
                    "dependencies": [
                        {
                            "columns": ["UsrCurrencyRate", "UsrCurrency"],
                            "methodName": "recalculateAmount"
                        }
                    ]
                },
                // Сумма в базовой валюте.
                "UsrPrimaryAmount": {
                    "dependencies": [
                        {
                            "columns": ["UsrAmount"],
                            "methodName": "recalculatePrimaryAmount"
                        }
                    ]
                },
                // Валюта — виртуальная колонка для совместимости с модулем MultiCurrencyEditUtilities.
                "Currency": {
                    "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
                    "lookupListConfig": {
                        "columns": ["Division"]
                    },
                    "dependencies": [
                        {
                            "columns": ["Currency"],
                            "methodName": "onVirtualCurrencyChange"
                        }
                    ]
                },
                // Коллекция курсов валют
                "CurrencyRateList": {
                    dataValueType: this.Terrasoft.DataValueType.COLLECTION,
                    value: this.Ext.create("Terrasoft.Collection")
                },
                // Коллекция для кнопки выбора валюты
                "CurrencyButtonMenuList": {
                    dataValueType: this.Terrasoft.DataValueType.COLLECTION,
                    value: this.Ext.create("Terrasoft.BaseViewModelCollection")
                }
            },
            // Миксины модели представления.
            mixins: {
                // Миксин управления мультивалютностью на странице записи.
                MultiCurrencyEditUtilities: "Terrasoft.MultiCurrencyEditUtilities"
            },
            // Методы модели представления страницы.
            methods: {
                // Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized().
                onEntityInitialized: function() {
                    // Вызов родительской реализации метода onEntityInitialized.
                    this.callParent(arguments);
                    this.set("Currency", this.get("UsrCurrency"), {silent: true});
                    // Инициализация миксина управления мультивалютностью.
                    this.mixins.MultiCurrencyEditUtilities.init.call(this);
                },
                // Устанавливает курс валюты.
                setCurrencyRate: function() {
                    //Загружает курс валют на дату начала проекта.
                    MoneyModule.LoadCurrencyRate.call(this, "UsrCurrency", "UsrCurrencyRate", this.get("StartDate"));
                },
                // Пересчитывает сумму.
                recalculateAmount: function() {
                    var currency = this.get("UsrCurrency");
                    var division = currency ? currency.Division : null;
                    MoneyModule.RecalcCurrencyValue.call(this, "UsrCurrencyRate", "UsrAmount", "UsrPrimaryAmount", division);
                },
                // Пересчитывает сумму в базовой валюте.
                recalculatePrimaryAmount: function() {
                    var currency = this.get("UsrCurrency");
                    var division = currency ? currency.Division : null;
                    MoneyModule.RecalcBaseValue.call(this, "UsrCurrencyRate", "UsrAmount", "UsrPrimaryAmount", division);
                },
                // Обработчик изменения виртуальной колонки валюты.
                onVirtualCurrencyChange: function() {
                    var currency = this.get("Currency");
                    this.set("UsrCurrency", currency);
                }
            },
            // Настройка визуализации мультивалютного поля на странице записи.
            diff: /**SCHEMA_DIFF*/[
                // Метаданные для добавления поля [Сумма].
                {
                    // Операция добавления.
                    "operation": "insert",
                    // Мета-имя родительского контейнера, в который добавляется компонент.
                    "parentName": "Header",
                    // Поле добавляется в коллекцию компонентов
                    // родительского контейнера.
                    "propertyName": "items",
                    // Мета-имя компонента схемы, над которым производится действие.
                    "name": "UsrAmount",
                    // Свойства, передаваемые в конструктор компонента.
                    "values": {
                        // Имя колонки модели представления, к которой выполняется привязка.
                        "bindTo": "UsrAmount",
                        // Расположение элемента в контейнере.
                        "layout": { "column": 0, "row": 2, "colSpan": 12 },
                        // Наименование колонки, которая содержит сумму в базовой валюте.
                        "primaryAmount": "UsrPrimaryAmount",
                        // Наименование колонки, которая содержит валюту суммы.
                        "currency": "UsrCurrency",
                        // Наименование колонки, которая содержит курс валюты.
                        "rate": "UsrCurrencyRate",
                        // Свойство определяющее доступность для редактирования поля суммы в базовой валюте.
                        "primaryAmountEnabled": false,
                        // Генератор представления элемента управления.
                        "generator": "MultiCurrencyEditViewGenerator.generate"
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });

После сохранения схемы и обновления страницы приложения на странице проекта появится мультивалютное поле Итого (Amount) (рис. 1). Значение поля будет автоматически пересчитано после выбора валюты из выпадающего списка (рис. 9).

Рис. 9. — Выпадающий список валют
Добавить валидацию к полю
Средний

Исходный код 

Пакет с реализацией примеров можно скачать по ссылке.

Пример 1 

Описание примера 

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

Алгоритм реализации примера 

1. Создать схемы замещающей модели представления страницы продажи 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Страница редактирования продажи (Opportunity edit page, OpportunityPageV2) (рис. 1). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 1. — Свойства схемы замещающей модели представления страницы записи

2. В коллекцию локализуемых строк схемы замещающей модели представления страницы добавить строку ошибки 

Создайте новую локализуемую строку (рис. 2).

Рис. 2. — Добавление в схему локализуемой строки

Для созданной строки укажите (рис. 3):

  • Название (Name) — "CreatedOnLessDueDate";
  • Значение (Value) — "Дата создания должна быть меньше даты закрытия" ("Created on must be less than Closed on”).
Рис. 3. — Свойства пользовательской локализуемой строки

3. В коллекцию methods схемы замещающей модели представления добавить реализацию методов 

  • dueDateValidator() — метод-валидатор, который определяет выполняется ли условие.
  • setValidationConfig() — переопределенный базовый метод, в котором метод-валидатор привязан к колонкам DueDate и CreatedOn.

Исходный код схемы замещающей модели представления:

define("OpportunityPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Opportunity",
        methods: {
            // Метод-валидатор значения колонок [DueDate] и [CreatedOn].
            dueDateValidator: function() {
                // Переменная для хранения сообщения об ошибке валидации.
                var invalidMessage = "";
                // Проверка значений колонок [DueDate] и [CreatedOn].
                if (this.get("DueDate") < this.get("CreatedOn")) {
                    // Если значение колонки [DueDate] меньше значения колонки [CreatedOn], 
                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением
                    // об ошибке валидации.
                    invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");
                }
                // Объект, свойство которого содержит сообщение об ошибке валидации.
                // Если валидация прошла успешна, в объекте возвращается пустая строка.
                return {
                    // Сообщение об ошибке валидации.
                    invalidMessage: invalidMessage
                };
            },
            // Переопределение базового метода, инициализирующего пользовательские валидаторы.
            setValidationConfig: function() {
                // Вызывает инициализацию валидаторов родительской модели представления.
                this.callParent(arguments);
                // Для колонки [DueDate] добавляется метод-валидатор dueDateValidator().
                this.addColumnValidator("DueDate", this.dueDateValidator);
                //Для колонки [CreatedOn] добавляется метод-валидатор dueDateValidator().
                this.addColumnValidator("CreatedOn", this.dueDateValidator);
            }
        }
    };
});

После сохранения схемы и обновления страницы приложения на странице продажи при вводе даты закрытия или даты создания, не соответствующих условию валидации (дата создания должна быть меньше даты закрытия), будет появляться строка с соответствующим сообщением (рис. 4), а при попытке сохранить такую продажу появится информационное окно (рис. 5).

Рис. 4. — Демонстрация результатов. Сообщение при выборе неправильной даты
Рис. 5. — Демонстрация результатов. Сообщение при сохранении

Пример 2 

Описание примера 

Настроить валидацию поля Рабочий телефон страницы контакта следующим образом: номер телефона должен соответствовать маске +44 ХХХ ХХХ ХХХХ, иначе появляется сообщение "Введите номер в формате: +44 ХХХ ХХХ ХХХХ".

Алгоритм реализации примера 

1. Создать схему замещающей модели представления 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Схема отображения карточки контакта (Display schema - Contact card, ContactPageV2) (рис. 6). Процесс создания схемы замещающей модели представления страницы описан в статье "Cоздать клиентскую схему".

Рис. 6. — Свойства схемы замещающей модели представления страницы записи

2. В коллекцию локализуемых строк схемы замещающей модели представления страницы добавить строку ошибки 

Создайте новую локализуемую строку (рис. 2).

Для созданной строки укажите (рис. 7):

  • Название (Name) — "InvalidPhoneFormat";
  • Значение (Value) — "Введите номер в формате: +44 ХХХ ХХХ ХХХХ" ("Enter the number in format +44 ХХХ ХХХ ХХХХ”).
Рис. 7. — Свойства пользовательской локализуемой строки

3. В коллекцию methods модели представления добавить реализацию методов 

  • phoneValidator() — метод-валидатор, который определяет выполняется ли условие.
  • setValidationConfig() — переопределенный базовый метод, в котором метод-валидатор привязан к колонке Phone.

Исходный код схемы замещающей модели представления:

define("ContactPageV2", ["ConfigurationConstants"], function(ConfigurationConstants) {
    return {
        entitySchemaName: "Contact",
        methods: {
            // Переопределение базового метода, инициализирующего пользовательские валидаторы.
            setValidationConfig: function() {
                // Вызывает инициализацию валидаторов родительской модели представления.
                this.callParent(arguments);
                // Для колонки [Phone] добавляется метод-валидатор phoneValidator().
                this.addColumnValidator("Phone", this.phoneValidator);
            },
            phoneValidator: function(value) {
                // Переменная для хранения сообщения об ошибке валидации.
                var invalidMessage = "";
                // Переменная для хранения результата проверки номера.
                var isValid = true;
                // Переменная для хранения номера телефона.
                var number = value || this.get("Phone");
                // Определение правильности формата номера с помощью регулярного выражения.
                isValid = (Ext.isEmpty(number) ||
                    new RegExp("^\\+44\\s[0-9]{3}\\s[0-9]{3}\\s[0-9]{4}$").test(number));
                // Если формат номера неправильный, то заполняется сообщение об ошибке.
                if (!isValid) {
                    invalidMessage = this.get("Resources.Strings.InvalidPhoneFormat");
                }
                // Объект, свойство которого содержит сообщение об ошибке валидации.
                // Если валидация прошла успешна, в объекте возвращается пустая строка.
                return {
                    invalidMessage: invalidMessage
                };
            }
        }
    };
});

После сохранения схемы и обновления страницы приложения на странице контакта при редактировании номера рабочего телефона будет происходить проверка правильности формата номера и если формат неверный, то будет появляться строка с соответствующим сообщением (рис. 8, 9).

Рис. 8. — Демонстрация результата. Сообщение при вводе неправильного номера
Рис. 9. — Демонстрация результата. Сообщение при сохранении
Установить для поля значение по умолчанию
Средний

Исходный код 

Пакет с реализацией примеров можно скачать по ссылке.

Пример установки для поля значения по умолчанию через свойства колонки объекта 

Описание примера 

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

Алгоритм реализации примера 

1. Создать в пользовательском пакете схему замещающего объекта Активность 

Создайте схему замещающего объекта Активность (Activity) (рис. 1). Процесс создания схемы замещающего объекта описан в статье "Cоздать схему объекта".

Рис. 1. — Свойства схемы замещающего объекта Активность (Activity)

2. Установить для колонки Отображать в расписании (Show in calendar) значение по умолчанию 

Выберите из списка унаследованных колонок объекта колонку Отображать в расписании (Show in calendar) и отредактируйте ее свойство Значение по умолчанию (Default value) как показано на рисунке 2. Для реализации примера выберите в качестве значения по умолчанию константное значение.

Рис. 2. — Установка значения по умолчанию для колонки Отображать в расписании (Show in calendar)

После публикации схемы и обновления страницы приложения с очисткой кэша на странице активности при создании новой активности поле Отображать в расписании (Show in calendar) будет автоматически отмечено (рис. 3).

Рис. 3. — Демонстрация установки значения по умолчанию

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

Описание примера 

При создании нового проекта значение поля Крайний срок на странице проекта по умолчанию должно принимать значение поля Начало плюс 10 дней.

Алгоритм реализации примера 

1. В пользовательском пакете создать схему замещающей модели представления страницу проекта 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Страница редактирования проекта (Project edit page, ProjectPageV2) (рис. 4). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 4. — Свойства схему замещающей модели представления страницы записи

2. В коллекцию методов схемы замещающей модели представления страницы добавить реализацию методов 

  • setDeadline() — метод-обработчик. Рассчитывает значение поля Крайний срок (Deadline).
  • onEntityInitialized() — переопределенный базовый виртуальный метод. Срабатывает после окончания инициализации схемы объекта. В него добавьте вызов метода-обработчика для установки значения поля Крайний срок (Deadline) в момент открытия страницы записи.

Исходный код схемы замещающей модели представления:

define("ProjectPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Project",
        methods: {
            // Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized(). 
            // Cрабатывает после окончания инициализации схемы объекта страницы записи.
            onEntityInitialized: function() {
                // Вызывается родительская реализация метода.
                this.callParent(arguments);
                // Вызов метода-обработчика, который рассчитывает значение колонки [Крайний срок].
                this.setDeadline();
            },
            // Метод-обработчик. Рассчитывает значение колонки [Крайний срок].
            setDeadline: function() {
                // Значение колонки [Крайний срок].
                var deadline = this.get("Deadline");
                // Установлен ли режим новой записи?
                var newmode = this.isNewMode();
                // Если значение не установлено и режим новой записи установлен.
                if (!deadline && newmode) {
                    // Получение значения колонки [Начало]
                    var newDate = new Date(this.get("StartDate"));
                    newDate.setDate(newDate.getDate() + 10);
                    // Установка значения колонки [Крайний срок].
                    this.set("Deadline", newDate);
                }
            }
        }
    };
});

После сохранения схемы и обновления страницы приложения при создании нового проекта в поле Крайний срок (Deadline ) будет установлена дата, равная дате в поле Начало (Start ) плюс 10 дней (рис. 5).

Рис. 5. — Демонстрация установки вычисляемого значения по умолчанию
Сделать поле обязательным для заполнения по условию
Средний

На заметку.

В Creatio реализована возможность настраивать бизнес-правила не только средствами разработки, но и с помощью мастера разделов. Подробнее об этом читайте в статье "Настройка бизнес-правил".

Описание примера 

Настроить поля на странице контакта таким образом, чтобы поле Рабочий телефон (Business phone) было обязательным для заполнения при условии, что в поле Тип контакта (Type) выбрано значение "Клиент" ("Customer").

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающей модели представления страницы контакта 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Схема отображения карточки контакта (Display schema — Contact card) (рис. 1). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 1. — Свойства схему замещающей модели представления страницы записи

2. В свойство rules модели представления страницы добавить правило 

Добавьте в свойство rules схемs замещающей модели представления страницы правило с типом BINDPARAMETER для колонки Phone. Свойству property правила установите значение BusinessRuleModule.enums.Property.REQUIRED. В массив conditions добавьте условие выполнения правила — значение колонки Type модели должно быть равно конфигурационной константе ConfigurationConstants.ContactType.Client.

На заметку.

Конфигурационная константа ConfigurationConstants.ContactType.Client содержит идентификатор записи "Клиент" справочника Типы контактов.

Исходный код схемs замещающей модели представления:

    // В список зависимостей модуля добавить модули BusinessRuleModule и ConfigurationConstants.
    define("ContactPageV2", ["BusinessRuleModule", "ConfigurationConstants"],
        function(BusinessRuleModule, ConfigurationConstants) {
            return {
                // Название схемы объекта страницы записи.
                entitySchemaName: "Contact",
                // Правила модели представления страницы записи.
                rules: {
                    // Набор правил для колонки [Рабочий телефон] модели представления.
                    "Phone": {
                        // Зависимость обязательности поля [Рабочий телефон] от значения в поле [Тип].
                        "BindParameterRequiredAccountByType": {
                            // Тип правила BINDPARAMETER.
                            "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                            // Правило регулирует свойство REQUIRED. 
                            "property": BusinessRuleModule.enums.Property.REQUIRED,
                            // Массив условий, при выполнении которых срабатывает правило. 
                            // Определяет равно ли значение в колонке [Тип] значению "Клиент". 
                            "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                    // Тип выражения — атрибут (колонка) модели представления. 
                                    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                    // Название колонки модели представления, значение которой сравнивается в выражении.
                                    "attribute": "Type"
                                },
                                // Тип операции сравнения. 
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                    // Тип выражения — константное значение.
                                    "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                    // Значение, с которым сравнивается выражение левой части.
                                    "value": ConfigurationConstants.ContactType.Client
                                }
                            }]
                        }
                    }
                }
            };
        });
    

После сохранения схемы и обновления веб-страницы приложения на странице контакта поле Рабочий телефон (Business phone) будет обязательным для заполнения, если тип контакта — "Клиент" ("Customer") (рис. 2, 3).

Рис. 2. — Результат выполнения примера. Поле Рабочий телефон (Business phone) — необязательно
Рис. 3. — Результат выполнения примера. Поле Рабочий телефон (Business phone) — обязательно
Добавить разницу дат в полях страницы
Легкий

Для работы с датами в front-end части приложения используются возможности стандартного JavaScript-объекта Date. Например, для получения дня месяца для определенной даты в соответствии с локальным временем пользователя используется метод Date.prototype.getDate(). А для установки дня месяца относительно текущего месяца — метод Date.prototype.setDate(). Все свойства и методы объекта Date приведены в документации.

Например, при создании нового договора нужно, чтобы в поле Дата завершения (End Date) отображалась дата на 5 дней больше, чем в поле Дата начала (Start Day). Для этого необходимо:

1. Создать схему замещающей модели представления страницы записи раздела Договоры ContractPageV2 (Section edit page schema - "Contracts"). Как создать схему замещающей модели представления описано в статье "Cоздать клиентскую схему".

2. В созданную схему замещающей модели представления добавить следующий код:

define("ContractPageV2", [], function() {
    return {
        entitySchemaName: "Contract",
        methods: {
            // Установка даты выполняется после инициализации объекта.
            onEntityInitialized: function() {
                // Проверка режима новой записи
                if ((this.isAddMode() && this.Ext.isEmpty(this.get("EndDate")))) {
                    // Вызов вспомогательного метода.
                    this.setEndDate(this.get("StartDate"), 5);
                }
                // Вызов базовой функциональности.
                this.callParent(arguments);
            },
            // Вспомогательный метод для установки даты.
            setEndDate: function(date, dateOffsetInDays) {
                var offsetDate = new Date();
                offsetDate.setDate(date.getDate() + dateOffsetInDays);
                this.set("EndDate", offsetDate);
            }
        }
    };
});

3. Сохранить изменения.

4. Обновить страницу браузера.

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

Рис. 1. — Результат выполнения кейса

На заметку.

Чтобы дата в поле Дата завершения (End Date) пересчитывалась автоматически при изменении пользователем поля Дата начала (Start Day), необходимо воспользоваться функциональностью вычисляемых полей. Как это сделать подробно описано в статье "Добавление вычисляемых полей".

Отфильтровать справочное поле
Средний

На заметку.

В Creatio реализована возможность настраивать бизнес-правила не только средствами разработки, но и с помощью мастера разделов. Подробнее об этом можно прочитать в статье "Настройка бизнес-правил".

Описание примера 

Добавить на страницу контакта поля Страна, Область/Штат и Город. При выборе определенной страны список областей должен быть отфильтрован по выбранной стране. При выборе определенной области список городов должен отображать города только из выбранной области. При выборе определенного города поля страны и области должны заполняться соответствующими городу значениями.

На заметку.

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

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающей модели представления страницы контакта 

Создайте схему замещающей модели представления, в котором в качестве родительского объекта укажите схему Схема отображения карточки контакта (Display schema — Contact card) (рис. 1). Процесс создания схему замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 1. — Свойства схему замещающей модели представления страницы записи

2. Добавить поля Страна, Область/штат и Город на страницу записи 

Добавьте в массив diff три конфигурационных объекта с настройками свойств соответствующих полей.

3. Добавить правила с типом FILTRATION для колонок Город и Область/штат 

Добавьте в свойство rules модели представления страницы два правила с типом BusinessRuleModule.enums.RuleType.FILTRATION для колонок City и Region. Для выполнения обратной фильтрации, т. е. автозаполнения полей Страна и Область/Штат соответствующими значениями в зависимости от выбранного города необходимо установить значение true для свойства autocomplete.

Исходный код схемы замещающей модели представления:

    // В список зависимостей модуля добавить модуль BusinessRuleModule.
    define("ContactPageV2", ["BusinessRuleModule"],
        function(BusinessRuleModule) {
            return {
                // Название схемы объекта страницы записи.
                entitySchemaName: "Contact",
                // Свойство, содержащее коллекцию бизнес-правил схемы модели представления страницы.
                rules: {
                    // Набор правил для колонки [City] модели представления.
                    "City": {
                        // Правило фильтрации колонки [City] по значению колонки [Region].
                        "FiltrationCityByRegion": {
                            // Тип правила FILTRATION. 
                            "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
                            // Будет выполняться обратная фильтрация.
                            "autocomplete": true,
                            // Будет выполняться очистка значения при изменении значения колонки [Region].
                            "autoClean": true,
                            // Путь к колонке для фильтрации в справочной схеме [City],
                            // на которую ссылается колонка [City] модели представления
                            // страницы записи.
                            "baseAttributePatch": "Region",
                            // Тип операции сравнения в фильтре.
                            "comparisonType": Terrasoft.ComparisonType.EQUAL,
                            // В качестве значения при сравнении выступает колонка (атрибут)
                            // модели представления.
                            "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                            // Имя колонки модели представления страницы записи,
                            // по значению которой будет выполняться фильтрация.
                            "attribute": "Region"
                        }
                    },
                    // Набор правил для колонки [Region] модели представления.
                    "Region": {
                        "FiltrationRegionByCountry": {
                            "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
                            "autocomplete": true,
                            "autoClean": true,
                            "baseAttributePatch": "Country",
                            "comparisonType": Terrasoft.ComparisonType.EQUAL,
                            "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                            "attribute": "Country"
                        }
                    }
                },
                // Настройка визуализации полей [Страна], [Область/штат] и [Город] на странице записи.
                diff: [
                    // Метаданные для добавления поля [Страна].
                    {
                        "operation": "insert",
                        "parentName": "ProfileContainer",
                        "propertyName": "items",
                        "name": "Country",
                        "values": {
                            "contentType": Terrasoft.ContentType.LOOKUP,
                            "layout": {
                                "column": 0,
                                "row": 6,
                                "colSpan": 24
                            }
                        }
                    },
                    // Метаданные для добавления поля [Область/штат].
                    {
                        "operation": "insert",
                        "parentName": "ProfileContainer",
                        "propertyName": "items",
                        "name": "Region",
                        "values": {
                            "contentType": Terrasoft.ContentType.LOOKUP,
                            "layout": {
                                "column": 0,
                                "row": 7,
                                "colSpan": 24
                            }
                        }
                    },
                    // Метаданные для добавления поля [Город].
                    {
                        "operation": "insert",
                        "parentName": "ProfileContainer",
                        "propertyName": "items",
                        "name": "City",
                        "values": {
                            "contentType": Terrasoft.ContentType.LOOKUP,
                            "layout": {
                                "column": 0,
                                "row": 8,
                                "colSpan": 24
                            }
                        }
                    }
                ]
            };
        });
    

4. Сохранить созданную схему замещающей модели представления страницы 

После сохранения схемы и обновления веб-страницы приложения в профиле контакта появятся три новых поля (рис. 2). В каждом из них содержимое будет фильтроваться в зависимости от значения, выбранного в другом (рис. 3). При этом фильтрация также работает в окне выбора значения из справочника (рис. 4).

Рис. 2. — Новые поля в профиле контакта
Рис. 3. — Фильтрация содержимого полей
Рис. 4. — Отфильтрованные области в окне выбора
Применить фильтрацию к справочным полям
Средний

Описание примера 

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

  • с данным контактом есть связанный пользователь системы;
  • данный пользователь системы активен.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающей модели представления страницы контрагента 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Страница редактирования контрагента (Account edit page, AccountPageV2 ) (рис. 1). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 1. — Свойства схемы замещающей модели представления страницы записи

2. В свойство attributes модели представления добавить атрибут с фильтрацией 

В конфигурационном объекте атрибута Owner укажите тип данных колонки — Terrasoft.DataValueType.LOOKUP и опишите конфигурационный объект поля-справочника lookupListConfig. В lookupListConfig добавьте свойство filters, представляющее собой массив. В массив добавьте функцию, возвращающую коллекцию фильтров.

Исходный код схемы замещающей модели представления:

define("AccountPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        "entitySchemaName": "Account",
        // Атрибуты схемы.
        "attributes": {
            // Колонка модели представления.
            "Owner": {
                // Тип данных атрибута.
                "dataValueType": Terrasoft.DataValueType.LOOKUP,
                // Конфигурационный объект атрибута типа LOOKUP.
                "lookupListConfig": {
                    // Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
                    "filters": [
                        function() {
                            var filterGroup = Ext.create("Terrasoft.FilterGroup");
                            // Добавление фильтра "IsUser" в результирующую коллекцию фильтров.
                            // Выбирает все записи из корневой схемы Contact, к которой присоединена
                            // колонка Id из схемы SysAdminUnit, для которых Id не равен null.
                            filterGroup.add("IsUser",
                                Terrasoft.createColumnIsNotNullFilter("[SysAdminUnit:Contact].Id"));
                            // Добавление фильтра "IsActive" в результирующую коллекцию фильтров.
                            // Выбирает все записи из корневой схемы Contact, к которой присоединена
                            // колонка Active из схемы SysAdminUnit, для которых Active=true.
                            filterGroup.add("IsActive",
                                Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.EQUAL,
                                    "[SysAdminUnit:Contact].Active",
                                    true));
                            return filterGroup;
                        }
                    ]
                }
            }
        }
    };
});

После сохранения схемы и обновления страницы приложения на странице контрагента при добавлении значения в поле Ответственный (Owner) страницы контрагента будут отображаться только те значения из справочника контактов, которые соответствуют условиям примера (рис. 2, рис. 3). Т.е.:

  • с данным контактом есть связанный пользователь системы;
  • данный пользователь системы активен.
Рис. 2. — Профиль контрагента с ответственным
Рис. 3. — Ответственный отсутствует в отфильтрованном справочнике контактов
Заблокировать поля
Средний

Описание примера 

Блокировать все поля на странице счета если счет находится в состоянии Оплачен полностью (Paid). Поле Состояние оплаты (Payment status) и деталь Активности (Activities) должны оставаться доступными для редактирования.

Важно.

Если для поля существует привязка для свойства enabled в элементе массива diff или в бизнес-правиле BINDPARAMETER, то механизм не будет блокировать такое поле.

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

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

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Страница редактирования счета (Invoice edit page, InvoicePageV2) (рис. 1). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 1. — Свойства схемы замещающей модели представления страницы записи

2. Добавить исходный код схемы 

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

Исходный код схемы замещающей модели представления:

define("InvoicePageV2", ["InvoiceConfigurationConstants"], function(InvoiceConfigurationConstants) {
    return {
        entitySchemaName: "Invoice",
        attributes: {
            "IsModelItemsEnabled": {
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                value: true,
                dependencies: [{
                    columns: ["PaymentStatus"],
                    methodName: "setCardLockoutStatus"
                }]
            }
        },
        methods: {
            getDisableExclusionsColumnTags: function() {
                return ["PaymentStatus"];
            },
            
            getDisableExclusionsDetailSchemaNames: function() {
                return ["ActivityDetailV2"];
            },
            setCardLockoutStatus: function() {
                var state = this.get("PaymentStatus");
                if (state.value === InvoiceConfigurationConstants.Invoice.PaymentStatus.Paid) {
                    this.set("IsModelItemsEnabled", false);
                } else {
                    this.set("IsModelItemsEnabled", true);
                }
            },
            onEntityInitialized: function() {
                this.callParent(arguments);
                this.setCardLockoutStatus();
            }
        },
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "CardContentWrapper",
                "values": {
                    "generator": "DisableControlsGenerator.generatePartial"
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

После сохранения схемы и обновления страницы приложения с очисткой кэша, при установке счета в состояние Оплачен полностью (Paid) большинство полей страницы счета станут заблокированными (рис. 2). Незаблокированными останутся поля и детали, указанные в исключениях для блокировки. Также незаблокированными останутся поля, для которых явно указано значение true для свойства enabled.

Рис. 2. — Результат выполнения примера. Состояние счета Оплачен полностью — блокируется большинство полей
Заблокировать поле по условию
Средний

На заметку.

В Creatio реализована возможность настраивать бизнес-правила не только средствами разработки, но и с помощью мастера разделов. Подробнее об этом можно прочитать в статье "Настройка бизнес-правил".

Описание примера 

Настроить поля на странице контакта таким образом, чтобы поле Рабочий телефон (Business phone) было доступным только при условии, что заполнено поле Мобильный телефон (Mobile phone).

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающей модели представления страницы контакта 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Схема отображения карточки контакта (Display schema — Contact card) (рис. 1). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 1. — Свойства схемы замещающей модели представления страницы записи

2. В свойство rules модели представления страницы добавить правило 

Добавьте в свойство rules модели представления страницы правило с типом BINDPARAMETER для колонки Phone (Рабочий телефон). Свойству property правила установите значение BusinessRuleModule.enums.Property.ENABLED. В массив conditions добавьте условие выполнения правила — значение колонки MobilePhone (Мобильный телефон) модели не должно быть пустым.

Исходный код схемы замещающей модели представления:

    // В список зависимостей модуля добавить модуль BusinessRuleModule.
    define("ContactPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) {
        return {
            // Название схемы объекта страницы записи.
            entitySchemaName: "Contact",
            // Правила модели представления страницы записи.
            rules: {
                // Набор правил для колонки [Рабочий телефон] модели представления.
                "Phone": {
                    // Зависимость доступности поля [Рабочий телефон] от значения поля [Мобильный телефон].
                    "BindParameterEnabledPhoneByMobile": {
                        // Тип правила BINDPARAMETER.
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        // Правило регулирует свойство ENABLED. 
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        // Массив условий, при выполнении которых срабатывает правило. 
                        // Определяет установлено ли значение в поле [Мобильный телефон]. 
                        "conditions": [{
                            // Выражение левой части условия.
                            "leftExpression": {
                                // Тип выражения — атрибут (колонка) модели представления. 
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                // Название колонки модели представления, значение которой сравнивается в выражении. 
                                "attribute": "MobilePhone"
                            },
                            // Тип операции сравнения — не равно. 
                            "comparisonType": Terrasoft.ComparisonType.NOT_EQUAL,
                            // Выражение правой части условия.
                            "rightExpression": {
                                // Тип выражения — константное значение.
                                "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                // Значение, с которым сравнивается выражение левой части.
                                "value": ""
                            }
                        }]
                    }
                }
            }
        };
    });
    

После сохранения схемы и обновления веб-страницы приложения на странице контакта поле Рабочий телефон (Business phone) будет недоступно для редактирования до тех пор, пока в поле Мобильный телефон (Mobile phone) не будут введены данные (рис. 2).

Рис. 2. — Демонстрация результата выполнения примера
Скрыть поле по условию
Средний

На заметку.

В Creatio реализована возможность настраивать бизнес-правила не только средствами разработки, но и с помощью мастера разделов. Подробнее об этом читайте в статье "Настройка бизнес-правил".

Описание примера 

Добавить на страницу активности новое поле Место встречи (Meeting place), которое будет отображаться только для активностей категории "Встреча" ("Meeting").

На заметку.

Добавление поля на страницу записи может быть реализовано двумя способами — с помощью Мастера разделов и вручную.

Процесс добавления поля на страницу записи описан в статье "Добавление нового поля".

Исходный код 

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера 

1. Создать схему замещающего объекта и добавить в него новую колонку 

Создайте схему замещающего объекта Активность (Activity) и добавьте в нее новую колонку Место встречи (Meeting place) типа "строка" (рис. 1). Процесс создания схемы замещающего объекта описан в статье "Cоздать схему объекта".

Рис. 1. — Добавление пользовательской колонки в схему замещающего объекта

2. Создать схему замещающей модели представления страницы активности 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему Cтраница редактирования активности (Activity edit page) (рис. 2). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 2. — Свойства схемы замещающей модели представления страницы записи

3. Добавить новое поле на страницу активности 

Добавьте в массив diff конфигурационный объект с настройками расположения поля Место встречи (Meeting place) на странице. Добавление поля подробно рассмотрено в статье "Добавление нового поля".

Для возможности локализации приложения, создайте локализуемую строку (рис. 3) и свяжите ее с заголовком поля.

Рис. 3. — Свойства локализуемой строки

4. В свойство rules модели представления страницы добавить правило 

Добавьте в свойство rules модели представления страницы правило BINDPARAMETER для колонки UsrMeetingPlace. Свойству property правила установите значение BusinessRuleModule.enums.Property.VISIBLE. В массив conditions добавьте условие выполнения правила — значение колонки ActivityCategory модели должно быть равно конфигурационной константе ConfigurationConstants.Activity.ActivityCategory.Meeting.

На заметку.

Конфигурационная константа ConfigurationConstants.Activity.ActivityCategory.Meeting содержит идентификатор записи "Встреча" справочника Категория активности.

Исходный код схемs замещающей модели представления:

    // В список зависимостей модуля добавить модуль BusinessRuleModule и ConfigurationConstants.
    define("ActivityPageV2", ["BusinessRuleModule", "ConfigurationConstants"],
        function(BusinessRuleModule, ConfigurationConstants) {
            return {
                // Название схемы объекта страницы записи.
                entitySchemaName: "Activity",
                // Отображение нового поля на странице записи.
                diff: /**SCHEMA_DIFF*/[
                    // Метаданные для добавления поля [Место встречи].
                    {
                        // Операция добавления компонента на страницу.                
                        "operation": "insert",
                        // Мета-имя родительского контейнера, в который добавляется поле.
                        "parentName": "Header",
                        // Поле добавляется в коллекцию компонентов
                        // родительского элемента.
                        "propertyName": "items",
                        // Имя колонки схемы, к которой привязан компонент.
                        "name": "UsrMeetingPlace",
                        "values": {
                            // Заголовок поля.
                            "caption": {"bindTo": "Resources.Strings.MeetingPlaceCaption"},
                            // Расположение поля.
                            "layout": { "column": 0, "row": 5, "colSpan": 12 }
                        }
                    }
                ]/**SCHEMA_DIFF*/,
                // Правила модели представления страницы редактирования.
                rules: {
                    // Набор правил для колонки [Место встречи] модели представления. 
                    "UsrMeetingPlace": {
                        // Зависимость видимости поля [Место встречи] от значения в поле [Категория].
                        "BindParametrVisibilePlaceByType": {
                            // Тип правила BINDPARAMETER.
                            "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                            // Правило регулирует свойство VISIBLE.
                            "property": BusinessRuleModule.enums.Property.VISIBLE,
                            // Массив условий, при выполнении которых срабатывает правило.
                            // Определяет равно ли значение в колонке [Категория] значению "Встреча".
                            "conditions": [{
                                // Выражение левой части условия.
                                "leftExpression": {
                                    //Тип выражения — атрибут (колонка) модели представления.
                                    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                    // Название колонки модели представления, значение которой сравнивается в выражении.
                                    "attribute": "ActivityCategory"
                                },
                                // Тип операции сравнения.
                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                // Выражение правой части условия.
                                "rightExpression": {
                                    // Тип выражения — константное значение.
                                    "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                    // Значение, с которым сравнивается выражение левой части.
                                    "value": ConfigurationConstants.Activity.ActivityCategory.Meeting
                                }
                            }]
                        }
                    }
                }
            };
        });
    

После сохранения схемы и обновления веб-страницы приложения на странице активности поле Место встречи (Meeting place) будет отображаться только в том случае, если категория активности — "Встреча" ("Meeting") (рис.4, 5).

Рис. 4. — Результат выполнения примера. Тип активности — "Выполнить" ("To do"), поле Место встречи (Meeting place) скрыто
Рис. 5. — Результат выполнения примера. Тип активности — "Встреча" ("Meeting"), поле Место встречи (Meeting place) отображено
Добавить автонумерацию к полю
Сложный

Описание примера 

В разделе Продукты установить автогенерацию для поля Код страницы записи. Код продукта должен формироваться следующим образом — ART_00001, ART_00002 и т. д.

Важно.

Ниже представлено два алгоритма выполнения примера — на стороне клиента и на стороне сервера. Задача добавления автонумерации реализуется одним из способов.

Исходный код 

Пакет с реализацией примеров можно скачать по ссылке.

Важно.

Пакет не содержит привязанных системных настроек ProductCodeMask и ProductLastNumber. Их необходимо добавить вручную.

Алгоритм реализации кейса на стороне клиента 

1. Создать две системные настройки 

Создайте системную настройку Маска кода продукта с маской номера "ART_{0:00000}" (рис. 1). Укажите значения для следующих полей:

  • [Название] ([Name]) — "Маска кода продукта" ("Product code mask").
  • [Код] ([Code]) — "ProductCodeMask".
  • [Тип] ([Type]) — строка, длина которой зависит от количества символов в маске. В большинстве случаев достаточно строки длиной 50 символов. В этом примере используется строка неограниченной длины.
  • [Значение по умолчанию] ([Default value]) — "ART_{0:00000}".
Рис. 1. — Системная настройка Маска кода продукта

Создайте системную настройку Текущий код продукта (рис. 2). Укажите:

  • [Название] ([Name]) — "Текущий код продукта" ("Product last number").
  • [Код] ([Code]) — "ProductLastNumber";
  • [Тип] ([Type]) — "Целое число" ("Integer").
Рис. 2. — Системная настройка Текущий код продукта

2. В пользовательском пакете создать схему замещающей модели представления 

Создайте схему замещающей модели представления, в которой в качестве родительского объекта укажите схему ProductPageV2 (рис. 3). Процесс создания схемы замещающей модели представления описан в статье "Cоздать клиентскую схему".

Рис. 3. — Свойства схемы замещающей модели представления страницы продукта

3. Переопределить метод onEntityInitialized() 

В коллекции методов модели представления страницы записи переопределите метод onEntityInitialized(). В методе onEntityInitialized() нужно вызвать метод getIncrementCode(), в callback-функции которого следует присвоить сгенерированный номер колонке Code. Исходный код схемы замещающей модели представления:

define("ProductPageV2", [], function() {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Product",
        // Коллекция методов модели представления страницы.
        methods: {
            // Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized, который 
            // срабатывает после окончания инициализации схемы объекта страницы записи.
            onEntityInitialized: function() {
                // Вызывается родительская реализация метода onEntityInitialized.
                this.callParent(arguments);
                // Код генерируется, только если создается новый элемент или копия существующего.
                if (this.isAddMode() || this.isCopyMode()) {
                    // Вызов базового метода Terrasoft.BasePageV2.getIncrementCode, который генерирует номер
                    // по заданной ранее маске.
                    this.getIncrementCode(function(response) {
                        // Сгенерированный номер возвращается в колонку [Code].
                        this.set("Code", response);
                    });
                }
            }
        }
    };
});

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

Рис. 4. — Результат выполнения кейса на стороне клиента

Алгоритм реализации кейса на стороне сервера 

1. Создать две системные настройки 

Этот шаг полностью идентичен первому шагу алгоритма реализации кейса на стороне клиента.

2. Создать схему замещающего объекта [Продукт] 

Выберите пользовательский пакет и на вкладке Схемы выполните команду меню ДобавитьЗамещающий объект. В свойствах нового объекта нужно указать в качестве родительского объект Продукт (Product) (рис. 5).

Рис. 5. — Свойства схему замещающего объекта продукта

3. Добавить в схему замещающего объекта обработчик события [Перед добавлением записи] 

В свойствах объекта, отображающихся в дизайнере объектов, добавьте новый обработчик события. Для этого перейдите на вкладку событий и дважды кликните по полю Перед добавлением записи (Before Record Adding) либо кликните по пиктограмме события в этом поле (рис. 6).

Рис. 6. — Обработчик события Перед добавлением записи продукта

После этого откроется дизайнер процессов объекта.

4. Добавить событийный подпроцесс 

Для реализации обработчика события Перед добавлением записи в рабочую область дизайнера процессов объекта добавьте событийный подпроцесс. В нем реализуйте бизнес-процесс добавления автогенерируемого номера (рис. 7).

Рис. 7. — Событийный подпроцесс — обработчик события Перед добавлением записи

Элементы событийного подпроцесса:

1. Начальное сообщение Перед добавлением продукта (Before product adding) (рис. 8) — подпроцесс будет запущен при получении сообщения ProductInserting, добавленном на шаге 3.

Рис. 8. — Свойства начального сообщения Перед добавлением продукта

2. Логический оператор Исключающее ИЛИ, от которого исходят две ветви подпроцесса:

  • Поток по умолчанию — переход по нему произойдет в случае, если не может быть выполнен переход по условному потоку. Эта ветвь завершается событием [Останов].
  • Условный поток [Код не заполнен] ([Code is empty]), в котором проверяется, заполнена ли колонка [Code] (рис. 9). Дальнейшее выполнение подпроцесса возможно только в том случае, если колонка не заполнена.
Рис. 9. — Свойства условного потока Код не заполнен
Код, который необходимо добавить в поле Условие условного потока
string.IsNullOrEmpty(Entity.GetTypedColumnValue<string>("Code"))

3. Задание-сценарий Определить схему объекта для генерации номера (Get entity schema to generate number) (рис. 10).

Рис. 10. — Свойства задания-сценария Определить схему объекта для генерации номера
В этом элементе выполняется программный код сценария С#. Для его добавления дважды кликните по элементу. В открывшемся окне добавьте следующий исходный код
// Установка схемы для генерации номера.
UserTask1.EntitySchema = Entity.Schema;
return true;

Здесь UserTask1 — это название пользовательского действия Выполнить генерацию номера (Generate number).

Важно.

После добавления исходного кода обязательно сохраните сценарий. Для этого на вкладке ScriptTask1] выполните действие меню [Сохранить.

4. Действие процесса Выполнить генерацию номера (Generate number) (рис. 11).

Рис. 11. — Свойства действия процесса Выполнить генерацию номера

В этом элементе выполняется системное действие Сгенерировать номер по порядку (Generate ordinal number). Именно системное действие Сгенерировать номер по порядку генерирует текущий порядковый номер в соответствии с установленной в системной настройке ProductCodeMask маской.

5. Задание-сценарий Записать полученный номер в колонку объекта (Save number to entity column) (рис. 12).

Рис. 12. — Свойства задания-сценария Записать полученный номер в колонку объекта
В этом элементе будет выполняться программный код сценария С#. Значение, которое было сгенерировано пользовательским действием UserTask1, записывается в колонку Code создаваемого объекта Продукт. Исходный код сценария приведен ниже
Entity.SetColumnValue("Code", UserTask1.ResultCode);
return true;

Сохраните и закройте дизайнер встроенного процесса, а затем опубликуйте схему объекта Продукт. В результате после сохранения нового продукта на его странице в поле Код будет указан автоматически сгенерированный код (рис. 13, рис. 14).

Важно.

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

Рис. 13. — При создании продукта код не отображается
Рис. 14. — Код отображается в сохраненном продукте