Значения по умолчанию#
Где и как хранятся значения по умолчанию#
Значения по умолчанию хранятся в базе данных в схеме каждого проекта в таблице 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 из «Заявления».