Урок 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:
Сумму документа сделайте не редактируемой в карточке