Значения по умолчанию#
Где и как хранятся значения по умолчанию#
Значения по умолчанию хранятся в базе данных в схеме каждого проекта в таблице d_sys_default_values, описанной в метаданных на физическом уровне в PT LtDefaultValue.
Структура таблицы хранения#
Поля:
[key] – первичный ключ в диапазоне ключей проекта;
[sys_status] – метка удаления. Для возможности отметить запись как «удаленную» и восстановления в дальнейшем;
[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 из «Заявления».