Добрый день, Коллеги! 

Возник следующий вопрос.

Необходимо в реестр справочника, например Статусы обращения, вывести значения колонки IsFinal аналогично методу setSubtitleColumns согласно SDK

https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra

В коробочном решении грид справочника выглядит следующим образом:

 

 

 

 

 

Пример необходимой реализации, колонка контакт:

 

 

 

 

 

 

Отображение реестра справочника, по разделу Контакты, как понимаю, аналогично коробочной настройке реестра раздела.

Попытки задания Subtitle через дополнительный модуль, подключённый в манифесте для раздела Case, не дал результата. Что-то делаю не так.

Подскажите, пожалуйста, как именно можно вывести дополнительную колонку по таблице справочника?

Спасибо!

 

У меня такой же вопрос

1 комментарий

Примеры использования этого свойства есть в «коробке» в схемах MobileLookupGridPageConfig, MobileLookupGridOpportunityPageConfig, MobileCaseMessageHistoryModuleConfig и MobileCaseMessageHistoryModuleConfig. Судя по названию, вторая схема как раз может использоваться для окна выбора из справочника. Её код:

Terrasoft.sdk.LookupGridPage.setSubtitleColumns("Opportunity", ["Account"]);

 

Войдите или зарегистрируйтесь, чтобы комментировать
Идея

Очень хотелось бы при табличном представлении иметь возможность зафиксировать названия столбцов в шапке, чтобы они не уезжали.

Одобрена
5 комментариев

Алексей, добрый день!

Реализация статического отображения заголовков в реестре будет реализована в одной из следующих версий приложения, работы по закрытию данной задачи уже ведутся нашими разработчиками.
Вы можете следить за новым функционалом на сайте Академии Террасофт по ссылке https://academy.terrasoft.ru/documents/upcoming-releases

Здравствуйте, Алексей! Спасибо за идею. Данная функциональность уже запланирована на ближайшие релизы. В версии 7.12.0 фиксированные заголовки уже доступны в списках аналитики (итоги).

Добрый день. На сколько я понимаю, при прокрутке заголовки всё еще исчезают?

http://joxi.ru/823pxM1F9aRL5A

Александр Свистунов,

конечно!

Появилась информация о том, когда будет задача реализована? 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Есть хорошая статья

https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/kak-vydelit-cv…

и всё, что в ней написано, хорошо работает. 

Но мне надо, чтобы активная запись не меняла свой цвет на дефолтный. Как это сделать?

У меня такой же вопрос

1 комментарий

Добрый день, Алексей!

Не совсем ясна задача. Вы хотите, чтобы активная запись выделялась другим цветом? Тогда вам нужно создать модуль (не замещающий, а именно просто модуль), на вкладке LESS прописать CSS стили для CSS-класса grid-row-selected, например так:

.grid-row-selected {
	background-color: #000000 !important;
}

На первой вкладке с названием "Исходный код" прописать название модуля, чтобы не запутаться советую использовать название модуля в котором будет меняться стиль и в конце добавить суфикс Css. Например, для раздела контактов можно написать такой код в этом модуле:

define("UsrContactSectionCss", [],
		function() {
			return {};
		});

Теперь нужно переопределить ContactSectionV2 и в него прописать зависимость от наших прописанных стилей, добавив беред названием модуля "css!", т.е. код может быть такой:

