javascript javascriptSDK
Технические вопросы
7.x

Дайте пожалуйста ссылку на SDK, где описывается создание страницы на Java Script.

Нравится

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

Здравствуйте, Евгений.

Страницу редактирования Вы можете создать с помощью мастера раздела (если речь идет о версии 7.3 и выше).

Если речь идет о 7.2.2 и ниже, посмотрите статью на SDK:
http://www.terrasoft.ua/bpmonlinesdk/CreateStandartSection.html

А в 7.6 страницу "Продукт в счёте" и "Продукт в заказе" уже в Мастере не поредактировать :(

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

Данные и другие детали, где есть упоминается продукт («Продукт в счете», «Продукт в заказе» или например, пользовательская деталь «Продукт в документе»), нельзя редактировать через мастер, так как в приложении присутствует («защита») определенная логика работы данного объекта.

Как вариант детали можно редактировать через конфигурацию.

Показать все комментарии
раздел
фильтр
чекбокс
Технические вопросы
7.x

Добрый день!
В ITIL в разделе Обращения есть фильтр-галочка "Показать закрытые".
По умолчанию закрытые обращения не отображаются, при нажатии на фильтр-галочку начинают показываться.

сам фильтр( его отображение) добавляется в схеме CaseSection

Хотелось бы создать по аналогии фильтр-галочку в этом же разделе - "показать разрешенные".
Унаследована схема CaseSection
Прописаны по аналогии атрибуты и расположение фильтра в разделе
attributes: {
"IsDesideActive": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: false
},
"StatusDesideFilterContainerDisplay": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},

diff: /**SCHEMA_DIFF*/[
//FiltersContainer
{
"operation": "insert",
"parentName": "IsActiveFiltersContainer",
"propertyName": "items",
"name": "IsDesideActive",
"values": {
"caption": {
bindTo: "Resources.Strings.CheckBoxDesideFilterCaption"
},
"bindTo": "IsDesideActive",
"controlConfig": {
"className": "Terrasoft.CheckBoxEdit",
"checkedchanged": {
"bindTo": "onCheckboxChecked"
},
"checked": {
"bindTo": "IsDesideActive"
}
}
}
}
]/**SCHEMA_DIFF*/

При этом новый фильтр-галочка не вмещается и накладывается на фильтр фиксированный по ответственному

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

Нравится

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

я бы попробовал внутри "values" описания новых "галочек" добавить параметр "layout", а вот в нем подобрать значения определяющие положение контрола
"values": {
...
"layout": {"column": 14, "row": 0, "colSpan": 2},
...
}

не помогает, я так понимаю, что нужно именно подвинуть как-то расположение уже существующих фиксированных фильтров

"Татаровская Дарья" написал:нужно именно подвинуть как-то расположение уже существующих фиксированных фильтров

я вот пока как их сдвинуть не нашел :)
Тоже попробовал в эту панель добавить элементы, пока не особо получилось, подождем может что кудесники из поддержки подскажут

В первую очередь необходимо увеличить размер контейнера, в который Вы добавляете свой элемент:
{
"operation": "merge",
"name": "IsActiveFiltersContainer",
"values": {
"styles": {"width":"360px"},
"layout": {"column": 0, "row": 0, "colSpan": 24}
}
}
Далее необходимо, чтобы уже находящийся в контейнере первый чекбокс не заполнял все доступное пространство:
{
"operation": "merge",
"name": "IsActive",
"values": {
"layout": {"column": 0, "row": 0, "colSpan": 12},
"styles": {"width":"50%"}
}
}
Для корректного отображения у себя в определении элемента, добавьте следующие свойства:
"values": {
"caption": {
bindTo: "Resources.Strings.CheckBoxDesideFilterCaption"
},
"layout": {"column": 12, "row": 0, "colSpan": 12},
"styles": {"width":"50"},

"Александр Зубков" написал:Далее необходимо, чтобы уже находящийся в контейнере первый чекбокс не заполнял все доступное пространство

Вот теперь понятно почему у меня контрол не виден новый был. Спасибо)

Спасибо

