Сервис группового редактирования#
Сервис группового редактирования позволяет массово изменять значения атрибутов для выбранных объектов. Операция может использоваться в стандартных выборках и дорабатываться в прикладном коде: например, для передачи собственного списка объектов, добавления дополнительных закладок или настройки справочников, открываемых в форме группового редактирования.
Операция группового редактирования объявлена в EntityAvi в отображении Default. Поэтому операция доступна в каждой выборке, но по умолчанию выключена.
Работа с групповым редактированием#
Групповое редактирование доступно только в тех интерфейсах, где включена стандартная операция groupEditAttr() или реализован прикладной вызов сервиса Btk_GroupEditPkg().execByRep().
Примечание
Для группового редактирования в отображении должен быть включен мультиселект. Мультиселект включается в прикладном коде. Подробнее в разделе Мультиселект.
Чтобы выполнить групповое редактирование:
Выделите объекты, значения которых нужно изменить.
Нажмите Групповое редактирование для выделенных объектов.
Операция может быть доступна:
на панели инструментов;
в контекстном меню списка:
ПКМ по списку > Настройка > Групповое редактирование выделенных объектов.
На вкладке Установка атрибутов доступны атрибуты, для которых включено групповое редактирование. Подробнее о настройке атрибутов см. раздел Включение атрибутов для группового редактирования.
Чтобы изменить значение атрибута, установите флаг рядом с нужным атрибутом и задайте новое значение.
Если для класса включена группировка объектов, в форме также доступна вкладка Установка групп. Подробнее см. раздел Установка групп.
Настройка группового редактирования#
Для работы группового редактирования необходимо:
Включить мультиселект в прикладном коде.
Включить операцию группового редактирования в выборке или реализовать вызов сервиса в прикладном коде.
Включить для атрибутов возможность группового редактирования.
Включение группового редактирования#
В прикладном коде
Чтобы включить операцию группового редактирования, переопределите groupEditAttr() в отображении и задайте для операции active = true:
@Oper(
active = true,
headOperation = "extraOperation"
)
override def groupEditAttr(): Unit = super.groupEditAttr()
В интерфейсе
Операцию группового редактирования можно включить без изменения кода через обозреватель проекта.
Путь: Приложение «Настройки системы» > Сущности > Обозреватель проекта > необходимый модуль > нужная выборка > Редактор операций > groupEditAttr.
В редакторе операций для операции groupEditAttr нужно установить флаг включения операции.
Включение атрибутов для группового редактирования#
В прикладном коде
Для включения возможности группового редактирования на атрибуте в ODM или AVM нужно добавить флаг isGroupEditAvailable.
Пример настройки в ODM:
<!-- odm -->
<attr name="dDoc" attribute-type="Date" caption="Дата док-та" order="60" type="basic" isVisible="true"
editorType="datePick" isHeadLine="true" isCopyInCopyObject="false" isGroupEditAvailable="true" />
Пример настройки в AVM:
<!-- avm -->
<attr name="dDoc" caption="Дата док-та" editorType="datePick" order="60" isGroupEditAvailable="true" />
Для JSON-атрибутов групповое редактирование можно включить при регистрации. По умолчанию оно выключено:
Btk_AttributeApi().registerJsonAttr(
idpClass = idClass,
spSystemName = "dCreateDoc".ns,
spCaption = "Дата создания док-та",
spAttrType = AttributeTypes.Long.toString,
spType = AttrTypes.Basic.toString,
bpGroupEditAvailable = 1.nn
)
В интерфейсе
Если нужно включить групповое редактирование без изменения кода, откройте атрибут класса и установите флаг в столбце Групповое редактирование атрибутов.
Путь: Приложение «Настройки системы» > Сущности > Классы.
Редактируемые объекты#
В групповом редактировании изменяются объекты, соответствующие выбранным строкам выборки. Сервис может определить такие объекты автоматически по атрибутам выборки или получить готовый список объектов через параметр listObjects.
Автоматическое определение объектов#
Редактируемый объект представляет собой ссылку на провайдер строки определенного класса.
Для классов в отображении выполняется поиск атрибута с наименованием id, для миксинов — gidRef.
Если отображение не привязано к классу, выполняется поиск по атрибутам:
id;gid;gidRef.
Если ни один из этих атрибутов не найден, будет выдано исключение.
Передача своего списка объектов#
Если нужно передать свой список изменяемых объектов, переопределите операцию группового редактирования и передайте список в параметр listObjects метода Btk_GroupEditPkg().execByRep().
Пример:
@Oper(
active = true,
headOperation = "extraOperation"
)
override def groupEditAttr(): Unit = {
val idList = (0 until selection.selectedRecordsCount()).map { idx =>
// Вместо id используется idTask
NLong.fromAny(selection.selectedValueByName("idTask", idx))
}.toList
Btk_GroupEditPkg().execByRep(
baseRep = this,
listObjects = idList
)
}
Вызов сервиса из прикладного кода#
Инициация группового редактирования выполняется вызовом метода Btk_GroupEditPkg().execByRep().
Параметры метода execByRep#
Основной параметр
baseRep— отображение, в котором вызывается групповое редактирование.
Список изменяемых объектов
listObjects— необязательный списокAny:idилиgidобъектов в зависимости от выборки. Используется для передачи пользовательского списка изменяемых объектов.
Дополнительные закладки и атрибуты
addTabs— необязательная последовательностьSeq[GroupEdit_TabsRow]. Содержит объекты case-класса с описанием дополнительных закладок для формы группового редактирования.addAttrs— необязательная последовательностьSeq[GroupEdit_AddAttr]. Содержит объекты case-класса с описанием дополнительных редактируемых атрибутов.
Фильтры и справочники
mapFltCondition— необязательное соответствиеMap[String, FltCondition], где ключ — имя атрибута в групповом редактировании, значение — условие для универсального фильтра.mapRefListParams— необязательное соответствиеMap[NString, Map[String, Any]], где ключ — имя атрибута в групповом редактировании, значение — параметры для отображения открываемого справочника.mapRefListRep— необязательное соответствиеMap[NString, NString], где ключ — имя атрибута в групповом редактировании, значение — название отображения, которое открывается как справочник.mapJEXLBeforeHLSetter— необязательное соответствиеMap[NString, NString], где ключ — имя атрибута в групповом редактировании, значение — JEXL-скрипт, который выполняется перед открытием справочника HL-поля.
Отключение вкладки установки групп
bDisableGroupEdit— необязательный флаг, который отключает вкладку массового редактирования групп. По умолчанию значениеfalse.
Пример вызова с необязательными параметрами#
Пример переопределения операции с использованием необязательных параметров:
@Oper(active = true, caption = "Массовое редактирование позиций", order = 50, imageIndex = 102)
override def groupEditAttr(): Unit = {
val idavChosenPos = getSelfVar("idaChosenPos").asNString.toNLongList
val fltCondition = FltCondition().withMainGroup { gr =>
gr.addAttr("attr:id/attr:object_dz", idagBankAccByMasterDepOwner, FltAttributeCompareKind.inList)
}
// Соответствие: имя атрибута в групповом редактировании > условие для универсального фильтра
val mapAttrNameToFltCondition = Map(
"idDepOwnerBankAccHL" -> fltCondition
)
// Соответствие: имя атрибута в групповом редактировании > отображение для списка справочника
val mapAttrNameToListRep = Map(
"idsettlerpayacchl".ns -> "Pm_ExpPayRegPosAvi.List_SettlerPayBankAccForChoose".ns,
"gidsettlerpayhl".ns -> "Pm_ExpPayRegPosAvi.List_SettlerPayForChoose".ns
)
Btk_GroupEditPkg().execByRep(
baseRep = this,
listObjects = idavChosenPos,
mapFltCondition = mapAttrNameToFltCondition,
mapRefListRep = mapAttrNameToListRep
)
}
Применение значений при групповом редактировании#
Сервис применяет значения разными способами в зависимости от типа изменяемого атрибута:
для атрибута класса вызывается его сеттер из API;
для объектной характеристики вызывается
Api.setAttrValue(), который устанавливает значение в JSON объектных характеристик;для нехранимого атрибута отображения значение устанавливается через
selection.setVar();для дополнительных изменяемых атрибутов, переданных через параметр
addAttrs, вычисляется JEXL-скриптGroupEdit_AddAttr.setterJEXL. Этот скрипт выполнит установку значения.
Порядок применения изменений
Если пользователь одновременно изменяет несколько атрибутов, порядок их применения не фиксируется. Очередностью применения изменений управлять нельзя.
Например, если пользователь одновременно меняет поля Договор и Этап договора, не следует закладывать логику, которая зависит от порядка применения этих изменений.
Клиентские сеттеры
В стандартной логике группового редактирования клиентские сеттеры для полей не вызываются принудительно. Если список нередактируемый, стандартный механизм группового редактирования не предназначен для вызова клиентских сеттеров.
Если для массового изменения нужна отдельная логика установки значений, создайте пользовательскую закладку группового редактирования через параметр addTabs. В обработчике закладки можно получить редактируемый объект из GroupEdit_TabsRowParam и выполнить собственную логику изменения для всех выбранных объектов.
Подробнее см. раздел Дополнительные закладки.
Установка групп#
Если на классе включена возможность группировки объектов, в отображении группового редактирования появляется закладка Установка групп. На этой закладке можно задать группы для выделенных записей.
Подробнее см. раздел Группировка.
Дополнительные закладки#
В форму группового редактирования можно добавить пользовательские закладки для кастомной логики массового изменения.
Такие закладки используются, если кроме изменения значений атрибутов нужно выполнить дополнительные действия для всех выбранных объектов. Программист может создать любую закладку, из которой можно изменять контекст массового редактирования и применять действие ко всем выбранным объектам.
Для этого переопределите операцию группового редактирования, в которой вызывается Btk_GroupEditPkg().execByRep, и передайте параметр addTabs.
Параметр addTabs принимает последовательность объектов закладок для данного отображения.
Закладки представлены case-классом GroupEdit_TabsRow. Он принимает данные об отображении и функцию обработки объекта.
Функция обработки объекта#
Функция обработки объекта принимает один параметр в виде case-класса GroupEdit_TabsRowParam.
GroupEdit_TabsRowParam содержит:
сессию выполнения группового редактирования;
редактируемый объект, который может быть представлен как
NGidилиNLong.