Значения по умолчанию#
Где и как хранятся значения по умолчанию#
Значения по умолчанию хранятся в базе данных в схеме каждого проекта в таблице D_SYS_DEFAULT_VALUES, описанной в метаданных на физическом уровне в PT «LtDefaultValue».
Структура таблицы хранения#
Поля
Key – Первичный ключ в диапазоне ключей проекта
Метка удаления. Для возможности отметить запись как «удалённую» и восстановления в дальнейшем.
Alias – псевдоним типа LT, для которого будут применяться значения по умолчанию.
Default_value – поле, в котором хранится xml с описанием значений по умолчанию для полей типа, определённого в поле alias.
Для таблицы ведется логирование, что позволяет получить историю изменения записей и восстановить удалённые в непредвиденных ситуациях.
Для каждого типа, полям которого требуется добавить значения по умолчанию, в таблицу добавляется запись.
Структура xml#
<?xml version="1.0" encoding="UTF-8"?>
<default-value-package>
<default-value type="ПсевдонимТипа">
<props>
<set a="ПсеводонимПоля_1" v="Значение_по умолчанию_1" />
<set a="ПсеводонимПоля_2" v="Значение_по умолчанию_2" />
<add a="ПсеводонимПоля_3" v="Значение_по умолчанию_3" />
...
</props>
</default-value>
<default-value type="…">…</default-value>
<default-value type="…">…</default-value>
</default-value-package>
Где:
ПсевдонимТипа – Alias LT, к полям которого будут применяться значения по умолчанию.
ПсеводонимПоля – Alias Field указанного выше LT, поле, которое будет заполняться значением по умолчанию.
Значение_по умолчанию_ – значение, которое может быть:
Ключом связанной сущности
Текстовой константой
Числом
Датой (только константа в формате dd.mm.yyyy).
Тег
<default-value-package>определяет границы пакета (набора типов и их значений по умолчанию).Тег
<default-value type= "ПсевдонимТипа">определяет набор значений по умолчанию для конкретного типа. Значения по умолчанию перечисляются внутри тега<props>.
Операции назначения значений по умолчанию выполняются тегами <set /> и <add/>.
При использовании set значение заполняется, перетирается. При использовании add значение также будет заполнено, но в случае если поле является ММ-связью, то можно добавить несколько значений в одно поле, используя тег add:
<default-value type="ПсевдонимТипа ">
<props>
<add a="ПсеводонимПоля_1" v="Ключ_связанной_сущности_1" />
<add a="ПсеводонимПоля_1" v="Ключ_связанной_сущности_2" />
</props>
</default-value>
Как для тега set, так и для add возможен поиск связанной сущности не только по ключу, но и по другим полям, используя тег find и вложенные в него блоки eq:
<default-value type="ПсевдонимТипа ">
<props>
<add a="ПсеводонимПоля_2" v="Ключ_связанной_сущности_1" />
<add a="ПсеводонимПоля_2">
<find>
<props>
<eq a="Alias_Поля связанной_сущности_1" v="Значение_поля_связанной сущности" />
<eq a="Alias_Поля связанной_сущности_2" v="Значение_поля_связанной сущности" />
</props>
</find>
</add>
</props>
</default-value>
В случае если тег find может найти несколько сущностей, то существует возможность указать, что нужно использовать только первое, используя атрибут findType="f":
<default-value type="ПсевдонимТипа ">
<props>
<add a="ПсеводонимПоля_2" v="Ключ_связанной_сущности_1" />
<add a="ПсеводонимПоля_2">
<find findType="f">
<props>
<eq a="Alias_Поля связанной_сущности_1" v="Значение_поля_связанной сущности" />
<eq a="Alias_Поля связанной_сущности_2" v="Значение_поля_связанной сущности" />
</props>
</find>
</add>
</props>
</default-value>
В случае, если значение по умолчанию присваивается для поля, которое ссылается на LV с несколькими LVI в составе, необходимо уточнить тип искомого объекта:
<default-value type="ПсевдонимТипа ">
<props>
<set a="ПсеводонимПоля_1">
<find findType="f" type="Псевдоним_LVI">
<props>
<eq a="Alias_Поля связанной_сущности_1" v="Значение_поля_связанной сущности" />
</props>
</find>
</add>
</props>
</default-value>
Примеры#
Для типа «DocElongation» (Продление):
Установить в поле SubjRoleWhoApprovePerson (связь через роль «Кто утвердил (Должностное лицо)») ключ субъекта 1001210000397228.
Установить в поле SubjRoleWhoMakePerson (роль «Кто подготовил (Должностное лицо)») ключ субъекта 1001210000453795. И в это же поле добавить субъекта, имя которого «Иван» и фамилия = «Иванов»
<default-value-package >
<default-value type="DocElongation">
<props>
<set a="SubjRoleWhoApprovePerson" v="1001210000397228" />
<add a="SubjRoleWhoMakePerson" v="1001210000453795" />
<add a="SubjRoleWhoMakePerson">
<find>
<props>
<eq a="FirstName" v="Иван" />
<eq a="LastName" v="Иванов" />
</props>
</find>
</add>
</props>
</default-value>
</default-value-package >
Похожий пример, но если поиск выдаст несколько Ивановых Иванов, то установится связь только с одним:
<default-value-package>
<default-value type="DocElongation">
<props>
<set a="SubjRoleWhoApprovePerson" v="1001210000397228" />
<add a="SubjRoleWhoMakePerson" v="1001210000453795" />
<add a="SubjRoleWhoMakePerson">
<find findType="f">
<props>
<eq a="FirstName" v="Иван" />
<eq a="LastName" v="Иванов" />
</props>
</find>
</add>
</props>
</default-value>
</default-value-package>
Подстановка текущего пользователя
Для текущего пользователя можно использовать строку CurrentUser().PartyKey. Тогда будет подставлен ключ субъекта, привязанного в рамках текущего проекта к учетной записи.
<default-value type="DocRS">
<props>
<set a="SubjRoleWhoMakePerson" calc="CurrentUser().PartyKey" />
</props>
</default-value>
В данном примере автоматически подставляется субъект текущего пользователя в поле [Кем подготовлен (SubjRoleWhoMakePerson)].
Подстановка даты
Для работы с текущей датой можно использовать выражение Now()+1d+3wd+6h. Now() – будет брать текущий момент в UTC.
Поэтому, чтобы синхронизировать время, лучше добавлять часовой пояс (например +7h).
С помощью часов можно регулировать и время начала нового дня.
Например, чтобы после 16:00 подставлялся следующий день, а до 16:00 текущий, можно использовать шаблон Now()+7h+8h.
Где: +7h часовой пояс, +8h – оставшиеся часы до конца дня.
Можно использовать знаки + и - для смещения даты и времени относительно текущей, а также d – для календарных дней, wd – для рабочих дней, h – для часов.
<default-value type="DocRS">
<props>
<set a="DateDoc" calc="Now()+6h+3wd" />
</props>
</default-value>
Пример выше подставляет по умолчанию в поле [Дата (DateDoc)] текущую дату (+ 6h часовой пояс) + 3 рабочих дня.
Как залить значения по умолчанию в проект#
Для заполнения и заливки значений по умолчанию необходимо разместить файлы с расширением .dvdiff в каталогах нужных подсистем или проектов, где хранятся типы, требующие заполнение значений по умолчанию.
Следующим шагом будет запуск инструмента для сбора общего файла со значениями по умолчанию по всем подсистемам и проекту. Для сбора общей xml используется консольный патчер. Имя собранной xml ИмяПроекта.dvfull, но его можно изменить с помощью ключа –o :
dotnet \\vr-nest-env\resources\tools\patcher\Gems.Ui.Patcher.dll build-lt-default -x "Путь к файлу gmproj нужного проекта" [-o имя выходного файла]
Пример:
dotnet \\vr-nest-env\resources\tools\patcher\Gems.Ui.Patcher.dll build-lt-default -x "x:\Разное\Модель данных\Проекты\ЯНАО\ГО\yanao_go_addEgrz.gmproj"
Полученный таким образом файл можно залить в проект, используя раздел конфигуратора с настройками проекта:
Кроме заливки в конфигураторе имеется возможность скачать файл.
С помощью консольного патчера также существует возможность залить значения по умолчанию в проект:
dotnet \\vr-nest-env\resources\tools\patcher\Gems.Ui.Patcher.dll apply-lt-default -p "Путь к файлу gmproj нужного проекта" -s Схема_в_базе -c "Строка_подключения_к_базе"
Пример:
dotnet \\vr-nest-env\resources\tools\patcher\Gems.Ui.Patcher.dll apply-lt-default -p "x:\Разное\Модель данных\Проекты\ЯНАО\ГО\yanao_go_addEgrz.gmproj" -s permraion -c "Server=172.16.55.50;Port=5432;Database=team3;User Id=postgres;Password=admin;ApplicationName=patcher;"
Наследование значений из родительского объекта#
Для заполнения значений в объекте, создаваемом из карточки другого объекта, необходимо в атрибуте calc указать выражение следующего вида:
Parent(DocRS)[0R0DocRelRSPD0R0DocPDZuRelation]
Описание синтаксиса:
Parent()– функция, которая извлекает информацию из родительского объекта. Внутри скобок указывается алиас родительского объекта.
[]– внутри квадратных скобок перечисляются алиасы связей или полей, которые необходимо продублировать в дочерний объект.
0R0– используется для разделения алиасов связей между объектами.
0F0– используется для разделения алиасов обычных текстовых полей.Если связь или поле одно, достаточно указать его алиас.
Для добавления нескольких связей или полей в одну строку используйте символ
|в качестве разделителя.
Пример использования списка земельных участков#
Данное выражение может быть использовано для автоматической вставки списка земельных участков из объекта «Разрешение на строительство» в объект «ГПЗУ».
<default-value type="DocGPZU">
<props>
<!-- Пример использования 0R0 для связей -->
<set a="DocGpzuZuRelation" calc="Parent(DocRS)[0R0DocRelRSPD0R0DocPDZuRelation]|Parent(DocRV)[DocRVZuRelation]"/>
<!-- Пример использования 0F0 для текстовых полей -->
<set a="Note" calc="Parent(DocRS)[0F0Note]"/>
<!-- Пример задания значения через поиск -->
<set a="StateDoc">
<find findType="f">
<props>
<eq a="key" v="1000170001111603" />
</props>
</find>
</set>
</props>
</default-value>
Пояснение:
В первом теге
<set>:Атрибут
a="DocGpzuZuRelation"указывает поле, которое будет заполнено.Атрибут
calcсодержит выражение, которое извлекает данные из родительского объектаDocRSс использованием связи0R0DocRelRSPD0R0DocPDZuRelation, а также из объектаDocRVс использованием связиDocRVZuRelation.
Во втором теге
<set>:Атрибут
a="Note"указывает поле для заполнения.Атрибут
calcизвлекает значение текстового поляNoteиз родительского объектаDocRSс использованием разделителя0F0.
В третьем теге
<set>:Задается значение поля
StateDocпутем поиска объекта с указанным ключомkey="1000170001111603".
Пример использования цепочки «Заявление - Услуга - Отказ»#
В этом примере данные из объекта «Заявление» (DocApplication) автоматически, не требуя ручного ввода, передаются через «Услугу» (WfServiceGPZU) в объект «Отказ» (DocRejection).
<default-value type="DocRejection">
<props>
<set a="Num" calc="Parent(WfServiceGPZU)[0R0DocApplication0F0Num]" />
<set a="Note" calc="Parent(WfServiceGPZU)[0R0DocApplication0F0Note]" />
</props>
</default-value>
Пояснение:
Разбор пути передачи данных:
DocApplication (Заявление) – источник данных (например, содержит номер Num и примечание Note);
WfServiceGPZU (Услуга) – промежуточный объект, через который проходит связь;
DocRejection (Отказ) – конечный объект, в который передаются данные.
Разбор выражений:
Parent(WfServiceGPZU)– получение объекта «Услуга», к которому привязан «Отказ»;
0R0DocApplication– переход от «Услуги» к связанному «Заявлению»;
0F0Num– получение значения поля Num из «Заявления»;
0F0Note– получение значения поля Note из «Заявления».