Показать все комментарии
преднастроенные фильтры
фильтр
Технические вопросы
7.x

Доброго времени суток, сообщество! Столкнулся со следующей проблемой и надеюсь на вашу помощь.

В разделе есть два преднастроенных фильтра: Дистрибьютор и ShipTo . Нужно чтобы после выбора значения в фильтре "Дистрибьютор" обновлялся параметр "filter" для фильтра "ShipTo".

Подробнее: В фильтре "ShipTo" пользователь должен иметь возможность выбрать запись только из тех, которые есть у Дистрибьютора, выбранного в фильтре "Дистрибьютор", на детали ShipTo.

Как реализовать фильтр в общем понятно. Но проблема в том, что фильтр инициализируется лишь раз, а мне надо чтобы при выборе одного фильтра проходила "переинициализация" другого.

Надеюсь понятно объяснил, это было не легко :smile:

Прилагаю код моих преднастроенных фильтров:

initFixedFiltersConfig: function(recursion) {
                    var self = this;
                    var fixedFilterConfig = {
                        entitySchema: this.entitySchema,
                        filters: [
                            {
                                name: "SxDistributor",
                                caption: this.get("Resources.Strings.SxDistributorFilterCaption"),
                                addSxDistributorCaption: this.get("Resources.Strings.SxAddDistributorFilterCaption"),
                                referenceSchemaName: "Account",
                                entityColumn: {
                                    isLookup: true
                                },
                                notNeedCurrentUser: true,
                                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                                filter: function(){
                                    // Получаем список контрагентов у которых есть тип "Дистрибьютор"
                                    if(self.get('AccountId').length > 0) {
                                        //  Фильтруем контрагентов по полученному списку
                                        return Terrasoft.createColumnInFilterWithParameters(
                                            "Id", self.get('AccountId'));
                                    }else{
                                        return false;
                                    }
                                },
                                getFilter: function (filterInfo) {
                                    if(filterInfo.value) {
                                        /*  Генерируем фильтр для ShipTo   */
                                        var ShipToId = [];  //  Список ShipTo выбранного Контрагента
                                        var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                                            rootSchemaName: 'SxShipTo'
                                        });
                                        esq.addColumn('Id');
                                        esq.filters.add('SxAccount',
                                            esq.createColumnFilterWithParameter(
                                                Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
                                        esq.getEntityCollection(function (response) {
                                            if (response.success) {
                                                ShipToId = [];
                                                response.collection.each(function (item) {
                                                    ShipToId.push(item.values.Id);
                                                });
                                                self.set('ShipToId', ShipToId);

                                                // TODO Надо обновить filter для фильтра ShipTo
                                            }
                                        }, this);

                                        /*  Фильтруем раздел по полю Контрагент    */
                                        var filter;
                                        filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
                                            "SxAccount", filterInfo.value));
                                        return filter;
                                    }
                                }
                            },

                            {
                                name: "SxShipTo",
                                caption: this.get("Resources.Strings.SxShipToFilterCaption"),
                                addSxShipToCaption: this.get("Resources.Strings.SxAddShipToCaption"),
                                referenceSchemaName: "SxShipTo",
                                entityColumn: {
                                    isLookup: true
                                },
                                notNeedCurrentUser: true,
                                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                                filter: function(){
                                    //  Получаем список записей ShipTo выбранного Контрагента
                                    if(self.get('ShipToId').length > 0) {
                                        return Terrasoft.createColumnInFilterWithParameters(
                                            "Id", self.get('ShipToId'));
                                    }else{
                                        //  Если ShipTo пустой ставим невыполнимый фильтр. Список пуст.
                                        return Terrasoft.createColumnIsNullFilter("Id");
                                    }
                                },
                                getFilter: function (filterInfo) {
                                    //  Фильтруем раздел по полю ShipTo
                                    var filter;
                                    filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
                                        "SxShipTo", filterInfo.value));
                                    return filter;
                                }
                            }
                        ]
                    };
                    this.set("FixedFilterConfig", fixedFilterConfig);
                }

Нравится

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

Вячеслав, добрый день!

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