define("ContactSectionV2", ["css!UsrContactSectionCss"], function() {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

При таких манипуляциях активная запись будет иметь черный фон. Так можно работать с любыми стилями.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Возможно ли сделать нумерацию строк в реестре?

Возможно ли сделать нумерацию строк в каждом реестре BPM (разделы, детали)?

Пишу сюда в надежде на помощь ибо нет даже предположений как это сделать(

У меня такой же вопрос

5 комментариев

А вам нужна именно нумерация строк или записей?
Второе решается более-менее стандартными методами, а цель первого не совсем понятна

Владимир Соколов,

именно строк, меняем сортировку, фильтры - нумерация та самая - 1,2,3,4. Многие цели клиентов нам не понятны...

Добрый день, Виталий!

Самый простой способ сделать это в разделе - это заместить обьект и добавить к нему целочисленное поле, в котором динамически проставлять нумерацию. Можно сделать и добавление колнки динамически, а не через обьект, но это намного сложнее и может привести к проблемам в некоторых разделах. Например, к разделу "Контакт" добавим поле с именем UsrRowNumber. Для этого после добавления поля к обьекту "Контакт" нужно настроить отображение колонок и вывести новосозданное поле. А потом на странице раздела ContactPageV2 переопределить метод onGridDataLoaded, чтобы получилось примерно такое:

onGridDataLoaded: function() {
  this.callParent(arguments);
  for (var i = 0; i < this.getGridData().collection.items.length; i++) {
    var itemId = this.getGridData().collection.items[i].get("Id");
    this.getGridData().get(itemId).set("UsrRowNumber", (i + 1));
  }
},

Таким образом, будет работать нумерация в разделе "Контакты". Скорее всего вам не нужна будет сортировка по этой колонке реестра, так как это не даст никакой сортировки. В этом случае можно переопределить также метод sortColumn, в котором проверять какая колонка сейчас будет отсортирована и не сортировать, если это колонка UsrRowNumber. Как пример:

sortColumn: function(index) {
  var columnsSettingsProfile = this.get("Profile");
  var columnsConfig = columnsSettingsProfile.DataGrid.listedConfig;
  var columnName;
  if (!Ext.isEmpty(columnsConfig)) {
    var columns = this.Ext.decode(columnsConfig);
    var column = columns.items[index];
    columnName = column.bindTo;
  }
  if (columnName !== "UsrRowNumber") {
    this.callParent(arguments);
  }
}

Тогда при нажатии на заголовок колонки UsrRowNumber в реестре ничего не произойдет, а во всех других случаях все будет работать.

Если же говорить про детали, то тут немного проще динамически добавить колонку. Можно попробовать перехватить Profile детали в котором находятся конфиги на отображение в списочном и плиточном отображении (listedConfig и tiledConfig). 

К примеру в методе initProfile после вызова this.callParent(arguments) взять this.get("Profile") и динамически изменить listedConfig (или tiledConfig) для изменения конфигурации колонок грида. Сначала конфиг нужно распарсить (можно использовать либо Ext.decode, либо JSON.parse), модифицировать как вам необходимо и вернуть орбатно с помощью this.set("Profile", newProfile).

Может и пойдет такое, но хотят чтобы это было в каждом раздели и детали, представление только списком будет. Без создания колонки в объекте можно сделать? Динамически нужно)

Радчук Виталий Владимирович,

Чтобы сделать сразу на всех деталях нужно делать перехват Profile как описано выше, но этот перехват делать на базовой клиентской схеме детали грида (например, BaseGridDetailV2) и тогда все будет работать для всех деталей, которые от него наследуются.

То же самое можно сказать и для раздела, но там все сложнее. Модифицировать придется также базовый раздел BaseSection, но тут нет метода initProfile, поэтому сложнее динамически модифицировать колонки.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Хочу настроить функцию Количество по связанному объекту и вывести значение в реестр как здесь https://academy.terrasoft.ru/documents/marketing/7-8/nastroyka-kolonok-…

Вопрос в том, что где-то фильтрация доступна, а где-то нет, хотя всё как будто одинаково.

Почему? Что влияет на это?

У меня такой же вопрос

1 комментарий

Здравствуйте, Алексей!

В данном случае рекомендуем Вам обратиться в службу технической поддержки с детальным описанием кейса, для анализа и предоставления консультации по текущему вопросу.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день.
Кейс следующий - у пользователя должен быть доступ к чтению всех контрагентов (для дедубликации при обработке лида), но при этом не хотелось бы давать ему доступ ко всем записям в реестре, а тем более к их фильтрации. Вижу 2 возможных решения, хотелось бы с вами проконсультироваться:

1) Вшить в раздел Контрагенты фильтр или группу, которую нельзя снять. Идельно - дать пользователю возможность выбирать 1 из групп, но запретить любую прочую фильтрацию, или доступ к реестру без группы.

2) Сделать зеркальный раздел, который будет с иными правами доступа. Контрагенты будут доступны для чтения всем и будут использоваться для дедубликации, но не будет доступен в виде реестра пользователям. Контрагент Зеркало будет с ограниченными правами доступа и доступен в виде реестра. Данный вариант выглядит значительно сложнее в дальнейшем администрировании. 

Первый вариант выглядит разумнее, но вдруг вы подскажете что-то ещё.

У меня такой же вопрос

2 комментария

Данил. Вам стоит смотреть в сторону замещения метода initQueryFilters в разделе. Он будет фильтровать записи при загрузке раздела и физически снять его пользователи не смогут.

В лиде делать выбор не из объекта Контрагенты, а из объекта, построенного на VIEW (заодно и покажете только те поля, которые хотите показать).

Войдите или зарегистрируйтесь, чтобы комментировать

