Значения по умолчанию#

Где и как хранятся значения по умолчанию#

Значения по умолчанию хранятся в базе данных в схеме каждого проекта в таблице D_SYS_DEFAULT_VALUES, описанной в метаданных на физическом уровне в PT «LtDefaultValue».

Структура таблицы хранения#

../../../_images/default.png

Поля

  • Key – Первичный ключ в диапазоне ключей проекта

  • Метка удаления. Для возможности отметить запись как «удалённую» и восстановления в дальнейшем.

  • Alias – псевдоним типа LT, для которого будут применяться значения по умолчанию.

  • Default_value – поле, в котором хранится xml с описанием значений по умолчанию для полей типа, определённого в поле alias.

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

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

../../../_images/default1.png

Структура 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"

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

../../../_images/default2.png

Кроме заливки в конфигураторе имеется возможность скачать файл.

С помощью консольного патчера также существует возможность залить значения по умолчанию в проект:

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 из «Заявления».