Как вариант, можно вызвать повторную инициализацию всех фильтров, добавив вызов метода self.initFilters() примерно в том месте, где у Вас расположен комментарий

// TODO Надо обновить filter для фильтра ShipTo

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

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

1) Изменить метод getFilter первого фильтра примерно так:

getFilter: function (filterInfo) {
	if (!self.get("ChildFiltersInitializing")) {
		if(filterInfo.value) {
			/*  Генерируем фильтр для ShipTo   */
			var ShipToId = [];  //  Список ShipTo выбранного Контрагента
			var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
				rootSchemaName: 'SxShipTo'
			});
			esq.addColumn('Id');
			esq.filters.add('SxAccount',
			esq.createColumnFilterWithParameter(
				Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
			esq.getEntityCollection(function (response) {
				if (response.success) {
					ShipToId = [];
					response.collection.each(function (item) {
						ShipToId.push(item.values.Id);
					});
					self.set('ShipToId', ShipToId);
 
					// TODO Надо обновить filter для фильтра ShipTo
 
					self.set("ChildFiltersInitializing", true);
					self.initFilters();
				}
			}, this);
		} else {
			if ((self.get("ChildFiltersInitializing") !== undefined) && self.get("ShipToId")) {
				self.set("ShipToId", null);
				self.set("ChildFiltersInitializing", true);
				self.initFilters();
			}
		}
	}
 
	/*  Фильтруем раздел по полю Контрагент    */
	var filter;
	filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
		"SxAccount", filterInfo.value));
	return filter;
}

2) добавить переопределение метода onFilterUpdate для инициализации флага:

onFilterUpdate: function() {
	this.callParent(arguments);
	if (this.get("ChildFiltersInitializing")) {
		this.set("ChildFiltersInitializing", false);
	}
}

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

Показать все комментарии
изображение
реестр
Технические вопросы
7.x

Добрый день!
Стоит задача: добавить в реестр детали продуктов изображение восклицательный знак возле записи, у которой выполняется некое условие, наподобие функционала в подборе продуктов.
Как это можно реализовать?
Версия 7.6

Нравится

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

Здравствуйте, Иван!

В разделе "Продажи" есть колонка "Настроение", которая выводится в реестр в виде изображения.

Вы можете посмотреть реализацию и сделать по аналогии.

Показать все комментарии

Добрый день!

Пытаюсь в процессе задать время срабатывания таймера.

Timer1.StartOffset = 40;

После этого таймер перестает работать.
Он работает только тогда, когда время задано в дизайнере и не меняется программно.
В чем может быть дело?

Версия 7.2.0.1530

Нравится

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

Здравствуйте!

Создайте параметр процесса с типом "Целое число". В элементе "Таймер" значение параметра StartOffset задайте значение созданного параметра.
Тогда Вам нужно будет задавать значение не параметру самого таймера, а параметру бизнес процесса. Попробуйте - должно сработать!

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

Прикладываю процесс.

В логе:

2015-09-23 17:42:08,509 [6336] DEBUG RND-DTZ-SRV2\user2 .. ScriptTask6Execute - XX before exec
2015-09-23 17:42:08,509 [6336] DEBUG RND-DTZ-SRV2\user2 .. ScriptTask1Execute - YY before exec
2015-09-23 17:42:21,024 [BPMonlineQuartzScheduler_Worker-3] DEBUG RND-DTZ-SRV2\user2 .. ScriptTask10Execute - XX after exec

Второй таймер не срабатывает.

Вообще таймеры работают очень странно. Никак не могу с ними разобраться.

"Бардашев Юрий Николаевич" написал:

Вообще таймеры работают очень странно. Никак не могу с ними разобраться.

2015-09-23_1845.png
93.99 кб

В случае, если одна из веток процесса доходит до завершения, то экземпляр процесса завершается... То есть выполнение второй ветки игнорируется (оно завершается).

Поставьте собирающее "И" для двух веток перед завершающим элементом.

Спасибо! Теперь всё работает.

Показать все комментарии
7.6
автозаполнение
текущий пользователь
Технические вопросы
7.x