Добрый день коллеги, подскажите как сделать так что бы при открытии раздела в реестре не отображались записи до того момента пока не выставишь фильтры. Заранее благодарен. BPM 7.7

У меня такой же вопрос

2 комментария

Вы можете переопределить метод загрузки данных, проверять количество фильтров, и, к примеру, ничего не делать если фильтров нет. Пример:

define("ContactSectionV2", ["ContactSectionV2Resources"],
	function(resources) {
		return {
			entitySchemaName: "Contact",
			diff: /**SCHEMA_DIFF*/[
			]/**SCHEMA_DIFF*/,
			methods: {
				loadGridData: function() {
 
					var filters = this.getFilters();
					if (filters.collection.items.length === 0) {
						return;
					}
 
					this.beforeLoadGridData();
					var esq = this.getGridDataESQ();
					this.initQueryColumns(esq);
					this.initQuerySorting(esq);
					this.initQueryFilters(esq);
					this.initQueryOptions(esq);
					this.initQueryEvents(esq);
					esq.getEntityCollection(function(response) {
						this.destroyQueryEvents(esq);
						this.updateLoadedGridData(response, this.onGridDataLoaded, this);
						this.checkNotFoundColumns(response);
					}, this);
				}
			}
		};
	}
);

Можно так же, очищать реестр в блоке if, на случай если кто-то снимет фильтр обратно.

Спасибо Максим

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

версия: 7.8 service
1. Как сделать вторую вкладку в разделе? что бы можно было там выводить другие поля из карточки.
2. Как сделать чтобы две-три колонки кроме своих названий имели еще одно общее которое будет написано вверху.

У меня такой же вопрос

8 комментариев

Виталий, здравствуйте!

Если мы правильно поняли, то как вариант Вы можете воспользоваться базовыми средствами:

1. Вы можете добавить вкладку через мастер раздела;

2. Добавить и назвать группу полей, затем расположить пользовательские колонки;

Также можете посмотреть ознакомительный видеоролик - https://www.youtube.com/watch?v=DLFjsAR2CbI&t=271s

Нет, не то, это должна быть другая вкладка реестра, как в 3.х: "все контакты", "мои контакты". Такое можно сделать?

Здравствуйте, Виталий!

В bpm'online 7.8 есть представления разделов. По умолчанию в разделах есть два представления:
1) Список
2) Итоги

Вы можете самостоятельно реализовать свое представление раздела, в котором записи будут фильтроваться согласно запрограммированным фильтрам.

Это сложная реализация, требующая навыков программирования на языке JS.

Более простой способ достижения того же результата - функционал динамических групп. Создав фильтр в динамической группе вы сможете задать фильтрацию, которая покроет ваши бизнес-задачи.

Можете дать ссылку на документацию(более сложного способа)? Если она есть по именно данному случаю.

Здравствуйте, подобную задачу решали тут:

http://www.community.terrasoft.ru/blogs/12682
И тут: http://www.community.terrasoft.ru/forum/topic/15335

Удачи.

О, благодарю, то что нужно, а что по второму вопросу? он тоже касается реестра

Надеюсь, что это увидим в ближайших версиях. По этой функциональности из 3.х многие тоскуют

Виталий, функционал раздела не позволяет отобразить несколько колонок, объединив их одним названием, поскольку название колонок берется из объекта раздела.

Владимир, зарегистрировали пожелание для будущих версий.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте.
У меня такой вопрос: можно ли сделать кастомную страницу для отображения данных таблицы в виде реестра? Я попробовал использовать преднастроенную страницу в БП, но ничего у меня не вышло.

У меня такой же вопрос

3 комментария

Виталий, опишите, пожалуйста, бизнес-задачу.
Так как по описанию не совсем понятно, что вы пытаетесь реализовать.

"Мотков Илья" написал:

Виталий, опишите, пожалуйста, бизнес-задачу.
Так как по описанию не совсем понятно, что вы пытаетесь реализовать.


Здравствуйте. У меня в БП по определенным параметрам делается поиск контрагентов и результат заносится в новый объект. И вот, после поиска нужно отобразить этот результат в виде реестра (только отобразить, т.е. с этими данными ничего сделать нельзя).

Прилагаю также скриншот БП:

В пробовал работать с элементом "Преднастроенная страница 1", но ничего не вышло.

Здравствуйте, Виталий.

Для решения данной задачи вам стоит смотреть в сторону использования контрола Terrasoft.Grid. Пример его добавления и использования есть в схеме BaseSectionV2 (NUI), эелемент DataGrid (он и отвечает за реестр записей в разделе). Особое внимание обратите на миксин GridUtilitiesV2, т.к. он содержит основные методы для работы с данным контролом.

