Содержание#
- Введение
- Предисловие
- Обзор
- Начало работы с фреймворком
- Языки разработки
- Сессия приложения
- Взаимодействие с базой данных
- Классы
- Класс
- Сервисные возможности для классов
- Служебные атрибуты и основные сервисы
- Автонумерация и генерация значений
- Управление данными объекта
- Хранение и обработка файлов
- Безопасность и системное управление
- Объектные характеристики
- Настройки логирования
- Тип объекта
- Подключение типа объекта к классу
- Подкласс
- Стандартные настройки
- Подключение индивидуальных настроек объекта
- Регистрация из кода
- Общая схема классов и типов объекта
- Sql-функции
- Выборки
- Выборка
- Отображения
- Отношение экземпляров выборок
- Доступность параметров главной выборки в подчинённых
- Передача параметров в выборку
- Открытие выборок в различных режимах
- Разметка выборки
- Операции
- Диалоги
- Мультиселект
- Настройка стилей
- Создание строки стиля. StyleBuilder
- Жизненный цикл формы
- Иконки
- Частично-загружаемые деревья
- Пример разметки выборки
- Пользовательская блокировка
- Фреймы и редакторы
- Сервис группового редактирования
- Универсальный фильтр
- Основные положения
- Доступные элементы для фильтрации
- Формирование макроса
- Фильтрация ROP-объектов в универсальном фильтре
- Использование
- Примеры использования
- Передача условий фильтра через параметры выборки
- События универсального фильтра
- Описание scala-классов, используемых фильтром
- Расширенная настройка
- Класс
- Коллекции
- Выборка
- Создание дополнительных групп фильтрации
- Связь панели стандартного фильтра с универсальным фильтром
- Добавление атрибута через панель доступных для фильтрации атрибутов УФ
- Добавление произвольного атрибута
- Режим «Только сохранение»
- Принудительная отправка значения в универсальный фильтр
- Управление возможностью редактирования значения атрибута в универсальном фильтре.
- Значение по умолчанию
- Передача значений фильтра через параметры выборки
- Получение значения атрибута фильтра
- Формирование макроса
- Строковый атрибут
- Числовой атрибут
- Булевый атрибут
- Дата
- Json атрибут
- Blob атрибут
- Сlob атрибут
- Ссылочный атрибут
- Примеры формируемого макроса
- MDA-таблица
- Аудит открытия форм и выполнения операций
- Мастер пользовательского ввода
- Выборка
- Инструменты
- Конфигуратор
- Работа в IntelliJ IDEA
- Отладка приложений
- Тестирование
- Горячие клавиши
- Статический анализ
- Отчеты
- Построение отчета
- Печатная форма
- Типы отчетов
- Интерактивные отчёты
- Основные возможности
- Объявление отчёта интерактивным
- Настройка интерактивного отчёта
- Изменение параметров интерактивного отчёта
- Пользовательские JEXL-операции
- Переопределение выборки интерактивного отчёта
- Параметры для передачи в отображение интерактивного отчёта
- Ошибки отображения интерактивного отчёта
- Jasper Reports
- Дистрибутив
- Jaspersoft Studio
- Обучающее видео
- Документация JasperReports
- Пользовательский интерфейс
- Колонки
- Bands
- Настройка среды Jaspersoft Studio
- Проект отчета
- Создание простой печатной формы
- Двухуровневый отчёт (мастер-деталь)
- Отчет книга (Report Book)
- Параметризация шаблонов
- Экспорт
- Построение отчёта на основе JSON-данных
- Скриптлет (Scriptlet)
- Публикация отчётов в БД
- Отчет с содержанием
- Шаблоны отчетов
- Организация разработки
- Основные понятия
- Проект
- Релизы
- Работа с Git
- Введение
- Основные понятия Git
- Устранение конфликтов слияния
- Ответы на частые вопросы
- Приложение
- Развёртывание рабочего места
- Руководство по эффективной разработке
- Введение
- Оптимизация работы с БД
- Целесообразность внешних ключей на регистровых таблицах
- Введение
- Внешние ключи на регистровых таблицах и их реальная цена
- Почему внешний ключ всегда приводит к появлению индекса
- Стоимость индексов при вставке данных
- Анализ использования индексов
- Сброс статистики и интерпретация данных
- Ограничения статистики: bitmap-сканирования
- Пример запроса для поиска кандидатов на удаление индексов
- Генерация/отключение/удаление индексов и внешних ключей
- HOT-обновления в PostgreSQL и управление нагрузкой
- Целесообразность внешних ключей на регистровых таблицах
- Ревью Кода Scala/SQL
- Руководство по Ревью Кода Scala
- Метаописания и Структура Классов
- Конфигурация Модулей GSF
- Использование стандартных компонентов GSF
- Обработка Ошибок и Зависимости
- Требования к Структуре Scala-Кода
- Общие Принципы и Стиль Кода
- Безопасность и Надёжность
- Производительность
- Работа с API и ROP
- Работа с Базой Данных и SQL (Дополнения)
- Архитектура и Дизайн
- Работа с Атрибутами и Полями (Дополнения)
- Строки и JSON
- Специфика UI: AVI и Списочные Отображения
- Специфика UI: Кэширование, Логика и Настройки
- Отражение (Reflection)
- Специфика Модулей и Проектов
- Безопасность и Целостность Данных
- Соответствие Best Practices
- Критические ошибки
- Руководство по Ревью SQL-запросов
- Общие моменты и плохие практики
- Указывать только нужные столбцы
- Оптимизация условий фильтрации
- Соответствие типов
- Обработка альтернативных условий
- Безопасность отрицательных условий
- Коррелированные подзапросы
- Эффективная пагинация данных
- Эффективность выборки первых записей
- Контроль дублирования и сортировки
- Баланс сортировки и производительности
- Параметры вместо «врезки» значений в SQL
- Минимизируйте количество полей в GROUP BY
- Фильтруйте по индексируемым «бизнес-полям», а не по служебным/производным
- Корректность соединения по ключам
- Рекурсивные запросы: защита от циклов обязательна
- Запрещено выполнять SQL-запросы в методе checkworkability
- Запрещено выполнять SQL-запросы внутри вложенных циклов.
- Приведение типов в соответствие с типом колонки
- Использование многострочных комментариев
/* … */вместо--
- Индексы
- JOIN-стратегии
- Индексы на ключах JOIN
- Порядок JOIN
- Оптимизация порядка операций
- Работа с большими реестрами
- Коррелированный подзапрос с несколькими полями
- «Последняя запись»
- Массовый «top-1 по ключу»
- Валидация путей доступа (количество чтений)
- Партиционирование/секционирование
- Денормализация
- Фоновые задачи для больших JOIN
- Оптимизация больших запросов
- Анализ плана выполнения
- Тестирование и мониторинг
- Работа с ORM и OQuery
- Особенности selectStatement и @FlushBefore
- Общие моменты и плохие практики
- Руководство по Ревью Кода Scala
- Оптимизация разработки
- Оптимизация работы с данными и кэшем
- Применение refreshByParent и refreshByKey
- Применение Session.commit, Session.commitWork, flush и flush(true)
- Загрузка множества объектов
- Предварительная прогрузку данных в кэш через batchIn и queryKeys
- Массовая обработка объектов через Btk_BulkProcessPkg().chunkedQuery
- При массовой регистрации объектов используйте Btk_BulkProcessPkg().findObjects.
- Оптимизация Scala-кода
- View и withFilter для оптимизации коллекций
- Объединение условий фильтрации
- Отложенные вычисления с lazy val
- Выбор коллекции по сложности поиска
- Защита циклов от зацикливания
- Встроенные методы вместо эмуляции
- ArrayBuffer вместо ListBuffer
- exists вместо filter для проверки
- isEmpty вместо length для пустоты
- getVar вместо запросов к БД в CWA
- Избегание copyAro для экономии памяти
- Разделение логики Avi и Api
- Форматирование длинных выражений
- Общие trait для повторного использования
- Библиотеки общих методов для выборок
- Экстракторы вместо полей Tuple
- Безопасные методы коллекций с Option
- Строковая интерполяция вместо конкатенации
- StringBuilder для сложных строк
- Option для обработки null-значений
- Запросы вне вложенных циклов
- Параллельные вычисления для независимых задач
- Оптимизация SQL-запросов
- Оптимизация работы с данными и кэшем
- Подготовка и включение кросс-компиляции модуля для Scala 3
- Подключение сторонних библиотек к локальному globalserver
- Переход на пакеты сборки
- Пример содержимого project.yaml
- Руководство Jexl
- Введение и основы JEXL
- Запись JEXL-макросов
- Коллекции и структуры данных
- Контроль выполнения: условия, функции и обработка ошибок
- Особенности работы в системе Global
- Практические примеры
- Справочник Jexl скриптов
- Дополнительно
- Локализация приложений
- Пользовательские (динамические) приложения
- Логирование
- ForDisableControls
- Проектные расширения
- Интеграция с сервером
- Параллельные вычисления
- Асинхронное обновление данных в связанных классах
- Средства мониторинга работы системы.
- Структуры аудита
- Аудит классов
- Журнал блокировок базы данных
btk_dblockshistory - Журнал аудита сторонних систем
btk_idextaudit - Журнал выполнения работ
btk_jobexechistory - Журнал информации о работе БД
btk_monitordbactivityaud - Журнал выполнения медленных задач
btk_slowqueryhistory - Журнал размера таблиц основных классов
btk_tablesizehistory - Журнал открытия выборок и выполнения операций
selopenhistory - Журнал аудита JEXL
jexlexechistory - Логирование событий ИБ в формате CEF
- Логирование DDL-операций
btk_ddljournal
- Сервисы сервера приложений
- Введение
- SSH-консоль сервера
- WebSocket консоль сервера
- Jexl через SOAP и REST
- REST-сервис
- Сервис отчётов
- Аутентификация в REST/SOAP-сервисах
- Работа с HTTP-запросами
- Принципы работы commit и flush
- RabbitMQ
- StyleBuilder
- DynamicEditorBuilder
- SQL-инъекции
- Наборы значений
- Работа механизма DataInstall
- Приложение
- Практические советы
- Создание выборки без класса
- Создание avm-файла для выборки без класса
- Проектное переопределение
- Наследование базовой логики
- Проектные переопределения
- Работа с данными, хранящимися в jsonb контейнере
- Работа с серализированными данными
- JSON
- XML
- Классы-расширения. Simple Extensions
- Универсальный фильтр
- Создание дополнительной группы фильтрации по классу
- Создание дополнительной группы фильтрации с произвольными атрибутами
- Добавление JSON-атрибуту признака раскрываемости в дереве атрибутов и формирование атрибутов, отображающихся при его раскрытии
- Добавление значимому атрибуту признака ссылочности и признака раскрываемости в дереве атрибутов
- Скрытие группы «Отбор»
- Как переопределить параметры события
- Настройка поля выбора в прикладной выборке с типом сравнения «Как в универсальном фильтре»
- Запуск отладки/теста
- Как вносить изменения
- Как обновить внешние зависимости
- Как переопределить методы API
- Как переопределить методы AVI
- Как переопределить сеттеры API
- Как переопределить сеттеры AVI
- Как сбросить кэш
- Как собрать проект
- Как создать класс
- Как создать коллекцию
- Как создать новое отображение
- Как создать точку расширения
- Найти и открыть класс из настройки системы
- Настройка автонумерации
- Настройка группировки класса
- Поиск по коду в Idea
- Создание логического атрибута класса
- Практики разработки
- Практика AVI
- Формирование выборки в AVI
- Работа с нехранимыми полями
- Нехранимые строки в коллекциях
- Динамические столбцы
- Технические особенности и утилиты Avi
- Динамическое изменение свойств avm через setMetaProp
- Работа с датами в onRefreshExt
- Поиск отображения на выборке
- Пользовательская блокировка
- Объект класса в процессе создания и другие состояния объекта rop
- Определение главной выборки формы
- Фильтрация в деревовидном списке (отображение Tree классов-деревьев)
- Полезные практики от опытных разработчиков
- Практика SQL
- Практика avm, примеры интерфейсов
- Практика odm
- Практика безопасность
- Практика код
- Вычисление суммы без использования буфера
- Группировка объектов с использованием null-типов
- Сравнение диапазона дат
- .distinct или .toSet для scala-коллекций и особенности применения
immutable.Map.builderвместоmutable.Map- Признак наличия модуля на проекте
- Применение ASQL/ ASelect/ OQuery/ TxIndex/ refreshByParent и byParent
- Практики при разработке документов
- Практика AVI
- Практические советы