Создал раздел через мастер разделов. В объекте раздела установил для справочного поля "Автор" значение по умолчанию - Текущий пользователь. При сохранении получаю ошибку - Конфликт инструкции INSERT с ограничением FOREIGN KEY "FKMUz8mt4GOdEmSGqDq6UKqFRng". Конфликт произошел в базе данных "ClientPortal_7.6.0_SO", таблица "dbo.Contact", column 'Id'.
Выполнение данной инструкции было прервано.
Если очистить поле - эффект тот же.
Если убрать значение по умолчанию - все сохраняется.

Нравится

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

Здравствуйте, Олег.

Правильно - не Текущий пользователь, а Контакт Текущего Пользователя.

Текущий пользователь ссылается на SysAdminUnit, в то время как колонка Автор - Contact.

Спасибо большое. И как я сразу не догадался...

Показать все комментарии
грид
реестр
Технические вопросы
7.x

Добрый день!
Подскажите пожалуйста как сделать редактируемый реестр детали не редактируемым по условию в родительской записи (к примеру деталь продуты в заказе, состояние заказа == выполнен) в версии BPM 7.6?
Заранее благодарен...

Нравится

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

Здравствуйте!

Редактируемый реестр довольно сильно отличается от обычного: это отдельный компонент системы, который хоть и является расширением Terrasoft.Grid, но многие его методы переопределены и работают совсем по-другому.

Поэтому самым простым решением в данном случае будет работать всегда с редактируемым реестром и управлять редактируемостью отдельных полей активной строки - блокировать их редактирование в зависимости от типа родительской записи (обратите внимание, что хотя визуально мы работаем в реестре, но вся логика осуществляется через карточку редактирования), либо изменять свойство "enabled" всего компонента DataGrid (при работе в режиме вертикального реестра необходимо обновлять деталь после каждого изменения активной строки родительского реестра).

Если подобные варианты не подходят, и задача заключается именно в динамической подмене контрола обычного реестра (Terrasoft.Grid) на редактируемый (Terrasoft.ConfigurationGrid), можно попробовать следующий вариант: добавить на деталь два разных реестра и в зависимости от условия изменять видимость этих реестров, чтобы видимым всегда оставался только один из них. Возможно, придётся переопределить некоторые из методов, которые выполняют действия над строками реестра. Должен предупредить, что примеров решения подобных задач у нас пока не было.

Добрый день, подскажите, пожалуйста, каким образом можно блокировать редактирование отдельных полей в редактируемом реестре?

Здравствуйте, Олег.

Это возможно сделать с помощью натсройки прав доступа [Администрируется по колонкам]

http://academy.terrasoft.ua/documents/docs/product/bpm'online%20sales/t…

Я имел ввиду блокировать их редактирование по условию, а не перманентно.

Блокирование отдельных ячеек записи в редактируемом реестре можно осуществить с помощью бизнес правил:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusines…

Показать все комментарии
Технические вопросы
7.x

Здравствуйте.
Столкнулся вот с такой необходимостью, добавить склад в раздел "Продукт в заказе", чтобы он так же отображался и в мобильном приложении.
В конфигурации, в папке "Custom" открыл объект "Продукт в заказе". В папку "İnherited Columns" добавил справочник "Склад". После настройки опубликовал объект. После добавления дополнительной колонки в списке продукта в заказе, поначалу отображался склад, но нужно было его добавлять в ручную.
Однако, после обновления самой страницы, продукты не отображались в заказе, а новый товар не добавлялся.
Подскажите пожалуйста, как настроить данную колонку без ущерба для системы, и чтобы склад, к которому привязан продукт отображался автоматически?
Благодарю за помощь.

Нравится

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

Здравствуйте!

Если у Вас продукт привязан к складу, то логичней было бы добавить изначально поле "Склад" в объект "Продукты".
Далее, вывести это поле на страницу редактирования "Продукта в заказе", как поле связанного объекта.

Как итог, Вы будете только один раз заполнять поле "Склад" (в разделе "Продукты"), а в разделе "Продукты в заказе" значение будет подтягиваться автоматически.

"Демьяник Алексей Олегович" написал:

Здравствуйте!