Так же, как вариант, вы можете динамически генерировать разметку основываясь на коллекции данных используя HTML тэги и ExtJs.

Так же обратите внимание, что базовая Пред настроенная страница не наследует ту же иерархию что и схемы редактирования карточек.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день.

Создала деталь с выбором из справочника [ConfigItemModel] (создавала на основе примера: создание детали...)
Для детали был создан объект [UsrModelCIInSupplies].
Возникли ошибки при вызове окна справочника

1 ошибка
изображение 1
При этом окно справочника открывается, закрывается, дает фильтровать и дает возможность множественного выбора

2 ошибка. Вы выборе данных, они не вставляются в объект [UsrModelCIInSupplies].
изображение 2

Сам код детали

define("UsrSchema5Detail", ["ConfigurationEnums"],
        function(enums) {
        return {
                entitySchemaName: "UsrModelCIInSupplies",
                attributes: {},
                messages: {},
                methods: {
                        //колонки выбираемые запросом
                        getGridDataColumns: function() {
                                return {
                                        "Id": {path: "Id"},
                                        "UsrConfigItemModel": {path: "UsrConfigItemModel"},
                                        "UsrConfigItemModel.Name": {path: "UsrConfigItemModel.Name"}
                                };
                        },
                        //конфигурирует и отображает модальное окно справочника
                        openUsrConfigItemModelLookup: function() {
                                //конфигурирует объект
                                var config = {
                        //название схемы объекта, записи которого будут отображены в справочнике
                                        entitySchemaName: "ConfigItemModel",
                                        //множественный выбор
                                        multiSelect: true,
                                        //колонки, которые будут отображены в справочнике
                                        columns: ["Name"]
                                };
                                var UsrConsumablesId = this.get("MasterRecordId");
                                if (this.Ext.isEmpty(UsrConsumablesId)) {
                                        return;
                                }
                                //экземпляр класса [EntitySchemaQuery]
                                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                                        //установка корневой схемы
                                        rootShemaName: this.entitySchemaName
                                });
                                //добовление колонки [Id]
                                esq.addColumn("Id");
                                //добавление колонки [id] из схемы [UsrConfigItemModel]
                                esq.addColumn("UsrConfigItemModel.Id", "UsrConfigItemModelId");
                                //Создание и добаление фильтров в коллекцию запроса
                                esq.filters.add("filterUsrConsumables",
                                this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrConsumables", UsrConsumablesId));
                // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                                esq.getEntityCollection(function(result) {
                                        var existsUsrConfigItemModelCollection = [];
                                        if (result.success) {
                                                result.collection.each(function(item) {
                                                        existsUsrConfigItemModelCollection.push(item.get("UsrConfigItemModelId"));
                                                });
                                        }
                                        // Добавление фильтра в конфигурационный объект.
                                        if (existsUsrConfigItemModelCollection.length > 0) {
                                                var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                                        existsUsrConfigItemModelCollection);
                                                existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                                                existsFilter.Name = "existsFilter";
                                                config.filters = existsFilter;
                                        }
                                        // Вызов модального окна справочника
                                        this.openLookup(config, this.addCallBack, this);
                                }, this);
                        },
                        //обработчик события сохранения страницы редактирвоания
                        onCardSaved: function() {
                                this.openUsrConfigItemModelLookup();
                        },
