# Урок 7. Практика разработки. Часть 4 Цель данного урока познакомить слушателя с различными возможностями классов и выборок ## Сервис универсальных коллекций (v-collection) Универсальные коллекции - это коллекции, для которых в качестве мастера могут выступать объекты разных классов. Для изучения смотри: - [Руководство разработчика: Коллекции переменной ссылочности](books/AppGuide/030_class/060_класс.md#переменная-ссылочность) ## Денормализация классов-деревьев В нашем случае под денормализацией понимается вспомогательный класс, который обеспечивает более быстрый доступ к данным по иерархичным связям, чем рекурсивные запросы. Для изучения смотри: - [Руководство разработчика: Денормализация классов-деревьев](books/AppGuide/030_class/070_сервисы_класса.md#денормализация-классов-деревьев) ## Режимы редактирования выборки Для отображения имеется 3 варианта редактируемости, которые указываются в свойстве отображения `editMode` в разметке (файле `avm`): - `edit` - Разрешено редактирование данных. Можно запретить редактирование - `notEdit` - Запрещено редактирование данных. Можно разрешить редактирование - `readOnly` - Запрещено редактирование данных. Для редактируемых списков доступна операция [allowEdit](books/AppGuide/040_selection/080_выборка.md#allowEdit), которая меняет режим редактирования. ## Передача параметров в выборку Передача параметров в выборку - способ передачи данных между выборками, которые не зависят друг от друга. По умолчанию такая передача используется при открытии карточки, в которую передаются id объекта и режим редактирования. В передаче дополнительных параметров при создании объекта в карточке используется метод `insert_Params()`, который можно переопределить для расширения списка параметров без переопределения всего метода создания. Для изучения смотри: - [Руководство разработчика: Передача параметров в выборку](books/AppGuide/040_selection/080_выборка.md#передача-параметров-в-выборку) ## Клонируемые операции Операции, которые размножаются по результату запроса. Запрос для размножения операции может быть указан в аннотации `@Oper` в свойстве `cloneQuery` или в разметке в блоке `oper` в свойстве `cloneQuery` Результат запроса должен содержать поля: - sName - системное имя операции - nImageIndex - номер изображения для операции - sCaption - отображаемое имя операции Получение значений атрибутов запроса происходит как обычное получение атрибутов через `getVar`. Для получения значений атрибутов выборки, откуда была вызвана операция, необходимо добавить `super$` к имени атрибута ## Фильтры Фильтрация набора данных производится с помощью макроса фильтра, генерируемого на основе условий с признаком `isExpression="true"` или непосредственного добавления условия в запрос получения данных. Имя макроса берется из разметки фильтра и подставляется с префиксом `&`. Например, для `` в запрос необходимо подставить `&DefFltReferenceMacro`, в котором будет сгенерирован макрос фильтра. По умолчанию для справочников и классов с группировкой в `Dvi` генерируется подстановка макроса фильтра в запрос с помощью `prepareSelectStatement` Разметка для фильтров аналогична разметке атрибутов. Атрибуты фильтров выводятся на панели фильтрации и имеют свои собственные сеттеры. По умолчанию для справочников генерируется фильтр "Отображать неиспользуемые". В свойствах фрейма можно отключить отображение панели фильтрации с помощью свойства `frame` "`filter.isVisible`" (по умолчанию отображение отключено для карточки). Пример условия для частичного совпадения по тексту ```xml expression="upper(t.sCode) like upper('%'||:flt_sCode||'%')" ``` ## Практика ### Создание универсальной коллекции - Создайте v-collection `Lbr_Link` - "Связанные документы" с указанными ниже атрибутами |name|attribute-type|caption|Дополнительно| |-|-|-|-| | gidDoc | Varchar | Документ | Ссылается на класс Lbr_Document. Невидимый атрибут, ссылочный на мастера | | gidLink | Varchar | Связанный документ | Ссылается на класс Lbr_Document | - Подключите универсальную коллекцию к классам: - `Lbr_InAct` - Приходная накладная - `Lbr_InOrder` - Возврат книг - `Lbr_OutOrder` - Выдача книг - Выведите отображение связанных документов в закладки документов, настроенные на тип объекта. - В `Lbr_linkApi` реализуйте метод регистрации записи. \ Метод принимает `gid` документа и `gid` документа для связывания, осуществляет поиск записи с такими идентификаторами в классе, если запись есть, то возвращает ее, если записи нет, то создает и возвращает ее. - В отображении связанных документов в операции создания открывать форму выбора из списка документов `Lbr_Document` в режиме мультиселекта, для каждой выбранной записи вызывать метод регистрации, таким образом связанные документы не будут дублироваться, если пользователь выбрал документ, уже подобранный в связях. ### Создание денормализации - Создайте журнал `Lbr_CatalogTree` - "Денормализованное дерево каталога" - Подключите `Lbr_CatalogTree` в качестве денормализации для `Lbr_Catalog` - Заполните денормализацию для существующей структуры каталогов, используя метод `updateDenormFull` из `TreeDenormApi` - Для поддержания в актуальном состоянии структуры денормализованного дерева вызовите в серверных процедурах создания`(api#insert)`, удаления`(api#delete)` и установки предка`(api#setidPatent)` класса `Lbr_CatalogTree` процедуры `updateDenormAfterFlush(idpObject: NLong)` и `deleteDenormAfterFlush(idpObject: NLong)` из апи денормализованного дерева. - Добавьте в `Lbr_CatalogAvi` нехранимый атрибут, который с помощью денормализации будет отображать количество книг в каталоге и всех, входящих в него. ### Режимы редактирования выборки - Для закладки книг из [Урока 3](030_урок_3.md#добавление-закладки) выведите операцию редактирования в списке `allowEdit` ### Передача параметров в выборку - Для закладки книг из [Урока 3](030_урок_3.md#добавление-закладки) выведите операции: - Удалить. - Создать. При создании записи в нее сразу должен подставиться каталог, для которого отображается перечень книг. Подстановка должна работать как при создании в списке для редактируемого списка, так и при создании в карточке для нередактируемого списка ### Добавление фильтров - Добавьте в `Lbr_BookAvi#List` фильтры: - ISBN - Наименование - Издатель - фильтр по трем точкам. Выбор издателя из умолчательного списка Для добавления фильтров необходимо: 1. В разметке в блоке `filter` объявить или дописать условия в `macros`. Для ссылочного фильтра необходимо так же объявить HL атрибут для вывода пользователю. 1. Для HL атрибута ссылочного фильтра в `Avi` объявите сеттер, используя вызов метода `Lbr_PublisherAvi.processIdHLEvent()` с простановкой результата в ссылочный атрибут фильтра. 1. Добавьте макрос фильтра к запросу данных, используя `prepareSelectStatement`, если его там нет.