Если у Вас продукт привязан к складу, то логичней было бы добавить изначально поле "Склад" в объект "Продукты".

Далее, вывести это поле на страницу редактирования "Продукта в заказе", как поле связанного объекта.

Как итог, Вы будете только один раз заполнять поле "Склад" (в разделе "Продукты"), а в разделе "Продукты в заказе" значение будет подтягиваться автоматически.

Здравствуйте.
Создал справочник "Склад" в разделе "Продукты". Добавил новую колонку "Склад" в колонке. Привязал продукт к складу. Однако, при добавлении продукта в заказ, склад не отображается.

Дмитрий, попробуйте настроить колонки детали.

"Александр Зубков" написал:

Дмитрий, попробуйте настроить колонки детали.


Уже всё перепробовал. Не отображается автоматически и всё. Приходится вручную вводить склад в колонке продукта.
Может есть другой вариант?

Так же были добавлены новые детали цены и суммы. Как настроить деталь "Сумма", чтобы она изменялась в зависимости от кол-ва и цены продукта? Чтобы не нужно было прописывать сумму товаров вручную?

"Ануфриев Дмитрий Юрьевич" написал:

Уже всё перепробовал. Не отображается автоматически и всё. Приходится вручную вводить склад в колонке продукта.

Может есть другой вариант?

Еще раз повторюсь.
У Вас есть одно поле "Склад". Это поле находится в разделе "Продукты". И больше нигде.
У Вас есть деталь "Продукт в заказе". Для корректного вывода поля:
1) Перейдите в раздел "Заказы"
2) Перейдите к детали "Продукт в заказе".
3) Нажмите Вид -> Настроить колонки
4) Отобразится окно настройки колонок. Нажмите (+). Откроется окно выбора поля. Нажмите (+) возле названия объекта (в нашем случае это "Продукт в заказе"). Выберите объект "Продукты". В поле ниже введите "Склад" и выберите поле, которое предлагает система. Нажмите "Ок".

"Ануфриев Дмитрий Юрьевич" написал:

Так же были добавлены новые детали цены и суммы. Как настроить деталь "Сумма", чтобы она изменялась в зависимости от кол-ва и цены продукта? Чтобы не нужно было прописывать сумму товаров вручную?

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

"Демьяник Алексей Олегович" написал:
Ануфриев Дмитрий Юрьевич пишет:

Уже всё перепробовал. Не отображается автоматически и всё. Приходится вручную вводить склад в колонке продукта.

Может есть другой вариант?

Еще раз повторюсь.

У Вас есть одно поле "Склад". Это поле находится в разделе "Продукты". И больше нигде.

У Вас есть деталь "Продукт в заказе". Для корректного вывода поля:

1) Перейдите в раздел "Заказы"

2) Перейдите к детали "Продукт в заказе".

3) Нажмите Вид -> Настроить колонки

4) Отобразится окно настройки колонок. Нажмите (+). Откроется окно выбора поля. Нажмите (+) возле названия объекта (в нашем случае это "Продукт в заказе"). Выберите объект "Продукты". В поле ниже введите "Склад" и выберите поле, которое предлагает система. Нажмите "Ок".

Ануфриев Дмитрий Юрьевич пишет:

Так же были добавлены новые детали цены и суммы. Как настроить деталь "Сумма", чтобы она изменялась в зависимости от кол-ва и цены продукта? Чтобы не нужно было прописывать сумму товаров вручную?

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

Скорее всего мы друг-друга не поняли. Сама деталь "Склад" уже добавлена в раздел "Продукты в заказе". Нужный склад, на котором расположен товар, не отображается при добавлении продукта в заказ. В скрин-шотах же всё показано.

Я предложил один из возможных вариантов решения, а не пытался искать ошибки в Вашем решение.

"Демьяник Алексей Олегович" написал:

Я предложил один из возможных вариантов решения, а не пытался искать ошибки в Вашем решение.

Если есть ошибки, то почему бы и не указать на них? Тот вариант, который предложили вы и был использован. За что вам большое спасибо.
Однако, второй вопрос заключался, в том, что не идёт привязка склада товара в разделе "Заказы". Пока всё добавляют вручную.
Будем искать способ. Надеюсь на вашу помощь и дальше

