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

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

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

Для сервисных возможностей фреймворк добавляет в таблицы служебные атрибуты. Служебные атрибуты заканчиваются постфиксом _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.

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

Штрихкодирование#

Система поддерживает автоматическое формирование штрих-кодов объектов и получение данных от устройств через COM-порты.

Автоматическая генерация штрих-кодов объекта#

Сервисная возможность позволяет формировать штрих-код при создании объекта класса.

Для этого в ODM в теге Class используется свойство barCodeObjectTypeName. В качестве значения указывается системное имя объекта класса Bs_BarCodeObjectType.

Для регистрации новой записи используется метод:

Bs_BarCodeObjectTypeApi().register

Например, в маске указано 001-[counter], при этом:

  • длина штрих-кода составляет 10 символов;

  • следующее значение счетчика — 12.

В результате будет сформирован штрих-код 001-000012.

Настройка работы с COM-портами#

Для взаимодействия с устройствами, подключенными через COM-порты, используется библиотека Bts_ComPortLib.

Флаг Доступно использование сканеров ШК (bAllowUseBarCodeScanner) определяет доступность работы с COM-портами.

Путь: Настройка системы > Настройки и сервисы > Настройки модулей системы > Общие настройки модулей > bts.

Значение флага распространяется на всю систему. По умолчанию флаг выключен.

Если флаг выключен, методы открытия и закрытия портов, регистрации обработчиков и обработки поступающих данных завершаются без выполнения действий и вывода сообщений.

Если флаг включен, открытие портов и регистрация обработчиков выполняются методами Bts_ComPortLib.

Зависимости#

Для работы библиотеки требуются:

  • сервер приложений версии 1.21.0 или выше;

  • Gl3BrowserPlugin версии 0.17.0 или выше;

  • Gl3BrowserExtension версии 0.17.0 или выше.

При обращении к библиотеке проверяется наличие требуемых компонентов и их версии. Если версия сервера приложений, плагина или расширения не соответствует требованиям либо плагин или расширение отсутствует, информация записывается в журнал сервера приложений.

Примечание

Сообщение об ошибке не отображается пользователю в интерфейсе.

Прием и распределение данных#

Для приема данных в выборке создается скрытая операция comPortListener. Операция вызывает одноименный метод библиотеки:

@Oper(
  visible = false,
  visibleOnToolbar = Visibilities.Invisible,
  visibleOnMainMenu = Visibilities.Invisible,
  visibleOnNavBar = Visibilities.Invisible
)
def comPortListener(): AnyRef =
  Bts_ComPortLib().comPortListener()

Операция размещается в выборке, непосредственно работающей с COM-портами, или в одном из ее предков.

Примечание

Операция должна называться comPortListener.

Для одновременной работы с COM-портами из нескольких интерфейсов операция comPortListener размещается в их общей родительской выборке, например в выборке приложения.

Поступающие данные обрабатываются следующим образом:

  • полученный набор байтов преобразуется в строку и объединяется с данными из буфера порта;

  • в полученной строке выполняется поиск разделителя;

  • часть строки перед разделителем передается контекстному обработчику;

  • поиск повторяется до обработки всех полных значений;

  • остаток строки, после которого отсутствует разделитель, сохраняется в буфере до получения следующего набора данных.

После формирования полного значения библиотека перебирает выборки, зарегистрировавшие контекстные обработчики. В переборе участвуют выборки, расположенные ниже выборки с операцией comPortListener.

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

Контекстная обработка данных#

Контекстный обработчик принимает сформированное строковое значение и выполняет требуемое действие.

Для открытия карточки объекта по штрих-коду используется метод Bs_BarCodeLib().openCardByBarcode(). Метод выполняет поиск записи BS_Barcode по переданному штрих-коду и открывает карточку объекта, указанного в поле gidRef.

Пример контекстного обработчика:

@Oper(
  visible = false,
  visibleOnToolbar = Visibilities.Invisible,
  visibleOnMainMenu = Visibilities.Invisible,
  visibleOnNavBar = Visibilities.Invisible
)
def onComPortMess(spComPortData: String): Unit = {
  Bs_BarCodeLib().openCardByBarcode(spComPortData)
}

Работа со всеми доступными портами#

Метод regComOper() регистрирует контекстный обработчик для доступных COM-портов.

Метод принимает имя операции контекстной обработки. Вызов размещается в beforeOpen() выборки:

override def beforeOpen(): Unit = {
  super.beforeOpen()
  Bts_ComPortLib().regComOper("onComPortMess")
}

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

Для отмены регистрации используется метод unRegComOper(). Если порты использовались только обработчиками текущего фрейма, после отмены регистрации они закрываются.

Вызов метода размещается в beforeClose() выборки:

override def beforeClose(): Unit = {
  super.beforeClose()
  Bts_ComPortLib().unRegComOper()
}

Метод unRegComOper() не имеет обязательных параметров. Необязательный параметр bpForce используется для принудительного закрытия портов и очистки сведений об их использовании.

Работа с выбранным портом#

Метод openComPortByName() регистрирует контекстный обработчик только для указанного COM-порта.

Метод принимает параметры:

  • portName — имя порта, например COM1 или COM3; регистр символов не учитывается;

  • operName — имя операции контекстной обработки.

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

Пример регистрации обработчика onComPortMess для порта COM3:

override def beforeOpen(): Unit = {
  super.beforeOpen()
  Bts_ComPortLib().openComPortByName("COM3", "onComPortMess")
}

Для отмены регистрации обработчика выбранного порта используется метод closeComPortByName().

Пример для порта COM3:

override def beforeClose(): Unit = {
  super.beforeClose()
  Bts_ComPortLib().closeComPortByName("COM3")
}

Запись сообщений в журнал#

Метод appendLogMessage() принимает строку и записывает ее в журнал сервера приложений.

Метод используется как единая точка журналирования библиотеки. Это позволяет изменять способ сохранения сообщений без изменения вызывающего кода, например добавить их запись в таблицу.