//открывает справочник МКЕ в случае если странца была редактирвоания РМ была ранее сохранена
                        addRecord: function() {
                                var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
                                var isNewRecord = (masterCardState.state === enums.CardStateV2.ADD ||
                                masterCardState.state === enums.CardStateV2.COPY);
                                if (isNewRecord === true) {
                                        var args = {
                                                isSilent: true,
                                                messageTags: [this.sandbox.id]
                                        };
                                        this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
                                        return;
                                }
                                this.openUsrConfigItemModelLookup();
                        },
                        //добавление выбранных продуктов
                        addCallBack: function(args) {
                                //экземпляр класса пакетного запроса BatchQuery
                                var bq = this.Ext.create("Terrasoft.BatchQuery");
                                var UsrConsumablesId = this.get("MasterRecordId");
                                //коллекция выбранных в справочнике данных
                                this.selectedRows = args.selectedRows.getItems();
                                //колекция, передаваемая в запрос
                                this.selectedItems = [];
                                // Копирование необходимых данных.
                                this.selectedRows.forEach(function(item) {
                                        item.UsrConsumablesId = UsrConsumablesId;
                                        item.UsrConfigItemModelId = item.values;
                                        bq.add(this.getUsrConfigItemModelInsertQuery(item));
                                        this.selectedItems.push(item.values);
                                }, this);
                                //выполнение пакетного запроса, если он не пустой
                                if (bq.queries.length) {
                                        this.showBodyMask.call(this);
                                        bq.execute(this.onUsrConfigItemModelInsert, this);
                                }
                        },
                        //возвращает запрос на добавление текущего объекта
                        getUsrConfigItemModelInsertQuery: function(item) {
                                var insert = Ext.create("Terrasoft.InsertQuery", {
                                        rootShemaName: this.entitySchemaName
                                });
                                insert.setParameterValue("UsrConsumables", item.UsrConsumablesId,
                                this.Terrasoft.DataValueType.GUID);
                                insert.setParameterValue("ConfigItemModel", item.UsrConfigItemModelId,
                                this.Terrasoft.DataValueType.GUID);
                                return insert;
                        },
                        //метод, вызываемый при добавлении записей в реестр детали
                        onUsrConfigItemModelInsert: function(response) {
                                this.hideBodyMask.call(this);
                                this.beforeLoadGridData();
                                var filterCollection = [];
                                response.queryResults.forEach(function(item) {
                                        filterCollection.push(item.id);
                                });
                                var esq = Ext.cteate("Terrasoft.EntitySchemaQuery", {
                                        rootShemaName: this.entitySchemaName
                                });
                                this.initQueryColumns(esq);
                                esq.filters.add("recordId",
                                Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
                                esq.getEntityCollection(function(response) {
                                        this.afterLoadGridData();
                                        if (response.success) {
                                                var responseCollection = response.collection;
                                                this.prepareResponseCollection(responseCollection);
                                                this.getGridData().loadAll(responseCollection);
                                        }
                                }, this);
                        },
                        //метод, вызываемый при удалении выбранных записей детали
                        deleteRecords: function() {
                                var selectedRows = this.getSelectedItems();
                                if (selectedRows.length > 0) {
                                        this.set("SelectedRows", selectedRows);
                                        this.callParent(arguments);
                                }
                        },
                        //скрыть пункт меню [Копировать]
                        getCopyRecordMenuItem: Terrasoft.emptyFn,
                        //скрыть пункт меню [Изменить]
                        getEditRecordMenuItem: Terrasoft.emptyFn,
                        //возвращает имя колонки по умолчанию для фильтра
                        getFilterDefaultColumnName: function() {
                                return "UsrConfigItemModel";
                        }
                },
                        // Массив модификаций.
                diff: /**SCHEMA_DIFF*/[
                                {
                                        // Тип операции — слияние.
                                        "operation": "merge",
                                        // Название элемента схемы, над которым производится действие.
                                        "name": "DataGrid",
                                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                                        "values": {
                                                "rowDataItemMarkerColumnName": "UsrConfigItemModel"
                                        }
                                },
                                {
                                        // Тип операции — слияние.
                                        "operation": "merge",
                                        // Название элемента схемы, над которым производится действие.
                                        "name": "AddRecordButton",
                                // Объект, свойства которого будут объединены со свойствами элемента схемы.
                                        "values": {
                                                "visible": {"bindTo": "getToolsVisible"}
                                        }
                                }
                        ]/**SCHEMA_DIFF*/
                };
});

Задача стоит, сделать деталь такой же как, например: деталь [ConfItemUserDetail] в КЕ.

Версия продукта: service enterprise 7.8.2

У меня такой же вопрос

3 комментария

Где и как правильно поправить код?

Добрый вечер, Алеся.

Исходя из ошибки - у Вас неправильно строится запрос к базе данных в методе openUsrConfigItemModelLookup. На первом скриншоте явно видно, что запрос не был построен корректно. Проверьте правильность имен колонок, а также правильность связей. SDK.

Ошибка на втором скриншоте результат первой ошибки. Метод addCallBack получил не правильный параметр args и затем у несуществующего свойства selectedRows попытался вызвать метод forEach.

Добрый вечер.

Сегодня просидела весь день, пытаясь все таки разобраться, но к сожалению самостоятельно решить не могу.
Единственное я нашла, в каком месте падает в ошибку

// Получение всей коллекции записей и отображение ее в модальном окне справочника.
				esq.getEntityCollection(function(result) {
					var existsUsrConfigItemModelsCollection = [];
					if (result.success) {
						result.collection.each(function(item) {
							existsUsrConfigItemModelsCollection.push(item.get("UsrConfigItemModelId"));
						});
					}

изображение 1

Войдите или зарегистрируйтесь, чтобы комментировать