Урок 4. Практика разработки. Часть 1
Contents
Урок 4. Практика разработки. Часть 1#
В данном уроке мы рассмотрим:
Миксины
Документы
Коллекции
Автонумерацию на атрибутах класса
Миксины#
Особый вид классов, которые служат для хранения данных из разных классов. Используются для построения общих списочных форм различных диалогов подбора в пользовательских интерфейсах, а также для удобства обработки данных в прикладной бизнес-логике. Миксин позволяет объединить несколько разных таблиц вместе что дает возможность использовать внешние ключи и индексы на данное объединение. Пример: миксин Bs_Settler
- Сторона расчета
, которая объединяет в себе классы Bs_Contras
- Контрагент
и Bs_Person
- Физические лица
.
Руководство разработчика: Класс # Миксин
Документы#
Документ – это прикладной объект, который хранит данные о событиях или операциях на предприятии. Пример: Заявка на отгрузку; Приходная накладная; Акт сверки. Руководство разработчика: Класс # Cупертипы классов
Коллекции#
Коллекции представляют собой классы, объекты которых не имеют права на самостоятельное существование и могут быть созданы только для объектов других классов. Коллекции применяются в качестве табличных частей документов или логических развязок между классами. Пример: Позиции накладной; Позиции складского ордера Руководство разработчика: Класс # Коллекции
Автонумерация#
Процесс автоматической выдачи значения для атрибута класса. В основе лежит выдача порядкового номера (числа), которое может быть преобразовано в значение по маске. Руководство разработчика: Сервисы класса # Автонумерация
Практические задания#
Внимание
Соблюдайте общие принципы наименования. Руководство разработчика: Языки разработки # Общие принципы наименования
Добавление автонумерации без разреза#
В классе
Lbr_Author
сделайте автонумерующимся полеsCode
, без разреза и маской с дополнением до 4 нулей слева (пример0001
,0002
…0010
). Также уберите обязательность для ввода, чтобы не было ошибки при сохранении.
Создание классов#
Миксин для документов#
Создайте директорию
document
и в нем классLbr_Document
-Документ
с типомmixin
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
gidRef |
Varchar |
Идентификатор |
Не видимый ( |
sNumDoc |
Varchar |
№ |
|
dDoc |
Date |
Дата документа |
Редактор даты ( |
idDepOwner |
Long |
Организация |
Ссылочный на объект, ссылается на класс Bs_DepOwner |
Удалите поля id, idClass, gid, так как в миксине они не нужны (если есть)
Запустите кодогенерацию по данному классу и запустите генератор таблиц для него
Добавьте в
Lbr_MainMenuAvi
пунктМиксин для документов
подТесты и отладка
, в котором пропишите открытие умол. списка дляLbr_DocumentAvi
Документ выдача книг#
Создайте директорию
outorder
и в нем классLbr_OutOrder
-Выдача книг
с типомdocument
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
sNumDoc |
Varchar |
№ |
Автонумерующийся в разрезе организации и года (от даты), хедлайн ( |
dDoc |
Date |
Дата |
Хедлайн, значение атрибута по умолчанию - sysdate ( |
idLibrarian |
Long |
Библиотекарь |
Ссылочный на объект, Ссылается на класс Bs_Person |
idPerson |
Long |
Читатель |
Ссылочный на объект, Ссылается на класс Bs_Person |
idDepOwner |
Long |
Организация |
Ссылочный на объект, Ссылается на класс Bs_DepOwner |
Подключите к нему миксин
Lbr_Document
В этой же директории создайте класс
Lbr_OutOrderDet
-Позиции
с типомcollection
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
idDoc |
Long |
Выдача книг |
Ссылочный на объект, Ссылается на класс Lbr_OutOrder, не видимый, формирования отображения выборки для вывода данных в качестве коллекции ( |
nRow |
Number |
№ п/п |
Не копируется при выполнении копирования |
idBook |
Long |
Книга |
Ссылается на класс Lbr_Book |
Укажите данный класс как коллекцию в классе
Lbr_OutOrder
Запустите кодогенерацию для
Lbr_OutOrder
иLbr_OutOrderDet
, запустите генератор таблиц для обоих классовВ avm документа для карточки и списка подключите закладку с позициями, в списке по умолчанию закладка не видима
В avi документа для карточки на операцию сохранения пропишите обновление формы
Добавьте в
Lbr_MainMenuAvi
пунктВыдача книг
подДокументы
, в котором пропишите открытие умол. списка дляLbr_OutOrderAvi
Примечание
При выборе данных из справочника физ. лиц в фильтре установите флаг Не является сотрудником
, для того, чтобы отображались все строки.
Документ возврат книг#
Создайте директорию
inorder
и в нем классLbr_InOrder
-Возврат книг
с типомdocument
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
sNumDoc |
Varchar |
№ |
Автонумерующийся в разрезе организации и года (от даты), хедлайн, не копируется при выполнении копирования |
dDoc |
Date |
Дата |
Хедлайн, значение атрибута по умолчанию - sysdate, не копируется при выполнении копирования, редактор даты |
idLibrarian |
Long |
Библиотекарь |
Ссылочный на объект, Ссылается на класс Bs_Person |
idPerson |
Long |
Читатель |
Ссылочный на объект, Ссылается на класс Bs_Person |
idDepOwner |
Long |
Организация |
Ссылочный на объект, Ссылается на класс Bs_DepOwner |
Подключите к нему миксин
Lbr_Document
В этой же директории создайте класс
Lbr_InOrderDet
-Позиции
с типомcollection
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
idDoc |
Long |
Возврат книг |
Ссылочный на объект, Ссылается на класс Lbr_InOrder, не видимый, формирования отображения выборки для вывода данных в качестве коллекции |
nRow |
Number |
№ п/п |
Не копируется при выполнении копирования |
idBook |
Long |
Книга |
Ссылается на класс Lbr_Book |
Укажите данный класс как коллекцию в классе
Lbr_InOrder
Запустите кодогенерацию для
Lbr_InOrder
иLbr_InOrderDet
, запустите генератор таблиц для обоих классовВ avm документа для карточки и списка подключите закладку с позициями, в списке по умолчанию закладка не видима
В avi документа для карточки на операцию сохранения пропишите обновление формы
Добавьте в
Lbr_MainMenuAvi
пунктВозврат книг
подДокументы
, в котором пропишите открытие умол. списка дляLbr_InOrderAvi
Документ приходная накладная#
Создайте директорию
inact
и в нем классLbr_InAct
-Приходная накладная
с типомdocument
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
sNumDoc |
Varchar |
№ |
Автонумерующийся в разрезе организации и года (от даты), хедлайн, не копируется при выполнении копирования |
dDoc |
Date |
Дата |
Хедлайн, значение атрибута по умолчанию - sysdate, не копируется при выполнении копирования, редактор даты |
idLibrarian |
Long |
Библиотекарь |
Ссылочный на объект, Ссылается на класс Bs_Person |
nSum |
Number |
Сумма |
Денежный редактор ( |
idDepOwner |
Long |
Организация |
Ссылочный на объект, Ссылается на класс Bs_DepOwner |
Подключите к нему миксин
Lbr_Document
В этой же директории создайте класс
Lbr_InActDet
-Состав накладной
с типомcollection
и атрибутами:
name |
attribute-type |
caption |
Дополнительно |
---|---|---|---|
idInAct |
Long |
Приходная накладная |
Ссылается на класс Lbr_InAct, не видимый, формирования отображения выборки для вывода данных в качестве коллекции |
nRow |
Number |
№ п/п |
Не копируется при выполнении копирования |
idBook |
Long |
Книга |
Ссылается на класс Lbr_Book |
nQty |
Number |
Кол-во |
|
nPrice |
Number |
Цена |
Денежный редактор |
nSum |
Number |
Сумма |
Денежный редактор |
Укажите данный класс как коллекцию в классе
Lbr_InAct
Запустите кодогенерацию для
Lbr_InAct
иLbr_InActDet
, запустите генератор таблиц для обоих классовВ avm документа для карточки и списка подключите закладку с позициями, в списке по умолчанию закладки сделайте не видимыми
В avi документа для карточки на операцию сохранения пропишите обновление формы
Добавьте в
Lbr_MainMenuAvi
пунктПриходные накладные
подДокументы
, в котором пропишите открытие умол. списка дляLbr_InActAvi
Разработка бизнес логики#
Вычисление заголовка#
В
Api
классов-документов переопределите метод вычисление заголовкаcalcHeadLine
, заголовок должен быть в формате{HL класса} № {sNumDoc} от {dDoc в формате дд.мм.гггг}
.Для созданных ранее объектов пересчитайте заголовки, для этого в карточках классов, под молотком и ключом запустите операцию
Пересчитать заголовки и мнемокоды объектов класса
. Для проверки можно посмотреть данные столбца sheadline_dz в таблицах.
Установка порядкового номера для позиций#
В
Api
позиций документов переопределите методinsertByParent
и напишите установку значения в полеnRow
, как максимальный текущий номер в позициях + 1. Если позиций еще нет, то первая позиция должна начинаться с 1. Можно воспользоватьсяscala
функциейreduceOption(_ max _).getOrElse(0.nn)
В
Avi
позиций документов для отображенийList_idDoc
илиList_idInAct
переопределите методonRefresh
и допишите сортировку по полюnRow
, используяsortBy
.
Пересчитываемые поля#
Добавьте пересчеты для приходной накладной
Lbr_InActDetApi
:
Переопределите методы установки цены и количества (сеттеры
setnPrice
иsetnQty
), добавьте логику вычисления суммы в позиции с округление до 2х знаковПереопределите сеттер суммы, добавьте вычисление цены в позиции с округление до 2х знаков
Добавьте пересчет общей суммы документа при изменении суммы в позициях или удалении самой позиции
На сеттеры цены, количества и суммы добавьте проверку на отрицательный ввод, вызов ошибки осуществляется методом
throw AppException("Текст ошибки")
Lbr_InActDetAvi
:
Переопределите сеттеры цены, количества и суммы, добавьте в конце обновление текущей записи (
selection.refreshItem()
) и обновление карточки мастера (selection.master.refreshItem()
)Переопределите метод удаления (
delete
) и пропишите в конце обновление карточки мастера
Lbr_InAct.avm.xml
:
Сумму документа сделайте не редактируемой в карточке