# Сервисные возможности для классов Возможности классов расширяются сервисным окружением, которое постоянно совершенствуется. ## Служебные атрибуты Для сервисных возможностей фреймворк добавляет РІ таблицы служебные атрибуты. Служебные атрибуты заканчиваются постфиксом `_dz`. Пример: - `nVersion_dz` - `screateuser_dz` - `dcreatedate_dz` ```{attention} Разработчикам запрещено создавать Рё изменять такие атрибуты. ``` ### Отображение состояния сессии РІ форме Состояние сессии можно определить РїРѕ цвету системных операций `Сохранить` Рё `Откатить` РЅР° тулбаре формы. Р’СЃРµ состояния формы перечислены РІ таблице: | Пользовательская блокировка | Данные для отправки РІ базу данных | РљРЅРѕРїРєР° "Сохранить" | РљРЅРѕРїРєР° "Откатить" | |-|-|-|-| | Нет | Нет | РЅРµ активна | РЅРµ активна | | Нет | Есть | активна | активна(крест) | | Есть | Нет | РЅРµ активна | активна(РєСЂСѓРі) | | Есть | Есть | активна | активна(крест) | ## Автонумерация Автонумерация – процесс автоматической выдачи значения для атрибута класса. Р’ РѕСЃРЅРѕРІРµ лежит выдача РїРѕСЂСЏРґРєРѕРІРѕРіРѕ номера (числа), которое может быть преобразовано РІ значение РїРѕ маске. Автоматическая нумерация объектов системы позволяет устанавливать для созданных объектов уникальные РєРѕРґС‹. РџСЂРё этом создаваемые РєРѕРґС‹ последовательно увеличиваются. Существует РґРІР° режима работы автонумерации: - Без заполнения РїСЂРѕРїСѓСЃРєРѕРІ - РЎ заполнением РїСЂРѕРїСѓСЃРєРѕРІ ### Определение разреза автонумерации Автонумерация РІ пределах значений РѕРґРЅРѕРіРѕ или нескольких атрибутов класса называется автонумерацией СЃ разрезом. Значение разреза может вычисляться РїРѕ правилу, указанному РІ теге В«expressionВ», если выражение РЅРµ указано, будет использоваться значение атрибута. Например, РІ течении РѕРґРЅРѕРіРѕ РґРЅСЏ выдаются номера последовательно, РїСЂРё наступлении следующего РґРЅСЏ номера начинают выдаваться заново. Такой разрез называется разрез РїРѕ дате. ### Настройка автонумерации без разреза Для автонумерации без разреза РІ odm файле класса указываем для атрибута тип `autonum`, далее РІ блоке `autonum` задаем РёРјСЏ разреза В«dimensionВ» ```xml <attr name="sNoDep" caption="Автонумерация без разреза" attribute-type="Varchar" type="autoNum" isHeadLine="true"> <autonum id="1"> <mask>lpad(counter,3,"0")</mask> <dimension name="dim1"/> </autonum> </attr> ``` ### Настройка автонумерации СЃ разрезом Для настройки разрезов `dimension` 1. Задайте уникальные имена 2. Укажите атрибуты разреза \ Разрезы указываются РёР· атрибутов класса 3. РџСЂРё необходимости задайте порядковый номер \ Если его РЅРµ указывать, то РѕРЅРё Р±СѓРґСѓС‚ обрабатываться РІ алфавитном РїРѕСЂСЏРґРєРµ. Количество разрезов должно быть `>= 1`. Указание нескольких разрезов: ```xml <attr name="sTwoDepExpr" caption="Автонумерация СЃ 2 разрезами" attribute-type="Varchar" type="autoNum"> <autonum id="3"> <mask>lpad(counter,3,"0")</mask> <dimension name="nNumber" attr="nNumber" order="10" /> <dimension name="dDate_dim" attr="dDate" order="20"> <expression>truncDate(dimValue)</expression> </dimension> </autonum> </attr> ``` Если РІ настройках автонумерации указан разрез, то автоматически включено заполнение РїСЂРѕРїСѓСЃРєРѕРІ. Отключить заполнение РїСЂРѕРїСѓСЃРєРѕРІ можно через свойство `isHoleFill` ```xml <attr name="sOneDepNoHoleFill" caption="Автонумерация СЃ 1 разрезом без заполнения РїСЂРѕРїСѓСЃРєРѕРІ" attribute-type="Varchar" type="autoNum" isHeadLine="true"> <autonum id="4" isHoleFill="false"> <dimension name="dDate" attr="dDate" order="10"/> </autonum> </attr> ``` ### Общие настройки Возможно использовать маски для вывода значения счетчика. Значение, указанное РІ элементе mask, будет передано РІ обработчик Jexl-скриптов. Параметр, заменяемый РЅР° значение счетчика, называется `counter`. Р’ Jexl добавлены методы: - `lpad(string, size, padChar)` Добавление строки символами слева - `rpad(string, size, padChar)` Добавление строки символами справа - `truncDate(date)` Получение даты РЅР° начало РґРЅСЏ РѕС‚ переданной - `truncYear(date)` Получение даты РЅР° начало РіРѕРґР° РѕС‚ переданной Р’ jexl скрипте можно обращаться Рє api Рё pkg объектам. Рљ значениям атрибутов разреза возможно применение выражений, РѕРЅРё указываются РІ элементе `expression` для `dimension`. РќР° каждый разрез может быть РЅРµ больше РѕРґРЅРѕРіРѕ выражения. Значение, указанное РІ элементе `expression`, будет передано РІ обработчик Jexl-скриптов, параметр, заменяемый РЅР° значение атрибута разреза, называется `dimValue`. ```xml <attr name="sRegNumber" attribute-type="Varchar" caption="Рег. в„–" order="230" type="autoNum" isVisible="false" isReadOnly="true"> <autonum> <mask> var sOTCode = Btk_ObjectTypeApi.load(self.idObjectType()).getByAttrName(\"sCode\"); if (sOTCode eq \"OperDecisionPrj\" || sOTCode eq \"ProductDecisionPrj\") { counter + \"-Р“\" } else { counter + \"-Р“.\" + Bs_PrjVerApi.load(self.idPrjVer()).getByAttrName(\"sCode\") } </mask> <dimension name="idObjectType" attr="idObjectType" order="1"> <expression> if (dimValue == null) { null } else { var sCode = Btk_ObjectTypeApi.load(dimValue).getByAttrName(\"sCode\"); if (sCode eq \"OperDecisionPrj\" || sCode eq \"OperDecisionWrk\" || sCode eq \"ProductDecisionPrj\" || sCode eq \"ProductDecisionWrk\" ) 0L else null; } </expression> </dimension> </autonum> </attr> ``` Для обращения Рє полям класса РїСЂРё вычислении маски используется переменная `self`, которая является объектом типа Aro, поэтому для получения значения атрибута необходимо добавлять РІ конце СЃРєРѕР±РєРё (С‚.Рє. это метод). Например: ``` self.sCaption() ``` После генерации РєРѕРґР° необходимо будет выполнить метод `*Dpi.autoNumCreateTable`. Если СЃ момента последнего выполнения данного метода были изменены данные автонумерации (имена разрезов, типы данных разрезов, количество разрезов), то таблицы Рё индексы Р±СѓРґСѓС‚ пересозданы. Так же генерация окружения автонумерации выполняется перед инициализацией первоначальных данных (init data), которая вызывается РїСЂРё обновлении проектного jar-РєРѕРґР° или РїСЂРё выполнении генерации таблиц РІ Intellij Idea : `External Tolls > Generate Tables` Присвоение значения автонумерации РїСЂРѕРёСЃС…РѕРґРёС‚ РІ момент сохранения транзакции. РџСЂРё ручной установке значения автонумерующегося атрибута (РїСЂРё работе РёР· интерфейса) будет задан РІРѕРїСЂРѕСЃ: "Значение присваивается автоматически РІ момент сохранения, РІРІРѕРґ данных отключит автонумерацию. Продолжить?" Положительный ответ РЅР° РІРѕРїСЂРѕСЃ установит значение Рё отключит автонумерацию объекта. Для повторного включения автонумерации нужно сбросить значение атрибута. ### Автонумерация РІ миксинах Возможно задание автонумерации РІ РјРёРєСЃРёРЅРµ. Атрибуты, которые объявлены как автонумерующиеся РІ РјРёРєСЃРёРЅРµ, РЅРѕ РїСЂРё этом как обычные РІ целевом классе, получат настройки автонумерации + сквозные таблицы хранения значений автонумерации для всех классов, использующих данный РјРёРєСЃРёРЅ. Если атрибут объявлен как автонумерующийся Рё РІ РјРёРєСЃРёРЅРµ, Рё РІ классе, то будет использована настройка класса. ### Создание окружения автонумерации Для создания окружения автонумерации РїРѕ классу: 1. Зайдите РІ приложение "Настройка системы" 2. Откройте СЃРїРёСЃРѕРє классов 3. Перевидите фокус РЅР° целевой класс \ Для данного класса должен стоять признак "Есть автонумерация" 4. Выполните операцию «Создать структуры автонумерации» \ Данная операция находится РїРѕРґ молоточками. \ РџСЂРё этом произойдет вызов метода `*Dpi.autoNumCreateTable` Для создания окружения автонумерации РїРѕ атрибуту класса: 1. Откройте карточку класса 2. Переведите фокус РЅР° целевой атрибут 3. Выполните операцию «Создать структуру автонумерации» \ Данная операция вызывает метод `*Dpi.autoNumCreateTableByAttr` ### Проектное переопределение Для индивидуальной настройки работы автонумерации реализован механизм проектного переопределения. Р’СЃСЏ настройка производится РёР· пользовательского интерфейса без необходимости изменения РёСЃС…РѕРґРЅРѕРіРѕ РєРѕРґР° Рё перекомпиляции. Проектные настройки хранятся РІ БД Рё РЅРµ сбрасываются РїСЂРё установке обновлений. Для выполнения проектного переопределения: 1. Зайдите РІ карточку класса 2. Выберете автонумерующийся атрибут 3. Откройте закладку «Настройки автонумерации»; 4. РќР° панели открытой закладки нажмите РєРЅРѕРїРєСѓ «Переопределить» 5. Настройте разрезы Рё маску; 6. Выполните операцию создания окружения нумерации. #### Настройка счетчиков Рё данных разрезов. Если автонумерация без разрезов, то РѕРЅР° Рё без заполнения РїСЂРѕРїСѓСЃРєРѕРІ. Счетчик такой автонумерации хранится РІ сиквенсе. Автонумерация СЃ разрезами хранит СЃРІРѕРё данные РІ РґРІСѓС… таблицах: - Таблица разрезов \ Р’ этой таблице РЅР° каждый уникальный набор значений разрезов хранится значение счетчика, маска, признак, что есть РїСЂРѕРїСѓСЃРєРё - Таблица РїСЂРѕРїСѓСЃРєРѕРІ \ Для каждого разреза (ссылка РЅР° таблицу разрезов) хранит информацию Рѕ имеющихся пропусках. Р’ РІРёРґРµ пар значений: "значение РѕС‚" Рё "значение РґРѕ" Таким образом для изменения текущего значения счетчика для автонумерации без разрезов достаточно изменить значение сиквенса. Для автонумерации СЃ разрезами чтобы изменить счетчик нужно установить значение РІ таблице разрезов. Для настройки: 1. Зайдите РІ карточку класса 2. Выберете автонумерующийся атрибут 3. Откройте закладку "Настройки автонумерации" 4. Откройте закладку "Данные автонумерации" 5. Настройте значение счетчика: 1. Если автонумерация без разрезов, то РЅР° детальной закладке будет карточка СЃ РѕРґРЅРёРј атрибутом, который показывает текущее значение сиквенса. 2. Если автонумерация СЃ разрезом, то РЅР° детальной закладке Р±СѓРґСѓС‚ отображены данные РёР· таблицы разрезов Рё таблицы РїСЂРѕРїСѓСЃРєРѕРІ. Для изменения счетчика РІ нужном разрезе указывается значение поле «Максимальное значение». Если разреза нет, то его можно создать. Если удалить разрез, то автонумерация начнется СЃ 1 для этого разреза. ## Копирование объектов РџСЂРё создании класса, РїСЂРё необходимости генерируется операция копирования данный метод позволяет создать новый объект скопировав значение атрибутов Рё содержание его коллекций. РџСЂРё этом РїСЂРѕРёСЃС…РѕРґРёС‚ глубокое копирование, то есть для коллекций создаются новые строчки. Так же возможно добавить РІ РѕРґРёРЅ объект данные РёР· РґСЂСѓРіРѕРіРѕ объекта. Копирование управляется свойствами РІ метаданных (РІСЃРµ РїРѕ умолчанию = true). Возможность копирования объекта можно настроить РЅР° СѓСЂРѕРІРЅРµ всего класса, Рё РЅР° каждый атрибут. Например, запретив копирование нескольким атрибутам РІ классе. РќР° СѓСЂРѕРІРЅРµ класса копирование настраивается свойством `isCopyObjectEnabled` РќР° СѓСЂРѕРІРЅРµ атрибута свойством `isCopyInCopyObject` Р’ случае, если РЅР° классе включено копирование: Р’ мастер-выборке `EntityAvi#Default` создана операция «Копировать», пустая Рё РЅРµ активная РїРѕ умолчанию. Для классов СЃ включенным свойством `isCopyObject` операция будет содержать исполняемый РєРѕРґ, РІ отображении `List` операция будет активна. Р’ отображении `Card` создается операция `copyObjectCard`, которая создает новый объект Рё копирует РІ него данные РїРѕ `CardRep.IdItemSharp`. Для параметра мастер-объекта используется переменная `idBOParent#`. Настройка копирования РІ Odm для класса: ```xml <class xmlns="http://www.global-system.ru/xsd/global3-class-1.0" name="Mct_OperCard" caption="Справочник операционных карт" cardEditor.representation="Card" listEditor.representation="List" viewOptions.openCardType="mdi" supertype="reference" isCopyObjectEnabled="true" attachType="simple"/> ``` Настройка копирования для атрибута класса: ```xml <attr name="sCreateUser" attribute-type="Varchar" type="basic" isCopyInCopyObject="false"/> ``` РџСЂРё создании метода `copyObject` РІ мастер-классе РІ метод Р±СѓРґСѓС‚ добавлены вызовы `copyObject` РёР· коллекций если для этих классов включено копирование. Если РЅРµ указано свойство `isCopyInCopyObject` атрибут будет копироваться РІ методе `copyObject`. РџРѕ умолчанию РЅРµ копируются системные атрибуты: - `id` - `gid` - `gidRef` - `sImpExpKey_dz` - `nImpExpFlag_dz` - `sMnemoCode_dz` - `sHeadLine_dz` - атрибуты СЃРІСЏР·Рё СЃ мастер-сущностью. ### Параметры метода copyObject - Для РјРёРєСЃРёРЅРѕРІ \ `(gidFrom: NGid, gidTo: NGid, gidParent: NGid)` - Для V-коллекций \ `(idFrom: NLong, idTo: NLong, gidParent: NGid)` - Для всех остальных \ `(idFrom: NLong, idTo: NLong, gidParent: NLong)` Метод `copyObject` создает объект (если `gidTo`/`idTo` РЅРµ передан) СЃ помощью dpi метода, установка значений РїСЂРѕРёСЃС…РѕРґРёС‚ через Dpi-сеттеры. ## Группировка Группировка используется для систематизации хранения объектов Рё удобства восприятия пользователем, так же РіСЂСѓРїРїРёСЂРѕРІРєР° позволяет массово управлять характеристиками Рё настройками объектов класса. Дерево РіСЂСѓРїРї представляет СЃРѕР±РѕР№ иерархическую структуру, потомки наследуют характеристики предков СЃ возможностью переопределения. Для включения РіСЂСѓРїРїРёСЂРѕРІРєРё класса 1. Откройте Odm для класса 2. Задайте `group.type` - тип РіСЂСѓРїРїРёСЂРѕРІРєРё - single \ Объект может входить только РІ РѕРґРЅСѓ РіСЂСѓРїРїСѓ - multi \ Объект может входить РІ несколько РіСЂСѓРїРї 3. Задайте group.root - системное РёРјСЏ РєРѕСЂРЅСЏ РіСЂСѓРїРїРёСЂРѕРІРєРё класса ```xml <class xmlns="http://www.global-system.ru/xsd/global3-class-1.0" name="Bs_Contras" caption="Контрагент" supertype="reference" cardEditor.representation="MainCard" listEditor.representation="MainRoList" roListEditor.representation="ROList" viewOptions.openCardType="mdi" group.type="multi" group.root="Group3" /> ``` 4. Добавьте РІ набор коллекций класса развязку РіСЂСѓРїРї ```xml <var-collection name="Btk_ObjectGroup" ref.attr="gidSrcObject"/>В ``` Для подключения РіСЂСѓРїРїРёСЂРѕРІРєРё, Сѓ класса обязательно должен присутствовать глобальный идентификатор (атрибут `gid`). Для управления группами РІ карточке объекта можно добавить закладку. Для этого: 1. Откройте avm класса 2. Добавьте закладку ```xml <tabItems isVisible="true"> <tabItem selection="gtk-ru.bitec.app.btk.Btk_ObjectGroupAvi" representation="List_Object" id="2" caption="Группы объекта"/> </tabItems> ``` РЎРІСЏР·СЊ объекта СЃ РіСЂСѓРїРїРѕР№ осуществляется через класс Btk_ObjectGroup, денормализованное дерево РіСЂСѓРїРї объектов хранится РІ Btk_FlatObjectGroup. Рти таблицы РјРѕРіСѓС‚ использоваться РІ запросах для фильтрации объектов или организации прикладной бизнес-логики. ### Рнтеграция СЃ выборкой РџСЂРё включении РіСЂСѓРїРїРёСЂРѕРІРєРё РІ СЃРїРёСЃРѕРє объектов класса добавляются операции РїРѕ работе СЃ группами. Для того чтобы открыть панель РіСЂСѓРїРїРёСЂРѕРІРєРё для класса: 1. Откройте СЃРїРёСЃРѕРє объектов 2. Выполните операцию "Открыть РіСЂСѓРїРїС‹" \ РџСЂРё этом слева откроется панель СЃ деревом РіСЂСѓРїРї. РџСЂРё включенной панели РіСЂСѓРїРїРёСЂРѕРІРєРё РІ РѕСЃРЅРѕРІРЅРѕР№ части выборки Р±СѓРґСѓС‚ показываться объекты, находящиеся РІ текущей РіСЂСѓРїРїРµ или ее потомках. Новые объекты Р±СѓРґСѓС‚ создаваться РІ выбранной РіСЂСѓРїРїРµ. ## Логические выражения доступности операций\атрибутов Р’ случаях, РєРѕРіРґР° нужно настроить возможность редактирования атрибута Рё\или доступность операции, можно воспользоваться сервисом задания логических jexl-выражений доступности: `Сущности > Обозреватель проекта > {требуемаяВыборкаAvi} > Редактор атрибутов\Редактор операций > {требуемыйАтрибут\требуемаяОперация}` Р’ результате выполнения выражения доступности атрибут\операция РјРѕРіСѓС‚ быть - Доступны — СЃРєСЂРёРїС‚ вернул `true` или ничего `null` - Недоступны — СЃРєСЂРёРїС‚ вернул `false` ### Структура закладки Закладка "Выражения доступности (после/РґРѕ 'CWA')" вертикально разделена РЅР° 2 поля: СЃРєСЂРёРїС‚ выполняется ПОСЛЕ (слева) Рё ДО (справа) checkWorkability (CWA): <br/> <table class="tg"><thead> <tr> <th class="tg-0pky">После checkWorkability</th> <th class="tg-0pky">До checkWorkability</th> </tr></thead> <tbody> <tr> <td class="tg-0pky">Указанное выражение доступности имеет приоритет над прикладной логикой</td> <td class="tg-0pky">Прикладная логика имеет приоритет над указанным выражением доступности</td> </tr> <tr> <td class="tg-0pky">Результат выполнения прикладной логики может быть перезаписан</td> <td class="tg-0pky">Результат выполнения указанного выражения доступности может быть перезаписан</td> </tr> <tr> <td class="tg-0pky">Состояние переменной\операции недоступно РІ прикладной логике</td> <td class="tg-0pky">Состояние переменной\операции, определяемое указанным выражением доступности, может быть использована РІ прикладной логике</td> </tr> </tbody> </table> <br/> ```{note} Комментарии, указанные РІ формах для РІРІРѕРґР° логических выражений доступности, РњРћР–РќРћ УДАЛРРўР¬: РѕРЅРё РЅРµ участвуют РІ бизнес-логике ``` ### Выбор типа выражения доступности Р’ большинстве случаев стоит использовать форму слева, тогда указанный СЃРєСЂРёРїС‚ будет иметь иметь приоритет над прикладным РєРѕРґРѕРј РІ определении доступности переменной\операции Рё перезапишет статус "только для чтения" результатом выполнения jexl-выражения. Если доступность операции, определяемая выражением доступности, используется РІ бизнес-логике, стоит использовать форму справа. ## Сервис прикрепленных файлов Сервис прикрепленных файлов позволяет прикреплять Рє объектам класса произвольные файлы, которые сохраняются РІ специальном хранилище РЅР° сервере Рё сопоставляются СЃ конечным объектом-владельцем. ### Файловое хранилище Global3-Framework позволяет классифицировать места хранения файлов РїРѕ функциональной принадлежности. Для этой цели используется справочник файловых хранилищ системы. Файловое хранилище может быть локальным или сетевым. Локальное хранилище располагается РІ локальной директории сервера приложений. Сетевое хранилище использует SMB протокол. Перед работой СЃ файлами необходимо настроить файловые хранилища. Для открытия СЃРїРёСЃРєР° настроек: 1. Откройте приложение `Настройка системы` 2. Выполните РїСѓРЅРєС‚ меню `Сущности > Файловые хранилища` Минимально РІ системе должно быть настроено РґРІР° файловых хранилища: - `Default` – хранилище РїРѕ умолчанию - `btkAttach` – хранилище прикрепленных файлов Для минимизации роста объема файлового хранилища используется специальный алгоритм хранения, позволяющий сопоставлять СЃ РѕРґРЅРёРј физическим файлом несколько объектов системы: - Файл РІ хранилище загружается только РѕРґРёРЅ раз - копирование объектов системы, связанных СЃ файлом, РЅРµ создают - физическую РєРѕРїРёСЋ файла, Р° создают символическую ссылку РЅР° файл (`btk_attachitem`). Существует РґРІР° режима работы прикрепленных файлов: - Простой - Версионный ### Простое хранение файлов Позволяет работать СЃ прикрепленными файлами без возможности хранения истории изменений файла. Ртот режим является частным случаем версионного хранения СЃ РѕРґРЅРѕР№ версией. Версия Сѓ файла всегда остается РѕРґРЅР°, любое изменение РїСЂРёРІРѕРґРёС‚ Рє перезаписи файла версии. Для режима простого хранения файлов доступны операции: - Прикрепить файл \ Р’ хранилище добавляется новый файл, загруженный пользователем, Р° РІ закладке отображается запись, соответствующая этому файлу, отмеченная как основная. - Удаление \ Удаляется запись РёР· закладки. Р’ случае, если запись отмечена как основная, произойдет удаление файла РёР· хранилища. ```{attention} Операция удаления записи РёР· хранилища необратима ``` - Скачать файл \ РР· хранилища скачивается файл СЃ именем Рё расширением, указанным РІ записи. - Сделать файл основным \ Для записи устанавливается флаг «Основной». Для записи, которая была РѕСЃРЅРѕРІРЅРѕР№ РґРѕ этого, флаг снимается. РџСЂРё копировании родительской записи, так же копируются записи прикрепленных файлов, без флага «Основной». ### Версионное хранение файлов Версионирование прикрепленных файлов позволяет сохранять историю изменений. Если включен режим версионирования, любое изменение файла РїСЂРёРІРѕРґРёС‚ Рє созданию РЅРѕРІРѕР№ версии. Р’ режиме версионного хранения доступны операции обычного хранения, Р° также СЂСЏРґ дополнительных: - Добавить РЅРѕРІСѓСЋ версию \ Рљ записи добавляется новая версия. РџСЂРё этом предыдущая версия остается РІ хранилище. - Удалить последнюю версию \ РР· хранилища удаляется последняя версия файла. Р’ случае, если версия только РѕРґРЅР°, будет предложено удалить запись. ```{attention} Операция удаления записи РёР· хранилища необратима ``` - Отобразить историю изменений файла \ Открывается СЃРїРёСЃРѕРє СЃ версиями для текущей записи. РР· СЃРїРёСЃРєР° так же доступны операции удаление Рё скачивания для каждой версии. РџСЂРё копировании родительской записи, так же копируются записи прикрепленных файлов СЃ версиями, без флага `РћСЃРЅРѕРІРЅРѕР№`. ### Настройка РџРѕ умолчанию сервис прикрепленных файлов для класса отключен. Для подключения необходимо РІ odm файле РІ настройке класса указать тип хранения – обычный или версионный ```xml <class xmlns="http://www.global-system.ru/xsd/global3-class-1.0" name="Gds_ControlDoc" caption="Документ контроля" cardEditor.representation="Card" listEditor.representation="List" viewOptions.openCardType="mdi" supertype="document" attachType="versioned"/> ``` РџСЂРё генерации avm файла РІ отображение `List` Рё `Card`, Р° также для классов СЃ иерархией РІ отображение `tree` добавится закладка "Прикрепленные файлы" ## РџРѕРёСЃРє РїРѕ шаблону РџРѕРёСЃРє РїРѕ шаблону - серверная возможность РїРѕРёСЃРєР° объектов класса РїРѕ частичному или полному совпадению введенного текса СЃРѕ значениями полей объекта или его заголовка Рё мнемокода. РџРѕРёСЃРє регистронезависимый. ### Алгоритм работы РїРѕРёСЃРєР° 1. Определяются поля, РїРѕ которым требуется осуществлять РїРѕРёСЃРє, Рё РёС… приоритет. 2. Выполняются последовательно запросы РїРѕРєР° РЅРµ получен результат РІ РІРёРґРµ РѕРґРЅРѕР№ записи 1. РїРѕ всем полям РІ РїРѕСЂСЏРґРєРµ приоритета ищутся значения РїРѕ полному совпадению введенного текста (`=`) 2. РїРѕ всем полям РІ РїРѕСЂСЏРґРєРµ приоритета ищутся значения РїРѕ частичному совпадению введенного текста (`like`) 3. Возвращается результат \ Результатом РїРѕРёСЃРєР° является первый запрос который вернул РѕРґРЅСѓ запись, или первый запрос который вернул данные. РџРѕ умолчанию для класса включен РїРѕРёСЃРє РїРѕ шаблону, Рё осуществляется РїРѕ служебным полям `sheadline_dz` Рё `smnemocode_dz`. Сначала РїРѕ заголовку, потом РїРѕ мнемокоду. ### Настройка РїРѕРёСЃРєР° для класса Р’ odm-файле для класса добавить тег `patternSearch` ```xml <class> <patternSearch isActive="true" headLineOrder="100" mnemoCodeOrder="200" searchType="startsWith" indexHlMc="true"/> </class> ``` Описание настроек: - `isActive` \ Активность РїРѕРёСЃРєР° РїРѕ шаблону РЅР° классе. Если выключено, то функция РїРѕРёСЃРєР° РїРѕ шаблону будет возвращать 0 записей. Умолчательное значение = true - `headLineOrder` \ РџРѕСЂСЏРґРѕРє РїРѕРёСЃРєР° РїРѕ служебному полю `sheadline_dz`. Умолчательное значение = 1. Чем меньше значение, тем выше приоритет РѕРїРёСЃРєР° РїРѕ этому полю. Поля СЃ наименьшими значениями РїРѕСЂСЏРґРєРѕРІРѕРіРѕ номера обрабатываются РІ первую очередь. - `mnemoCodeOrder` \ РџРѕСЂСЏРґРѕРє РїРѕРёСЃРєР° РїРѕ служебному полю `smnemocode_dz`. Умолчательное значение = 2. Логика обработки как РІ `headLineOrder` - `searchType` \ РўРёРї РїРѕРёСЃРєР°: - РїРѕ началу слова(РїРѕ умолчанию) \ like СЃ правым % - РїРѕ вхождению \ like СЃ правым Рё левым % - `indexHlMc` \ Рндексировать поля `sheadline_dz` Рё `smnemocode_dz`. РџСЂРё включенном свойстве Р±СѓРґСѓС‚ созданы индексы РїРѕ этим поля РІ верхнем регистре. ### Настройка РїРѕРёСЃРєР° РїРѕ атрибутам 1. Откройте odm файл 2. Добавьте тэг patternSearch для нужного атрибута \ Если тег добавлен, то атрибут участвует РІ РїРѕРёСЃРєРµ РїРѕ шаблону. ```xml <attr name="sText" attribute-type="Text" type="basic" order="130" caption="Text"> <patternSearch order="10" searchType="contains"/> </attr> ``` Описание настроек: - `order` \ Порядковый номер РїРѕРёСЃРєР° РїРѕ полю этого атрибута. \ Нумерация сквозная РїРѕ классу, С‚.Рµ. можно настроить, чтобы атрибут обрабатывался раньше заголовка Рё мнемокода. - `searchType` \ РўРёРї РїРѕРёСЃРєР°: - РїРѕ началу слова(РїРѕ умолчанию) \ like СЃ правым % - РїРѕ вхождению \ like СЃ правым Рё левым % ### Перекрытие метода РїРѕРёСЃРєР° Метод реализован РІ РѕРґРЅРѕРј РёР· рутовых API: ```scala ru.bitec.app.gtk.eclipse.rdb.SEntityBaseApiImpl#findByPattern ``` Р’ наследниках его можно перекрыть, Рё написать СЃРІРѕСЋ логику РїРѕРёСЃРєР° РїРѕ шаблону. ## Объектные характеристики Характеристика – это качественное или количественное свойство объекта. Характеристиками РІ системе являются специальные атрибуты, которые содержат дополнительную пользовательскую информацию. Система может хранить характеристики РґРІСѓРјСЏ способами: - Хранение РІ json контейнере объекта \ Ртот СЃРїРѕСЃРѕР± является основным. Представляет СЃРѕР±РѕР№ NOSql расширение строки таблицы, что позволяет добавлять характеристики динамически, без пересборки проекта Рё обновления схемы базы данных. - Хранение РІ РІРёРґРµ атрибута класса СЃ признаком «объектная характеристика» \ Р’ некоторых случаях характеристики используются РІ высоконагруженной бизнес-логике, что РЅРµ позволяет использовать json контейнер. Для снижения накладных расходов доступа Рє данным характеристика может хранится РІ колонке таблицы класса. РџСЂРё добавлении характеристик, которые хранятся РІ атрибуте класса требуется синхронизация схемы БД. ### Рнтеграция СЃ выборкой Для вывода характеристик используется универсальное отображение объектных характеристик. Р—Р° необходимость генерации отображения отвечает настройка РІ Рћdm `objectAttrCardType` Варианты настройки: - `None` \ Объектные характеристики РЅРµ используются, отображение `Card_ObjectAttr` РЅРµ формируется - `Simple` \ Объектные характеристики настраиваются РІ классе или РЅР° типе объекта. Если Сѓ класса есть тип объекта, то характеристики настраиваются РЅР° типах объекта этого класса. Если Сѓ класса нет типа объекта, то выводятся РІСЃРµ объектные характеристики. - `Group` \ Объектные характеристики настраиваются для РіСЂСѓРїРї - `GroupAndObjectType` \ Объектные характеристики настраиваются для РіСЂСѓРїРї Рё дополняются характеристиками, настроенными РЅР° типе объекта. Отсутствие настройки равнозначно `objectAttrCardType="simple"В ` Р’ отображение объектных характеристик выводятся значения атрибутов, настроенных РІ качестве объектных характеристик класса. Характеристики хранятся РІ системном json атрибуте `jObjAttrs_dz`, Р° также РІ атрибутах класса СЃ признаком: `isObjectAttr="true"В ` Так же РІ этом отображении выводятся Рё `универсальные характеристики` (РЎРј. главу `Универсальные характеристики` РІ [Документация РїРѕ модулю btk](http://helpcenter/btk_documentaion_v1/html/index.html)) ### Настройка характеристик РЅР° проекте Пользователь может добавить необходимые характеристики РІ карточке класса. Для этого: 1. Откройте приложение `Настройка системы` 2. Выполните РїСѓРЅРєС‚ меню `Сущности > классы` 3. Перейдите РЅР° закладку атрибуты 4. РџСЂРё необходимости задайте значение РїРѕ умолчанию для уже созданных атрибутов 5. Создайте атрибут объектной характеристики ```{note} Рмена атрибутов должны соответствовать соглашению РїРѕ именам атрибутов: - Строковые начинаются СЃ `s`. Например, `sStringAttrName` - Числовые начинаются СЃ `n`. Например, `nNumberAttrName` - Даты начинаются СЃ `d`. Например, `dDateAttrName` - Логические начинаются СЃ `b`. Например, `bBooleanAttrName` ``` 6. Сбросьте РєСЌС€ выборки \ Для этого снимите галочку СЃ РІ пункте меню `Сервис > Управление решением > Рспользовать РєСЌС€ метаданных выборок` 7. Сбросьте РєСЌС€ настройки \ Для РЅР° текущей закладке атрибутов выполните операцию `Сбросить кеш настройки` ### Значения РїРѕ умолчанию Значения РїРѕ умолчанию заполняются РїСЂРё создании объекта. Если класс СЃ РіСЂСѓРїРїРёСЂРѕРІРєРѕР№, то значения РїРѕ умолчанию подставляются РёР· настроек РѕСЃРЅРѕРІРЅРѕР№ РіСЂСѓРїРїС‹. Для базовых атрибутов класса значение РїРѕ умолчанию указывается РІ Odm, Рё устанавливается РІ Dpi РїСЂРё вставке. Для таких атрибутов есть возможность переопределить значение, указанное РІ Odm. #### Проектное переопределение Р’ карточке класса РІ СЃРїРёСЃРєРµ атрибутов нужно установить значение РІ поле "Значение РїРѕ умолчанию". Для СЃР±СЂРѕСЃР° переопределения: - РІ СЃРїРёСЃРєРµ атрибутов выполнить операцию "Удалить переопределение значения РїРѕ умолчанию" #### Программное переопределение Программное переопределение возможно РІ методе ```scala ru.bitec.app.btk.Btk_AttributeApi#overrideDefaultValue ``` #### Правила указания значений 1. Для ссылочных полей указывается ID ссылочного объекта 2. Для атрибутов переменной ссылочности указывается GID ссылочного объекта 3. Для числовых разделителем целой части Рё РґСЂРѕР±РЅРѕР№ является точка. 4. Дата указывается РІ стандартном формате. dd.MM.yyyy HH:mm:ss. Если указать В«sysdateВ», то значением РїРѕ умолчанию будет текущая дата РЅР° момент вставки объекта. ### Програмная установка значений json-характеристик Р’ бизнес-логике: ```scala val rop = Bs_GoodsApi.load(209851.nl); //установка ссылочной характеристики Bs_GoodsApi().setAttrValue(rop, "idGradeJson", 77016.nl); ``` Р’ jexl-скрипте: ``` var rop = Bs_GoodsApi.load(209851L); //установка ссылочной характеристики Bs_GoodsApi.setAttrValue(rop, "idGradeJson", 77016L); ``` ### Проверка значений объектных характеристик Для валидации объектных\универсальных характеристик предусмотрена возможность установить правила проверки РёС… значений. Реализованы РґРІР° типа правил: 1. **Проверка значений атрибутов**\ проверяет значения характеристик, устанавливаемые пользователем 1. **Ограничение значений ссылочных атрибутов**\ ограничивает СЃРїРёСЃРѕРє доступных для выбора значений ссылочных атрибутов - **Ограничивающие атрибуты**\ РїСЂРё изменении ограничивающего проверяются правила ограничения значений зависимых атрибутов. РџСЂРё нарушении хотя Р±С‹ РѕРґРЅРѕРіРѕ правила значение атрибута обнуляется Просмотр СЃРїРёСЃРєР° всех возможных правил Рё добавление новых реализовано РЅР° закладке `Настройки Рё сервисы > Правила для атрибута` главного меню приложения #### Проверка значений атрибутов Позволяют установить условия РЅР° значения атрибутов, устанавливаемых пользователем. Каждое правило содержит РІ себе Jexl-СЃРєСЂРёРїС‚, представляющий СЃРѕР±РѕР№ логическое выражение, результат которого определяет РёСЃС…РѕРґ проверки: - `true` \ проверка пройдена - `false` \ проверка РЅРµ пройдена. Отображается ошибка, указанная РІ карточке правила РћРґРЅРѕ Рё то же правило может быть переопределено РЅР° различных сущностях. Приоритет проверки следующий: 1. Уровень типа объекта (или шаблона атрибутов) 2. Уровень РіСЂСѓРїРїС‹ ```{note} Правила атрибутов наследуются РѕС‚ родительских РіСЂСѓРїРї РІ дочерние. Возможно переопределить правило СЃ помощью соответствующей операции РЅР° детализации характеристики `Правила для атрибута`. Р’ таком случае используется переопределённая версия правила ``` 3. Уровень характеристики ##### РўРёРїС‹ вызова проверки Валидация характеристики может происходить РЅР° разных этапах взаимодействия СЃ приложением. Событие, вызывающее проверку, определяется типом проверки РІ карточке правила: - **РќР° установку значения характеристики**\ проверка вызывается после завершения редактирования характеристики - **РќР° завершение редактирования объекта**\ проверка вызывается РЅР° событии afterEdit, после сохранения объекта #### Ограничение выбора атрибутов Ограничивает СЃРїРёСЃРѕРє доступных значений ссылочных атрибутов. Правило представляет СЃРѕР±РѕР№ jexl-СЃРєСЂРёРїС‚, возвращающий SQL-условие для таблицы класса, РЅР° который ссылается атрибут. Если текущее значение атрибута РЅРµ удовлетворяет SQL-условию, РѕРЅРѕ обнуляется. Проверка выполняется рекурсивно: обнуление РѕРґРЅРѕРіРѕ атрибута вызывает проверку зависимых, РёС… обнуление Рё так далее. ```{note} Обнуление атрибута РїСЂРѕРёСЃС…РѕРґРёС‚ средствами стандартных сеттеров Рё сохраняет РёС… логику. Р’ прикладном РєРѕРґРµ необходимо использовать РёС… для корректного исполнения логики зависимых атрибутов - **Атрибуты базы данных**\ сеттеры РІ `Api` класса - **Объектные характеристики, хранящихся РІ JSON**\ `JObjectAttrApi.setObjAttrValue(rop: AnyRop, idpAttr: NLong, pValue: Any)` ``` ##### Скрипты правила Рё параметров Параметры правила РјРѕРіСѓС‚ быть значением, ссылкой или **Jexl-скриптом**, который исполняется перед проверкой правила. Значение скрипта доступно РїРѕ имени атрибута. Для указания скрипта параметра установите флажок РІ колонке `Jexl-СЃРєСЂРёРїС‚` нужного параметра детализации `Параметры проверки` карточки правила. Настроить значение исполняемого скрипта параметра можно РЅР° самом объекте РІ закладке `Jexl-СЃРєСЂРёРїС‚` детализации `Правила для атрибута > Параметр для правила атрибута` ```{note} Р’ контексте jexl-скриптов доступна СЂРѕРїР° объекта, которому принадлежит атрибут ``` ```{tip} Р’ скрипте **правила** алиас таблицы можно заменять символом `&` Например, вместо `t.idObjectType` лучше писать `&idObjectType` ``` ##### Пример правила Настроим правило для атрибута `idGoods` класса `RplTst_AllDbTypes`, ссылающегося РЅР° РўРњР¦ (`Bs_Goods`). Р’ зависимости РѕС‚ значения JSON-атрибута `nNumber` Р±СѓРґСѓС‚ выводиться только болты или гайки **JEXL-СЃРєСЂРёРїС‚ правила:** ```scala if (nNum < 5) { "upper(&sname) like '%БОЛТ%'" } else { "upper(&sname) like '%Р’РРќРў%'" } ``` **JEXL-СЃРєСЂРёРїС‚ параметра nNum:** ```scala RplTst_AllDbTypesApi.getAttrValue(rop, "nNumber"); ``` ##### Ограничивающие атрибуты Настройка ограничивающих атрибутов имеет смысл РЅР° объектах СЃ настроенными правилами ограничений выбора атрибутов: если изменяется значение ограничивающего атрибута, значения зависимых атрибутов проверяются РЅР° соответствие правилам. Рто РїСЂРѕРёСЃС…РѕРґРёС‚ рекурсивно, РїРѕРєР° РЅРµ достигнут последний зависимый атрибут РІ цепочке. Рто предотвращает некорректное состояние данных Рё обеспечивает согласованность значений ```{note} Ограничивающий атрибут может принадлежать самому объекту или его родительскому бизнес-объекту, если зависимый атрибут принадлежит коллекции Возможные типы ограничивающих атрибутов: 1. Настроенный РЅР° типе объекта 1. Настроенный РЅР° РіСЂСѓРїРїРµ 1. Настроенный РЅР° шаблоне атрибутов типа объекта ``` #### Установка Рё изменений правил валидации Правила проверки можно настроить РІ детализации `Правила для атрибута` РІ соответствующей закладке приложения: - **РќР° тип объекта**\ детализация закладки `Объектные характеристики` РІ разделе меню `Сущности > РўРёРїС‹ объектов \ РўРёРїС‹ объектов` или карточке класса - **РќР° РіСЂСѓРїРїСѓ**\ детализация закладки `Атрибуты РіСЂСѓРїРїС‹` РІ интерфейсе редактирования РіСЂСѓРїРїС‹ - **РќР° шаблон атрибутов**\ детализация закладки `Объектные характеристики` РІ разделе меню `Сущности > РўРёРїС‹ объектов \ РўРёРїС‹ объектов` или карточке класса ```{admonition} Для правил проверки значения РџСЂРё изменении правил **НЕОБХОДРРњРћ** переоткрыть выборку, так как РѕРЅРё кэшируются РЅР° загрузке ``` ```{admonition} Для правил ограничения выбора Рё ограничивающих атрибутов Рти правила кешируются стандартным СЃРїРѕСЃРѕР±РѕРј. После РёС… настройки рекомендуется сбросить РєСЌС€ СЃ помощью операции `Сбросить РєСЌС€` РІ соответствующей детализации или пункта меню `Сервис > Управление решением > Очистить РІСЃРµ кэши` ``` ## РђСѓРґРёС‚ РђСѓРґРёС‚ предназначен для фиксации различных событий РїСЂРё работе пользователей РІ системе: вставка, изменение, удаление, выполнение операций, Рё С‚.Рґ. РђСѓРґРёС‚ ведется РІ рамках бизнес-объектов Рё классов, входящих РІ БО. Для нужд аудита используется отдельная схема РІ БД, Для БО РІ схеме `Aud` формируется таблица СЃ именем `<РРјСЏ класса-шапки БО>_dzAud` РІ табличном пространстве, указанном РІ настройке модуля btk `Табличное пространство аудита` (РїРѕ умолчанию `pg_default`), РІ которой хранятся данные аудита. [Подробнее Рѕ структурах аудита БД](http://helpcenter.gs.local/global_server_app_guide_v1/html/080_addition/120_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B0%D1%83%D0%B4%D0%B8%D1%82%D0%B0.html). ```{attention} Если РІ классе включен аудит, Р° РІ классе-шапке БО, РІ который РІС…РѕРґРёС‚ этот класс – РЅРµ включен или Сѓ него РЅРµ синхронизирована структура аудита, аудит РЅРµ будет сохраняться. Класс-шапка БО для объекта класса определяется через системное поле `gidRoot_dz` ``` Настройка: 1. Зайдите РІ приложение `Настройка системы` 2. Откройте СЃРїРёСЃРѕРє классов \ РџСѓРЅРєС‚ меню `Сущности > Классы` 3. Выберите требуемый класс 4. Р’ закладке `Характеристики` установите признак `Вести аудит` 5. Если класс РЅРµ является шапкой БО, включите аудит для шапки БО 6. Для класса шапки БО выполните операцию `Создать оболочку аудита`\ РџСЂРё этом произойдет создание таблицы аудита РІ схеме аудита 7. Сбросьте `shared РєСЌС€` \ Для этого выполните РїСѓРЅРєС‚ меню `Сервис > Управление решением > Очистить РєСЌС€ ORM(shared РєСЌС€)` ```{attention} Для того чтобы аудит вступил РІ силу, пользователь должен переоткрыть форму ``` Просмотр данных аудита: - Р’ карточке объекта РїРѕ пункту меню: `Рнформация > РђСѓРґРёС‚ объекта` - Р’ СЃРїРёСЃРєРµ объектов класса РёР· контекстного меню `Рнформация > РђСѓРґРёС‚` - Общий СЃРїРёСЃРѕРє аудита `Настройка системы \ РђСѓРґРёС‚ > РђСѓРґРёС‚` Методы работы СЃ аудитом: - `Btk_AuditPkg().isEnabledAudit` \ Признак, что аудит ведется - `Btk_AuditPkg().isEnabledAudit()` \ Сеттер, для изменения признака ведения аудита РІ сессии - `Btk_AuditPkg().insertRow` \ создать запись РІ аудите. ### Перенос существующих таблиц аудита РІ указанное табличное пространство: Для обновления табличного пространства: 1. Зайдите РІ приложение `Настройка системы` 2. Откройте настройки модуля btk \ РџСѓРЅРєС‚ меню `Настройки Рё сервисы > Настройки модулей системы > Общие настройки модулей` 3. Выберите настройки модуля btk 4. Р’ настройке `Табличное пространство аудита` укажите желаемое табличное пространство 5. РџРѕ операции РїРѕРґ молоточками `Скачать файл СЃРѕ скриптом переноса таблиц аудита` скачайте СЃРєСЂРёРїС‚ sql Рё запустите РЅР° выполнение ## Автоматическая генерация штрих-РєРѕРґРѕРІ объекта Сервисная возможность РїСЂРё вставке объекта класса формировать ему штрихкод. Для этого РІ Рћdm РІ теге Class есть свойство `barCodeObjectTypeName` РІ качестве значения указывается системное РёРјСЏ объектов класса `Bs_BarCodeObjectType`. Для регистрации РЅРѕРІРѕР№ записи используется метод ```scala Bs_BarCodeObjectTypeApi().register ``` ### Описание работы маски Р’ случае, если РІ маске указано: `001-[counter]` РџСЂРё этом: - Длина штрихкода составляет 10 символов. - Следующее значение счетчика: 12 Ртоговый штрихкод: ``` 001-000012 ``` ## РџРѕРґРїРёСЃРё объектов для печати Сервисная возможность указания типа подписей объекта. Рспользуется РїСЂРё печати отчетов. Позволяет формировать РІ печатной форме СЃРїРёСЃРѕРє лиц СЃ местом для РїРѕРґРїРёСЃРё. РЎРїРёСЃРѕРє подписей настраивается РІ коллекции для печатной формы. РЎРїРёСЃРѕРє может быть переопределен Сѓ объекта. Для хранения подписей печатных бланков используется json-контейнер `jSign_dz`. Приоритет отображения данных РїРѕ типу РїРѕРґРїРёСЃРё: 1. Данные РїРѕ типу РїРѕРґРїРёСЃРё, хранимые РІ атрибуте объекта класса `jSign_dz` (формируется для всех классов) 2. Данные РёР· настроек подписей РІ отчете. РџСЂРё печати отчета, если удалось определить сохраненные РїРѕРґРїРёСЃРё объекта, то Р±СѓРґСѓС‚ переданы настройки подписей РЅР° самом отчете. РљСЂРѕРјРµ этого, РІ базовых справочниках реализована возможность формирования РєРѕРјРёСЃСЃРёР№, состав которых может быть передан РІ отчет. Подробная настройка РєРѕРјРёСЃСЃРёР№ будет рассмотрена РІ разделе «Прикладная типизация объекта класса» Данные подписей передаются РІ параметр `SIGNDATA_DZ`. Представляют СЃРѕР±РѕР№ json-объект СЃ ключами: - `idComission` – идентификатор РєРѕРјРёСЃСЃРёРё. \ Определяется через тип объекта Рё подразделение. - `data` – массив подписей объекта \ Каждый элемент представляет СЃРѕР±РѕР№ json-объект, РЅР° каждый тип РїРѕРґРїРёСЃРё. Описание полей json-объекта РїРѕРґРїРёСЃРё: - `idBlankSignType` – РР” типа РїРѕРґРїРёСЃРё - `idBlankSignTypeMC` – системное РёРјСЏ типа РїРѕРґРїРёСЃРё - `idBlankSignTypeHL` – наименование типа РїРѕРґРїРёСЃРё - `sPosition` – должность - `sFIO` – Фамилия РРјСЏ Отчество - `sBasisDocument` – Документ-основание - `dDate` – дата РїРѕРґРїРёСЃРё - `idDepartment` – РР” подразделения - `idDepartmentMC` – РєРѕРґ подразделения - `idDepartmentHL` – наименование подразделения - `nOrder` – Порядковый номер РїРѕРґРїРёСЃРё РєРѕРјРёСЃСЃРёРё Для работы СЃ атрибутом `jSign_dz` реализован API РІ пакете `Bs_ObjectSignPkg` Р’ случае, если для класса задан `тип объекта` для работы СЃ РїРѕРґРїРёСЃСЏРјРё можно воспользоваться стандартной закладкой `ru.bitec.app.bs.sign.Bs_ObjectSignAvi.List_Master` ## Полнотекстовый РїРѕРёСЃРє Сервисная возможность класса осуществлять быстрый РїРѕРёСЃРє РїРѕ значению атрибутов класса. Данные классов хранятся РІ индексе полнотекстового РїРѕРёСЃРєР° РІ схеме fts: - `Btk_FtsReg` – индекс объектов классов - `Btk_FtsWords` – индекс используемых слов. Форма РїРѕРёСЃРєР° доступна РІ главном меню приложений, РІ меню «Сервис» ### Настройка Для включения полнотекстового РїРѕРёСЃРєР° РІ Odm установить свойство класса `fts.Enabled` РІ значение `true` РџРѕ умолчанию РІСЃРµ строковые значимые/автонумерующиеся/вычисляемые, Р° также ссылочные РЅР° объект Рё атрибуты переменной ссылочности СЃ указанным ссылочным классом участвуют РІ полнотекстовом РїРѕРёСЃРєРµ. Для переопределения РїРѕРёСЃРєР° РїРѕ атрибуту используется свойство `fts.Enabled` ### Обновление индекса После обновления РєРѕРґР° РЅР° проекте Рё вызова ssh-команды `init Data` РїСЂРѕРёСЃС…РѕРґРёС‚ анализ классов. Если настройки класса изменились (класс стал индексируемым или добавились новые индексируемые атрибуты, которые РґРѕ этого РЅРµ индексировались. Новые атрибуты РЅРµ учитываются). РџСЂРѕРёСЃС…РѕРґРёС‚ планирование обновления индекса для всех объектов класса. РџСЂРё изменении объектов классов Рё сохранении РІ БД (session.flush()), которые индексируются, или РЅР° которые ссылаются объекты индексируемых классов, эти объекты добавляются РІ лог измененных объектов индекса. Значения ссылочных полей хранятся РІ строковом РІРёРґРµ, Рё определяются как значение поля `sHeadLine_dz` ссылочного объекта. Р’ системе зарегистрировано задание "Синхронизация полнотекстового индекса", которое обновляет индекс. Рто задание анализирует таблицу измененных объектов Рё таблицу измененных классов, сохраняет эти данные РІ общую очередь РЅР° индексацию, вычисляет Рё обновляет данные индекса. ### Команды строки РїРѕРёСЃРєР° Формат описания: - `Введенная строка` \ Логика обработки Команды: - `Цепь` \ Найдет текст, РІ котором присутствует слово цепь, цепи, цепью Рё тд. - `цепь звено` \ Надет текст, РІ котором присутствуют РѕР±Р° слова Рё РёС… склонения - `Цепь Рзвено` \ Тоже самое, что Рё цепь звено. Пробел считается оператором В«РВ» - `Цепь & звено` \ Тоже самое, что Рё цепь звено - `Цепь РЛРзвено` \ Надет текст, РІ котором присутствует РѕРґРЅРѕ РёР· или РѕР±Р° слова Рё РёС… склонения - `Цепь | звено` \ Тоже самое, что Рё цепь РЛРзвено - `Цепь Р (Звено РЛРКольцо)` \ Найдет текст, РІ котором есть слово цепь Рё РѕРґРЅРѕ РёР· слов звено или кольцо - `Цепь#40` \ Надет текст, РІ котором есть похожие РЅР° цепь слова, например, цеп. Число после # показывает точность РїРѕРёСЃРєР°, РѕС‚ 1 РґРѕ 100. Где 100 – полное совпадение - `#Цепь` \ Тоже самое, что Рё Цепь#40 - `Цеп*` \ Найдет текст, слова РІ котором начинаются РЅР° цеп. Например, цепь, цепная Рё тд. ## Пообъектный доступ Сервисная возможность разграничения доступа РЅР° СѓСЂРѕРІРЅРµ объектов класса. Права выдаются ролям Рё пользователям. Пользователи, замещающие РґСЂСѓРіРёС…, обладают правами замещаемых пользователей. Права РЅР° объекты выдаются РІ РІРёРґРµ РіСЂСѓРїРїС‹ доступа (`Btk_RlsAccessGroup`), РЅР° каждый объект для пользователя или роли может быть только РѕРґРЅР° РіСЂСѓРїРїР°. ### Управление правами Для управления правами РІ интерфейсах выборок используется библиотека `Btk_RlsLib`, Рё ее методы: - `manageAccess` \ Операция для стандартных выборок, вызывает интерфейс настройки прав для всех выделенных строк. Определяет объекты через поля `gid` или `id`/`idClass` - `manageAccessByGid` \ Открывает интерфейс настройки прав РїРѕ РѕРґРЅРѕРјСѓ переданному объекту - `manageAccessByGidList` \ Открывает интерфейс настройки прав РїРѕ перечню объектов Если РІ выборке администрируются одновременно несколько объектов, то изначально Р±СѓРґСѓС‚ показаны пользователи Рё роли, обладающие правами РЅР° РІСЃРµ объекты Рё одинаковыми группами доступа. Для выдачи прав РІ бизнес-логике используются методы пакета Btk_RlsPkg: - `grantToUsers` выдача прав пользователям - `revokeFromUsers` – отзыв прав Сѓ пользователей - `grantToRoles` – выдача прав ролям - `revokeFromRoles` – отзыв прав Сѓ ролей ### Удаление администрируемых объектов. РџСЂРё удалении объектов, для которых используется пообъектный доступ, необходимо выполнить очистку структур доступа. Для этого используются методы пакета Btk_RlsPkg: - `clearByObject` - `clearByObjectList` ### Проверка наличия прав РЅР° объекты Для проверки прав РІ запросах можно использовать таблицу `Btk_RlsUserRightsFlat`, РїСЂРё построении запроса необходимо использовать `exists` РїРѕ `gidObj` Рё `idUser` Для проверки прав РІ бизнес-логике используются методы пакета Btk_RlsPkg: - `getAccessByObject` - `getAccessByObjectList` ## Сервис универсальных коллекций Для работы системы реализована возможность прикрепления произвольной коллекции Рє любому классу системы, РїСЂРё этом РЅРµ создавая СЃРІСЏР·Рё между модулями Рё РЅРµ привлекая Рє настройке программиста. Для этого РІРѕ всех Dpi методах удаления вызывается ```scala Btk_UniversalTabPkg().deleteManualCollections(rop.gid) ``` РџСЂРё удалении записи РІ которой есть коллекции доступно 2 варианта действий: - Каскадное удаление \ Удаляются РІСЃРµ записи коллекций, ссылающиеся РЅР° удаляемую запись - Генерация ошибки \ РџСЂРё наличии записей РІ коллекции, ссылающихся РЅР° удаляемую, поднимается ошибка ### Подключение РёР· приложения 1. Откройте приложение `Настройка системы` 2. Выполните РїСѓРЅРєС‚ меню `Сущности > Классы` 3. Откройте карточку нужного класса 4. Перейдите РЅР° закладку `Коллекции` \ РќР° данной закладке отображаются РІСЃРµ коллекции класса, Р° также есть возможность добавить универсальную коллекцию 5. РџСЂРё необходимости добавьте универсальную коллекцию \ РџСЂРё добавлении требуется указать класс Рё атрибут ссылочности. ```{attention} Ссылочность возможна только для атрибутов СЃ типом данных `Long` Рё типом `RefObject` СЃ указанным классом для ссылочности или СЃ типом данных `Varchar` Рё типом `RefAnyObject`. Ссылочность поддерживается РІ том числе Рё для проектных атрибутов Рё объектных характеристик, хранящихся РІ json контейнере `jObjAttrs_dz` ``` 6. РџСЂРё необходимости настройте «Действие РїСЂРё удалении» 7. РџСЂРё необходимости "Удалите коллекцию" \ Удаление РёР· СЃРїРёСЃРєР° доступно только для коллекций, добавленных вручную 8. Сбросьте РєСЌС€ Btk_ClassCollection является классом попадающим РІ РєСЌС€, после подключения новых коллекций необходим СЃР±СЂРѕСЃ объектного кэша ```{attention} РџСЂРё подключении для типа объекта универсальных закладок обязательно убедитесь, что для класса указана универсальная коллекция, если РѕРЅР° необходима ``` ### Подключение РёР· прикладного РєРѕРґР° Р’ некоторых случаях необходимо подключение универсальной коллекции РёР· прикладного РєРѕРґР°, для этого можно воспользоваться методом ```scala Btk_ClassCollectionApi().register( idpBtkClass: NLong, idpRefClass: NLong, idpRefAttr: NLong, spDelAction: NString ): ApiRop ``` Доступные действия содержатся РІ объекте ```scala Btk_ClassCollectionApi ``` ## Денормализация классов-деревьев Зачастую для древовидных классов требуется вспомогательный класс денормализации, который обеспечивает более быстрый доступ Рє данным РїРѕ иерархичным СЃРІСЏР·СЏРј, чем рекурсивные запросы. Для работы системы СЃ денормализацией древовидных классов реализован трейт (`trait`) `TreeDenormApi` (`ru.bitec.app.btk.denormalization.TreeDenormApi`). Данный трейт предоставляет функциональность создания/обновления/удаления денормализации РїРѕ объектам РёР· класса-дерева. Пример: Пусть название класса-дерева будет `Btk_TreeExample`. Для подключения денормализации необходимо создать класс, хранящий денормализацию. Обычно РІ таком классе содержатся атрибуты: - `id` - `idClass` - `idParent` - `idChild` - `nParentLevel`. Для даного примера название такого класса `Btk_TreeExampleDenormalization`. После создания класса `Btk_TreeExampleDenormalization` необходимо подключить Рє его Api трейт `TreeDenormApi`. Затем имплементировать абстрактный метод `masterTableName`, который должен возвращать РёРјСЏ таблицы хранения класса-дерева `Btk_TreeExample`. Пример синтаксиса подключения: ```scala class Btk_TreeExampleDenormalizationApi extends Btk_TreeExampleDenormalizationDpi[ Btk_TreeExampleDenormalizationAro, Btk_TreeExampleDenormalizationApi, Btk_TreeExampleDenormalizationAta ] with TreeDenormApi[ EntityAbst,java.lang.Long, Btk_TreeExampleDenormalizationAro ] override def masterTableName: NString = "Btk_TreeExample" ```  Если названия полей РІ вашем классе хранения денормализации отличаются РѕС‚ обычных имён, то имеется возможность переопределения методов геттеров названий полей: ```scala def idParentFieldName = "idParent" def idChildFieldName = "idChild" def nParentLevelFieldName = "nParentLevel" ``` Далее нужно запланировать событие заполнения денормализации. Обычно это делают РІ Api РѕСЃРЅРѕРІРЅРѕРіРѕ класса (`Btk_TreeExample`) РІ методе установки ссылки РЅР° предка предположим `setidParent` Рё РІ методе `insert` РЅР° случай, РєРѕРіРґР° родительская запись остается пустой. Р’ таком методе нужно вызвать ```scala ru.bitec.app.btk.denormalization.TreeDenormApi#updateDenormAfterFlush ```  Метод `updateDenormAfterFlush` накапливает РІСЃРµ записи, которые ему передавали что позволяте обновить денормализацию после СЃР±СЂРѕСЃР° данных РІ БД. Также необходимо удалять денормализацию РїСЂРё удалении записи РёР· РѕСЃРЅРѕРІРЅРѕРіРѕ класса. Обычно это делают РІ методе `delete`. Р’ нём нужно вызвать метод ```scala ru.bitec.app.btk.denormalization.TreeDenormApi#deleteDenormBeforeFlush ``` `deleteDenormBeforeFlush` накапливает РІСЃРµ записи, которые ему передавали что позволяет удалять РїРѕ РЅРёРј денормализацию перед сохранением РІ БД. Также возможно обновление/удаление денормализации непосредственно РІ момент редактирования, Р° РЅРµ после сохранения, однако такое использование замедлит работу сервиса, Рё РѕРЅРѕ РЅРµ рекомендовано. Методы РїСЂСЏРјРѕРіРѕ обновления/удаления: ```scala ru.bitec.app.btk.denormalization.TreeDenormApi#updateDenorm ru.bitec.app.btk.denormalization.TreeDenormApi#deleteByObject ``` ```{note} Реализацию можно посмотреть РІ `Bs_DepartmentTreeApi` РІ СЃРІСЏР·РєРµ Рє `Bs_DepartmentApi`. ``` ## Настройки приложения Настройки приложения позволяют задовать глобальные константы Для получения значения настройки используйте функцию ```scala Btk_AppPropertiesTypeApi.GetbValue( sType //- Системное РёРјСЏ настройки idObjectType //РўРёРї объекта ) //возвращает true или false ``` ### Btk_AppPropertiesType Таблица настройки приложения, содержит поля: - `sSysName` - Системное РёРјСЏ - `sCaption` - Наименование - `sDescription` - Описание - `idModule` - Модуль ### Btk_AppProperties Таблица значений настроек приложения, содержит поля: - `idType` - Настройка - `idObjectType` - РўРёРї объекта - `bValue` - Значение boolean - `nValue` - Значение number - `sValue` - Значение string - `dValue` - Значение date ## Вставка изображений РІ прикреплённый файлы типов word Рё pdf Для вставки изображений РІ прикрепляемые файлы документа необходимо настроить нужные изображения РІ коллекции-расширении(Настройки вставки изображений) Рє типу объекта этого документа. Р’ коллекции доступны следующие настройки: - Активность Данное поле отвечает будет ли вставленные изображения РІ прикрепляемый файл - Печатная форма Р’ поле указывается печатная форма СЃ типом jasper Рё форматом png, которой будет передан только РѕРґРёРЅ аргумент "IDDOC" - id документа. - Рзображение Файл изображение РІ формате png ```{note} Р’ случае указания печатной формы как источник изображения файл изображения будет удалён. Если сначала будет указана печатка то РїСЂРё загрузке файла изображения, удалена будет ссылка РЅР° печатную форму. ``` - Положение изображения РїРѕ РѕСЃСЏРј XY Поля отвечают Р·Р° положение изображение внутри PDF документа, точкой отсчёта является нижний левый СѓРіРѕР» - РЁРёСЂРёРЅР° Рё высота изображение Поля отвечают Р·Р° размер изображения Как только РІ коллекции-расширении настройки изображений будет активное изображение для вставки, РІ отображении прикреплённых файлов Рє документу данного типа объекта станут активны операции для вставки данных изображений РІ РѕРґРёРЅ документ или РІРѕРІСЃРµ сразу. ## Справочник параметров Для создания локальных коллекций СЃ параметрами класса реализован трейт (`trait`) `Prm_ParamCalcApi` (`ru.bitec.app.prm.techparam.Prm_ParamCalcApi`) Рё абстрактное отображение `Prm_CalcTechOpParamAbsAvi` (`ru.bitec.app.prm.techparam.Prm_CalcTechOpParamAbsAvi`). ### Prm_ParamCalcApi Р’ трейте реализована функциональность заполнения параметров Рё РёС… значений. Обычно РІ коллекции содержатся атрибуты: - `idTechParameter` - Ссылка РЅР° параметр Prm_TechParameter - `idRefTable` - Ссылка РЅР° таблицу значений параметров Prm_RefTable - `nValue` - Числовое значение - `sValue` - Строковое значение - `dValue` - Значение даты - `bManualInput` - Параметр заполнен вручную Для использования функционала необходимо РІ Api нужного класса отнаследовать данный трейт Рё переопределить геттеры(сеттеры) параметров, Api родительского класса. Пример: ```scala class Mnf_MCOperParamApi extends Mnf_MCOperParamDpi[Mnf_MCOperParamAro, Mnf_MCOperParamApi, Mnf_MCOperParamAta] with Prm_ParamCalcApi[EntityAbst, java.lang.Long, Mnf_MCOperParamAro] { override protected def entityAta: Mnf_MCOperParamAta = Mnf_MCOperParamAta override lazy val apiParent = Mnf_MCOperApi().asInstanceOf[SApi[AnyRef, Aro[_ <: AnyRef]]] override def getsValue(rop: ApiRop): NString = rop.get(_.sValue) override def getnValue(rop: ApiRop): NNumber = rop.get(_.nValue) override def getdValue(rop: ApiRop): NDate = rop.get(_.dValue) override def getidValue(rop: ApiRop): NLong = rop.get(_.idValue) override def setidTechParam(rop: ApiRop, value: NLong): Unit = setidTechParameter(rop, value) override def getidTechParam(rop: ApiRop): NLong = rop.get(_.idTechParameter) override def getidRefTable(rop: ApiRop): NLong = rop.get(_.idRefTable) override def getidCalcFormulaByParent(ropParent: AnyRop): NLong = ropParent.asInstanceOf[Mnf_MCOperApi#ApiRop].get(_.idCalcFormula) override def isManualInput(rop:ApiRop): Boolean = rop.get(_.bManualInput).toBoolean } ``` Если РІ вашем классе РЅРµ используются какие-либо РёР· этих атрибутов, то РёС… сеттеры Рё геттеры можно переопределить РЅР° Unit() Рё null-значение соответственно. Функция `isManualInput` используется для выбора параметров, значения которых Р±СѓРґСѓС‚ рассчитаны РІ функции `refreshParamValByParent`. Дополнительные возможности: - `setParamValueRichAnyRef` - простановка значения параметра RichAnyRef(value) - `getParamValue` - получение значения параметра - `clearAllValues` - очищает значения параметра - `fillByParent` - заполнение параметров РїРѕ формуле РѕС‚ родителя - `getsParamsCodeAndValueByParent` - возвращает строку СЃРѕ значениями параметров РІРёРґР° (РєРѕРґ параметра: значение) ### Prm_CalcTechOpParamAbsAvi Абстрактная Avi содержит РІ себе РґРІР° функциональных трейта: - `Default_Calc` - Для расчета РїРѕ формуле, параметры РЅРµ хранятся - `SavedParamsCalc` - Для коллекций СЃ хранимыми значениями, можно использовать РІ паре СЃ трейтом Prm_ParamCalcApi #### Default_Calc ```{note} Пример использования - `Mct_TechOpParamAvi.List_idOperCardOperationForCalculate` Р’ интерфейсе: `Управление данными РѕР± изделии (Судостроение) -> Технология -> Справочник операционных карт (Mct_OperCardAvi.list) -> Закладка Операции -> Проверка формул РїРѕ параметрам` ``` Для использования необходимо отнаследоваться РѕС‚ данного отображения Рё переопределить методы `getFormula` (получение формулы) Рё `getParams` (получение параметров). #### SavedParamsCalc Аналогично трейту Prm_ParamCalcApi переопределяются сеттеры значений, Р° также функции `onRefresh`, `onRefreshItem` Рё `getAdditionalInfo` ```{note} Примеры использования: `ru.bitec.app.mnf.manufCard.Mnf_MCOperTestParamAvi.List_idMcOper` `ru.bitec.app.mct.techproc.Mct_TechProcNormGroupParamAvi.List_idTechProcNorm` ``` Необязательная функция `refreshValues` - заполнение параметров (РїРѕ умолчанию active = false) - для вызова функции заполнения параметров refreshParamValByParent трейта Prm_ParamCalcApi Рё/или своего необходимого функционала