Перейти к основному содержанию
`Ctrl`+`K`

# Инфраструктурные возможности фреймворка

Возможности классов расширяются сервисным окружением, которое постоянно совершенствуется.

## Служебные атрибуты

Для сервисных возможностей фреймворк добавляет в таблицы служебные атрибуты. Служебные атрибуты заканчиваются постфиксом `_dz`.

Пример:

- `nVersion_dz`;

- `screateuser_dz`;

- `dcreatedate_dz`.

Внимание

Разработчикам запрещено создавать и изменять такие атрибуты.

### Отображение состояния сессии в форме

Состояние сессии можно определить по цвету системных операций `Сохранить` и `Откатить` на тулбаре формы.

Все состояния формы перечислены в таблице:

Пользовательская блокировка | Данные для отправки в базу данных | Кнопка «Сохранить» | Кнопка «Откатить»
--- | --- | --- | ---
Нет | Нет | не активна | не активна
Нет | Есть | активна | активна (крест)
Есть | Нет | не активна | активна (круг)
Есть | Есть | активна | активна (крест)

## Настройки приложения

Настройки приложения позволяют задавать глобальные константы. Для получения значения настройки используйте функцию:

    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.

## Поиск по шаблону

Поиск по шаблону — серверная возможность поиска объектов класса по частичному или полному совпадению введенного текста со значениями полей объекта или его заголовка и мнемокода. Поиск регистронезависимый.

### Алгоритм работы поиска

1. Определяются поля, по которым требуется осуществлять поиск, и их приоритет.

2. Выполняются последовательно запросы, пока не получен результат в виде одной записи:

   - По всем полям в порядке приоритета ищутся значения по полному совпадению введенного текста (`=`).

   - По всем полям в порядке приоритета ищутся значения по частичному совпадению введенного текста (`like`).

3. Возвращается результат: первым считается первый запрос, вернувший одну запись, либо первый запрос, вернувший данные.

По умолчанию для класса включен поиск по шаблону и осуществляется по служебным полям `sheadline_dz` и `smnemocode_dz`. Сначала — по заголовку, затем — по мнемокоду.

### Настройка поиска для класса

В odm-файле для класса добавьте тег `patternSearch`:

    <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` для нужного атрибута. Если тег добавлен, атрибут участвует в поиске по шаблону.

Пример:

    <attr name="sText"
          attribute-type="Text"
          type="basic"
          order="130"
          caption="Text">
      <patternSearch order="10"
              searchType="contains"/>
    </attr>

Описание настроек:

- `order` — Порядковый номер поиска по полю этого атрибута. Нумерация сквозная по классу: можно настроить, чтобы атрибут обрабатывался раньше заголовка и мнемокода.

- `searchType` — Тип поиска:

  - По началу слова (по умолчанию) — `like` с правым `%`.

  - По вхождению — `like` с правым и левым `%`.

### Перекрытие метода поиска

Метод реализован в одном из рутовых API:

    ru.bitec.app.gtk.eclipse.rdb.SEntityBaseApiImpl#findByPattern

В наследниках его можно перекрыть и написать свою логику поиска по шаблону.

## Полнотекстовый поиск

Сервисная возможность класса осуществлять быстрый поиск по значению атрибутов класса.

Данные классов хранятся в индексе полнотекстового поиска в схеме fts:

- `Btk_FtsReg` — индекс объектов классов;

- `Btk_FtsWords` — индекс используемых слов.

Форма поиска доступна в главном меню приложений, в меню «Сервис».

### Настройка

Для включения полнотекстового поиска в Odm установите свойство класса `fts.Enabled` в значение `true`.

По умолчанию в полнотекстовом поиске участвуют все строковые значимые/автонумерующиеся/вычисляемые, а также ссылочные на объект и атрибуты переменной ссылочности с указанным ссылочным классом.

Для переопределения поиска по атрибуту используется свойство `fts.Enabled`.

### Обновление индекса

После обновления кода на проекте и вызова ssh-команды `init Data` происходит анализ классов. Если настройки класса изменились (класс стал индексируемым или добавились новые индексируемые атрибуты, которые до этого не индексировались; новые атрибуты не учитываются), происходит планирование обновления индекса для всех объектов класса.

При изменении объектов классов и сохранении в БД (`session.flush()`), которые индексируются, или на которые ссылаются объекты индексируемых классов, эти объекты добавляются в лог измененных объектов индекса.

Значения ссылочных полей хранятся в строковом виде и определяются как значение поля `sHeadLine_dz` ссылочного объекта.

В системе зарегистрировано задание «Синхронизация полнотекстового индекса», которое обновляет индекс. Это задание анализирует таблицу измененных объектов и таблицу измененных классов, сохраняет эти данные в общую очередь на индексацию, вычисляет и обновляет данные индекса.

### Команды строки поиска

Формат описания:

- `Введенная строка` — Логика обработки.

Команды:

- `Цепь` — Найдёт текст, в котором присутствует слово «цепь», «цепи», «цепью» и т. д.

- `цепь звено` — Найдёт текст, в котором присутствуют оба слова и их склонения.

- `Цепь И звено` — То же самое, что и `цепь звено`. Пробел считается оператором «И».

- `Цепь & звено` — То же самое, что и `цепь звено`.

- `Цепь ИЛИ звено` — Найдёт текст, в котором присутствует одно из слов или оба, с учётом склонений.

- `Цепь | звено` — То же самое, что и `цепь ИЛИ звено`.

- `Цепь И (Звено ИЛИ Кольцо)` — Найдёт текст, в котором есть слово «цепь» и одно из слов «звено» или «кольцо».

- `Цепь#40` — Найдёт текст, в котором есть похожие на «цепь» слова, например, «цеп.». Число после `#` показывает точность поиска — от 1 до 100, где 100 — полное совпадение.

- `#Цепь` — То же самое, что и `Цепь#40`.

- `Цеп*` — Найдёт текст, слова в котором начинаются на «цеп», например, «цепь», «цепная» и т. д.