"Ануфриев Дмитрий Юрьевич" написал:

Если есть ошибки, то почему бы и не указать на них? Тот вариант, который предложили вы и был использован. За что вам большое спасибо.

Однако, второй вопрос заключался, в том, что не идёт привязка склада товара в разделе "Заказы". Пока всё добавляют вручную.

Будем искать способ. Надеюсь на вашу помощь и дальше

Вы не то поле "Склад" отображаете.
Как вариант Вы можете использовать БП для реализации этой задачи:
1) Сигнал по событию добавления записи в объект "Продукты в заказе"
2) Чтение данных по объекту "Продукты в заказе" с фильтром Id = Стартовый сигнал.Уникальный идентификатор записи
3) Чтение данных по объекту "Продукты " с фильтром Id = Чтение данных "Продукты в заказе".Продукт
4) Изменение данных в объекте "Продукты в заказе" с фильтром Id = Стартовый сигнал.Уникальный идентификатор записи
Изменяем значение в поле "Склад" значением поля "Склад" с третьего чтения данных.
5) Конец процесса

"Демьяник Алексей Олегович" написал:
Ануфриев Дмитрий Юрьевич пишет:

Если есть ошибки, то почему бы и не указать на них? Тот вариант, который предложили вы и был использован. За что вам большое спасибо.

Однако, второй вопрос заключался, в том, что не идёт привязка склада товара в разделе "Заказы". Пока всё добавляют вручную.

Будем искать способ. Надеюсь на вашу помощь и дальше

Вы не то поле "Склад" отображаете.

Как вариант Вы можете использовать БП для реализации этой задачи:

1) Сигнал по событию добавления записи в объект "Продукты в заказе"

2) Чтение данных по объекту "Продукты в заказе" с фильтром Id = Стартовый сигнал.Уникальный идентификатор записи

3) Чтение данных по объекту "Продукты " с фильтром Id = Чтение данных "Продукты в заказе".Продукт

4) Изменение данных в объекте "Продукты в заказе" с фильтром Id = Стартовый сигнал.Уникальный идентификатор записи

Изменяем значение в поле "Склад" значением поля "Склад" с третьего чтения данных.

5) Конец процесса

Благодарю. Попробую данный вариант то же.

Показать все комментарии
7.5
расписание
фильтры
Технические вопросы
7.x

Здравствуйте!

Столкнулись с задачей, когда необходимо переделать базовую фильтрацию "FixedFilters" для расписания. Идея в том, чтобы вместо кнопок "Сегодня" и "Текущая неделя" сделать 4 кнопки, которые будут показывать определенные недели в году (например кнопка "1" будет показывать неделю, по которой была зарегистрирована 1ая запись для данного объекта). Подскажите, пожалуйста, как лучше всего будет организовать подобное?

Нравится

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

Никита, добрый день!

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

Как пример, можете посмотреть реализованный функционал (фиксированный фильтр по ответственному и фиксированный фильтр по периоду) в базовой версии и сделать по на подобии:

this.fixedFilterConfig = {
entitySchema: Activity,
filters: [
{
	  name: 'PeriodFilter',
	  caption: resources.localizableStrings.PeriodFilterCaption,
	  dataValueType: Terrasoft.DataValueType.DATE,
	  startDate: {
			   columnName: 'StartDate',
			   defValue: Terrasoft.startOfWeek(new Date())
	  },
	  dueDate: {
			   columnName: 'DueDate',
			   defValue: Terrasoft.endOfWeek(new Date())
	  }
},
{
	  name: 'Owner',
	  caption: resources.localizableStrings.OwnerFilterCaption,
	  columnName: 'Owner',
	  defValue: Terrasoft.SysValue.CURRENT_USER_CONTACT,
	  dataValueType: Terrasoft.DataValueType.LOOKUP,
	  filter: BaseFiltersGenerateModule.OwnerFilter,
	  appendFilter: function(filterInfo) {
			   var filter;
			   if (filterInfo.value && filterInfo.value.length > 0) {
						 filter = Terrasoft.createColumnInFilterWithParameters(
								  '[ActivityParticipant:Activity].Participant',
								  filterInfo.value);
			   }
			   return filter;
	  }
}
]
};

