Служебные атрибуты и основные сервисы#
Возможности классов расширяются сервисным окружением, которое постоянно совершенствуется.
Служебные атрибуты#
Для сервисных возможностей фреймворк добавляет в таблицы служебные атрибуты. Служебные атрибуты заканчиваются постфиксом _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.
Поиск по шаблону#
Поиск по шаблону — серверная возможность поиска объектов класса по частичному или полному совпадению введенного текста со значениями полей объекта или его заголовка и мнемокода. Поиск регистронезависимый.
Алгоритм работы поиска#
Определяются поля, по которым требуется осуществлять поиск, и их приоритет.
Выполняются последовательно запросы, пока не получен результат в виде одной записи:
По всем полям в порядке приоритета ищутся значения по полному совпадению введенного текста (
=).По всем полям в порядке приоритета ищутся значения по частичному совпадению введенного текста (
like).
Возвращается результат: первым считается первый запрос, вернувший одну запись, либо первый запрос, вернувший данные.
По умолчанию для класса включен поиск по шаблону и осуществляется по служебным полям 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. При включенном свойстве будут созданы индексы по этим полям в верхнем регистре.
Настройка поиска по атрибутам#
Откройте odm-файл.
Добавьте тег
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() принимает строку и записывает ее в журнал сервера приложений.
Метод используется как единая точка журналирования библиотеки. Это позволяет изменять способ сохранения сообщений без изменения вызывающего кода, например добавить их запись в таблицу.