Дмитрий, спасибо за совет! Попробуем на основе этого что-то придумать.

Показать все комментарии
доступ
операция
Технические вопросы
7.x

Добрый день!
В BPM 7.6 есть такой раздел Доступ на операции.
Можно создать свою операцию, добавить группы, которые могут производить эти операции.
В зависимости от назначения операции пользователь, входящий в указанную группу, может производить те или иные действия.

Хотелось бы добавить свою операцию, и например, заблокировать какие-то поля в карточке в зависимости от того, есть у пользователя право на операцию или нет.

Скажите, пожалуйста, где можно посмотреть подобный пример реализации в конфигурации?

Нравится

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

Дарья, добрый день.

Выгрузите исходники согласно инструкции:

http://www.community.terrasoft.ru/blogs/8747

После чего выполните поиск по коду операции, например, используя поиск по содержимому в Total Commander.

Ссылка, которую вы дали - это же ветка форума 5.х, касающаяся отладки - причем здесь выгрузка исходников?
Я в принципе, уже увидела следующий пример

if (this.get("CanViewSysOperationAudit") != null) {
this.navigateToSysOperationAuditSection();
} else {
RightUtilities.checkCanExecuteOperation({
operation: "CanViewSysOperationAudit"
}, function(result) {
this.set("CanViewSysOperationAudit", result);
this.navigateToSysOperationAuditSection();
}, this);
}
}

Это пример использования операции - когда операция запрещает/разрешает использовать то или иное действие меню - в данном случае, это журнал аудита.
В основном, все операции в конфигурации используются для таких целей

Я бы хотела использовать операцию, чтобы в карточке делать недоступными для редактирования то или иное поле для тех групп пользователей.
Для того, чтобы делать активным поле в зависимости от каких-то условий надо использовать бизнес-правило.
Можно ли в качестве условия бизнес-правила использовать результат возвращения операции?

Предположила, что надо сделать виртуальный атрибут
"MyCanEditDateReact": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
value: null
},

создать метод для его заполнения
(т.е. аттрибут заполняется true,
если у пользователя есть право на операцию с кодом CanEditDateReact)
MethodCanEditDateReact: function() {

RightUtilities.checkCanExecuteOperation({
operation: "CanEditDateReact"
}, function(result) {
this.set("MyCanEditDateReact", result);

}, this);
}

вызвать метод этот в событии
onEntityInitialized: function() {
this.callParent(arguments);
this.MethodCanEditDateReact();
},

и уже в условиях бизнес-правила сравнивать заполняемый виртуальный аттрибут со значением true.
Но еще до прописывания самого бизнес-правила
наткнулась на ошибку в строке operation: "CanEditDateReact".

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

Здравствуйте!

Коллеги, в пакете Nui есть замечательная схема RightsHelper. Там много примеров по использованию прав на операции.

Добрый день!
Спасибо, все получилось.
Использовала функцию checkCanExecuteOperation из схемы RightUtilites

Реализация такова была:

вызвала функцию в методе
MethodCanEditDateReact: function() {

RightUtilities.checkCanExecuteOperation({
operation: "CanEditDateReact"
}, function(result) {
this.set("MyCanEditDateReact", result);
}, this);
}

данный метод вызван в событии
onEntityInitialized: function() {
this.callParent(arguments);
this.MethodCanEditDateReact();
}

На поле наложено бизнес-правило
( если у пользователя есть право на операцию, то данное поля enabled для него)
rules {
"SatisfactionLevel": {
"EnableLevel1": {
//debugger
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
property: BusinessRuleModule.enums.Property.ENABLED,
conditions: [{
leftExpression: {
type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
attribute: "CanEditDateReact"
},
comparisonType: Terrasoft.ComparisonType.EQUAL,
rightExpression: {
type: BusinessRuleModule.enums.ValueType.CONSTANT,
value: true
}
}]
}

}

}

Показать все комментарии