Доброго времени суток!

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

Спасибо.

Нравится

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

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

Где конкретно Вас интересует данная доработка? В справочном полем? 

Я правильно понимаю, что Вы хотите фильтровать записи по условию в справочной колонке?

Опишите, пожалуйста, бизнес-задачу более подробно.

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

Добрый час суток. Когда на секции задаются фильтры - то соответственно появляется запись в таблице SysProfileData и при переходах по разделам и т.д. после захода вновь на эту секцию фильтры остаются - всё ок. Нужно реализовать "сохранение" фильтров на детали,чтобы при переходах они соответственно не терялись,а сохранялись. Переопределил setFilter и переписал метод saveFilter для BaseGridDetailV2. Запись теперь появляется в SysProfileData(когда ставишь фильтры на детали,до этого не появлялась). И поле Key = Имеет структуру [Имя_страницы][Имя_детали]+"Filters". Как следствие - фильтры все так же не появляются. Правильно ли формируется для этого Key? или нужно другой шаблон/способ? Может не только 1 запись должа вставляться в таблицу а какая то вспомогательная?

Переписанное на BaseGridDetailV2 имеет вид:

methods: {

            setFilter: function(key, value, filtersValue) {

                var filters = this.get("DetailFilters");

                if (key) {

                    if (filters.find(key)) {

                        filters.remove(filters.get(key));

                    }

                    filters.add(key, value);

                    // 

                    this.saveFilter(key, filtersValue, value);

                    //

                } else if (value) {

                    value.each(function(filter) {

                        this.setFilter(filter.key, filter);

                    }, this);

                }

            },

            saveFilter: function(filterKey, filterValue, filter) {

                    if (!filterValue) {

                        return;

                    }

                    var sessionFilters = this.getSessionFilters();

                    var profileFilters = this.getProfileFilters();

                    var serializableFilter = this.getSerializableFilter(filter);

                    switch (filterKey) {

                        case "CustomFilters":

                            Terrasoft.each(filterValue, function(item) {

                                var f = item.filter = item.value || "";

                                var isSerializedFilter = (typeof f === "string" && f.indexOf("[") >= 0 && f.indexOf("]") >= 0 &&

                                    f.indexOf("{") >= 0 && f.indexOf("}") >= 0);

                                if (!isSerializedFilter) {

                                    item.filter = Terrasoft.encode(serializableFilter);

                                }

                            });

                            if (this.isNotEmpty(filterValue)) {

                                sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;

                            } else {

                                delete sessionFilters.CustomFilters;

                                delete profileFilters.CustomFilters;

                            }

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        case "FolderFilters":

                            sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        case "FixedFilters":

                            filterValue.filter = Terrasoft.encode(serializableFilter);

                            profileFilters[filterKey] = {Fixed: filterValue};

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        case "TagFilters":

                            serializableFilter.tags = filterValue;

                            profileFilters[filterKey] = [serializableFilter];

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        default:

                            sessionFilters[filterKey] = profileFilters[filterKey] = [

                                {

                                    filter: filter.serialize()

                                }

                            ];

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                    }

            },

            getSessionFilters: function() {

                var storage = Terrasoft.configuration.Storage.Filters = Terrasoft.configuration.Storage.Filters || {};

                var sessionFilters = storage[this.name] = storage[this.name] || {};

                return sessionFilters;

            },

            getProfileFilters: function() {

                    return this.get("ProfileFilters") || {};

            },

            getSerializableFilter: function(filter) {

                    filter.serializationInfo = {serializeFilterManagerInfo: true};

                    var serializableFilter = {};

                    filter.getSerializableObject(serializableFilter, filter.serializationInfo);

                    return serializableFilter;

            },

            getFiltersKey: function() {

                    var schemaName = this.name;

                    var cardName = this.values.CardPageName;

                    return cardName + schemaName + "Filters";

            }

        },

Нравится

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

как я понимаю фильтры должны подгружаться со Storage - вот весь код функционал перенес и метод loadProfileFilters в котором идет заргрузка со Storage

define("BaseGridDetailV2", ["BaseGridDetailV2Resources", "ConfigurationEnums", "RightUtilities","TagConstantsV2",

    "ProcessModuleUtilities", "GridUtilitiesV2", "WizardUtilities", "QuickFilterModuleV2", "ProcessEntryPointUtilities"

], function(resources, enums, RightUtilities, TagConstantsV2) {

    return {

        messages: {},

        mixins: {},

        attributes: {

            "ProfileFilters": {

                    dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT

            },

            "IsDetailFiltersLoaded": {

                    dataValueType: Terrasoft.DataValueType.BOOLEAN,

                    value: false

            },

            "DetailFilters": {

                    dataValueType: Terrasoft.DataValueType.COLLECTION

            }

        },

        methods: {

            subscribeSandboxEvents: function() {

                this.callParent(arguments);

                var editPages = this.getEditPages();

                editPages.each(function(editPage) {

                    var typeColumnValue = editPage.get("Tag");

                    var cardModuleId = this.getEditPageSandboxId(editPage);

                    this.sandbox.subscribe("getCardInfo", function() {

                        var detailInfo = this.getDetailInfo();

                        var cardInfo = {

                            valuePairs: detailInfo.defaultValues || []

                        };

                        var typeColumnName = this.get("TypeColumnName");

                        if (typeColumnName && typeColumnValue) {

                            cardInfo.typeColumnName = typeColumnName;

                            cardInfo.typeUId = typeColumnValue;

                        }

                        return cardInfo;

                    }, this, [cardModuleId]);

                }, this);

                this.sandbox.subscribe("CardSaved", this.onCardSaved, this, [this.sandbox.id]);

                this.subscribeGetModuleSchema();

                this.subscribeFiltersChanged();

                this.subscribeGetShortFilterFieldsVisible();

                this.sandbox.subscribe("GetRecordInfo", this.getRecordInfo, this,

                    [this.getRecordRightsSetupModuleId()]);

                this.sandbox.subscribe("GetExtendedFilterConfig", this.getExtendedFilterConfig, this,

                    [this.getQuickFilterModuleId()]);

            },

            init: function(callback, scope) {

                this.callParent([function() {

                    this.mixins.WizardUtilities.canUseWizard(function(result) {

                        this.set("IsDetailWizardAvailable", result);

                        callback.call(scope);

                    }, this);

                }, this]);

                this.registerMessages();

                this.initDetailFilterCollection();

                //

                //this.initDetailFiltersCollection();

                this.loadProfileFilters();

                //

                this.initFilterVisibility();

                this.isFilterAdded();

                var sandboxId = this.getQuickFilterModuleId();

                this.sandbox.subscribe("InitFilterFromStorage", function() {

                    this.sandbox.publish("LoadedFiltersFromStorage", null, [sandboxId]);

                }, this, [sandboxId]);

            },

            loadProfileFilters: function(callback, scope) {

                    var isDetailFiltersLoaded = this.get("IsDetailFiltersLoaded");

                    if (isDetailFiltersLoaded) {

                        Ext.callback(callback, scope);

                        return;

                    }

                    var profileKey = Ext.String.format("profile!{0}", this.getFiltersKey());

                    Terrasoft.require([profileKey], function(profile) {

                        this.onLoadProfileFilters(callback, scope, profile);

                    }, this);

            },

            onLoadProfileFilters: function(callback, scope, profile) {

                    this.loadFiltersContainersVisibility(profile);

                    this.initFilterAttributes(profile);

                    this.set("IsDetailFiltersLoaded", true);

                    Ext.callback(callback, scope);

            },

            loadFiltersContainersVisibility: function(profile) {

                    if (profile) {

                        if (Ext.isDefined(profile.isFoldersContainerExpanded)) {

                            this.set("IsFoldersVisible", profile.isFoldersContainerExpanded);

                        }

                        if (Ext.isDefined(profile.isExtendedFiltersContainerExpanded)) {

                            this.set("IsExtendedFiltersVisible", profile.isExtendedFiltersContainerExpanded);

                        }

                    }

            },

            initFilterAttributes: function(profile) {

                    var sessionFilters = this.getSessionFilters();

                    this.set("SessionFilters", sessionFilters);

                    var profileFilters = Terrasoft.deepClone(profile);

                    var fixedSessionFilters = this._getFixedSessionFilters();

                    Terrasoft.each(profileFilters, this.applyFilters, this);

                    Terrasoft.each(fixedSessionFilters, this.applyFilters, this);

                    this.set("ProfileFilters", profileFilters);

            },

            _getFixedSessionFilters: function() {

                    var sessionFilters = this.getSessionFilters();

                    var primaryDisplayColumn = this.entitySchema.primaryDisplayColumn;

                    var customFilters = sessionFilters.CustomFilters;

                    var customFiltersPrimaryDisplayColumn = customFilters && customFilters.primaryDisplayColumn;

                    if (customFiltersPrimaryDisplayColumn && primaryDisplayColumn) {

                        var sessionFiltersFixed = {};

                        sessionFiltersFixed.CustomFilters = {};

                        sessionFiltersFixed.CustomFilters[primaryDisplayColumn.name] = customFilters;

                        sessionFilters = sessionFiltersFixed;

                    }

                    return sessionFilters;

            },

            applyFilters: function(filterValue, key) {

                    if (key.match(/filters/i) && !this.isNotEmpty(filterValue)) {

                        return;

                    }

                    var detailFiltersValue = this.get("DetailFiltersValue");

                    if (!Ext.isString(filterValue)) {

                        detailFiltersValue.removeByKey(key);

                        this._chooseFilterProccesing(filterValue, key);

                    }

                    if (key !== "FixedFilters") {

                        detailFiltersValue.add(key, filterValue);

                    }

            },

            initDetailFiltersCollection : function(){

                    this.set("ProfileFilters", {});

                    this.set("DetailFilters", this.Ext.create("Terrasoft.FilterGroup"));

                    this.set("DetailFiltersValue", this.Ext.create("Terrasoft.Collection"));

            },

            _chooseFilterProccesing: function(filterValue, key) {

                    var detailFilters = this.get("DetailFilters");

                    Terrasoft.each(filterValue, function(item, propName) {

                        if (item.key === TagConstantsV2.TagFilterKey || key === TagConstantsV2.TagFilterKey) {

                            this.applyTagFilter(key, item);

                        }

                        if (propName === "Fixed") {

                            this._applyFixedFilter(key, item);

                        }

                        if (item.filter) {

                            var filter = Terrasoft.deserialize(item.filter);

                            if (!detailFilters.contains(key)) {

                                detailFilters.add(key, filter);

                            }

                        } else if (item.primaryDisplayColumn) {

                            this.applyPrimaryColumnFilter(key, item);

                        } else if (item.folderInfo || item.folderType) {

                            this.applyFolderFilter(key, item);

                        }

                    }, this);

            },

            //

            initFilterFromStorage: function() {

                    this.loadProfileFilters(function() {

                        this.sandbox.publish("LoadedFiltersFromStorage", null, this.getFilterModulesIds());

                    }, this);

            },

            initFilterVisibility: function() {

                this.set("IsDetailFilterVisible", true);

                this.set("IsFilterAdded", true);

            },

            setFilter: function(key, value, filtersValue) {

                var filters = this.get("DetailFilters");

                if (key) {

                    if (filters.find(key)) {

                        filters.remove(filters.get(key));

                    }

                    filters.add(key, value);

                    // 

                    this.saveFilter(key, filtersValue, value);

                    //

                } else if (value) {

                    value.each(function(filter) {

                        this.setFilter(filter.key, filter);

                    }, this);

                }

            },

            saveFilter: function(filterKey, filterValue, filter) {

                    if (!filterValue) {

                        return;

                    }

                    var sessionFilters = this.getSessionFilters();

                    var profileFilters = this.getProfileFilters();

                    var serializableFilter = this.getSerializableFilter(filter);

                    switch (filterKey) {

                        case "CustomFilters":

                            Terrasoft.each(filterValue, function(item) {

                                var f = item.filter = item.value || "";

                                var isSerializedFilter = (typeof f === "string" && f.indexOf("[") >= 0 && f.indexOf("]") >= 0 &&

                                    f.indexOf("{") >= 0 && f.indexOf("}") >= 0);

                                if (!isSerializedFilter) {

                                    item.filter = Terrasoft.encode(serializableFilter);

                                }

                            });

                            if (this.isNotEmpty(filterValue)) {

                                sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;

                            } else {

                                delete sessionFilters.CustomFilters;

                                delete profileFilters.CustomFilters;

                            }

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        case "FolderFilters":

                            sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        case "FixedFilters":

                            filterValue.filter = Terrasoft.encode(serializableFilter);

                            profileFilters[filterKey] = {Fixed: filterValue};

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        case "TagFilters":

                            serializableFilter.tags = filterValue;

                            profileFilters[filterKey] = [serializableFilter];

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                            this.set("ProfileFilters", profileFilters);

                            break;

                        default:

                            sessionFilters[filterKey] = profileFilters[filterKey] = [

                                {

                                    filter: filter.serialize()

                                }

                            ];

                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);

                    }

            },

            getSessionFilters: function() {

                var storage = Terrasoft.configuration.Storage.Filters = Terrasoft.configuration.Storage.Filters || {};

                var sessionFilters = storage[this.name] = storage[this.name] || {};

                return sessionFilters;

            },

            getProfileFilters: function() {

                    return this.get("ProfileFilters") || {};

            },

            getSerializableFilter: function(filter) {

                    filter.serializationInfo = {serializeFilterManagerInfo: true};

                    var serializableFilter = {};

                    filter.getSerializableObject(serializableFilter, filter.serializationInfo);

                    return serializableFilter;

            },

            getFiltersKey: function() {

                    var cardName = this.values.CardPageName;

                    var schemaName = this.name;

                    return cardName + schemaName + "Filters";

            }

        },

        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/

    };

});

 

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

Главное чтобы вы брали фильтр по тому ключу, который сформировали.

При отладке фильтр возвращается? Где именно ошибка возникает?

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

Добрый день! Коллеги, помоги с решением проблемы. 



Есть функционал работы со счетами (правда от базового там мало что осталось).

При формировании счета можно выбрать продукты. У продукта есть Название и Артикул, при этом по Названию можно искать (lookup), а по Артикулу нет (текстовое поле).



Хочу, что бы поиск о​​​​​​можно было осуществлять не только по Названию, но и по Артикулу. Что для этого нужно сделать? 



 

Изображение удалено.

 

Нравится

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

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

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

Также передал данное обращение разработчикам поддержки для дальнейшего анализа и предоставления решения.

Denys Diachenko,

Спасибо! 



Правильно ли я понимаю, что в логике BPM у сущности не может быть две колонки с типом lookup? Или тут сложность в чем-то другом? 

Andrey Aleksandrov пишет:

Или тут сложность в чем-то другом

По-умолчанию поиск работает по "главной" колонке, которая указывается в объекте.

Если вам надо переделать поиск по конкретно в том элементе, который у вас на скриншоте - то в принципе это сделать легко (откопать getLookupQuery, да и изменить фильтрацию)

Варфоломеев Данила,

мне нужно реализовать поиск по двум колонкам - Название и Артикул.

Если искали по названию, то автоматически заполняется артикул и наоборот

Andrey Aleksandrov пишет:

мне нужно реализовать поиск по двум колонкам - Название и Артикул.

Ох уж эти неявные описания задач...

Перефразирую (поправьте, если что не так): У вас есть деталь. На делали 2 поля: 1-lookup, ссылка на продукт, 2 - Артикул, текстовое. Задача: из текстового поля "артикул" сделать справочное (со ссылкой на продукты, но фильтрация по артикулу), и сделать заполняемость полей (артикул - продукт).

Если всё так, то вот решения:

1) Дабы не дублировать одно и то же поле, убрать поле артикул, перегрузить функцию getLookupQuery, настроить там фильтр по 2 полям.

2) Если всё-таки нужно видеть поле, то тип поля "артикул" меняем на справочник со ссылкой на продукт. Опять же перегружаем getLookupQuery, настраиваем нужную фильтрацию и список выдаваемых значений. Плюс потом надо событийные функции (через attributes) доделать, чтобы поля заполнялись по зависимостям. Или через бизнес правила.

3) Если надо оставить "артикул" в текстовом виде - то придётся дописывать подгружаемый list для элемента и кучу других обработчиков. Где-то в конфигурации уже есть SearchableTextEdit... Вообщем, лучше не стоит.

Ну и во всех вариантах придётся писать гору кода и логики. 

Варфоломеев Данила пишет:

Ох уж эти неявные описания задач...

:-) давайте со стороны пользователя пойдем.



Я, как пользователь системы,  должен сформировать счет (или заказ поставщику) добавив туда определенный перечень товаров. Бывает, что названия товаров отличаются в одну букву\цифру:

Сервер HP HPE DL20 Gen9 E3-1240v6 SFF 900WPerf Svr

Сервер HP HPE DL20 Gen9 ES3-1240v6 SFF 900WPerf Svr



В этом случае мне удобнее оперировать понятием Артикул товара. Но для многих товаров все же удобнее поиск по названию так что необходимо добавить возможность поиска по Артикулу из детали, а так же оставить возможность поиска по Названию.



Но в целом вы все и так правильно поняли. 



 

Варфоломеев Данила пишет:

Ну и во всех вариантах придётся писать гору кода и логики. 

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

Andrey Aleksandrov пишет:

в чем проблема искать по двум разным столбцам?

 ¯\_(ツ)_/¯

Я так понимаю официально это можно охарактеризовать как: "Возможность не была запланирована изначально, поэтому программно не реализована".

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



То есть, вводим телефон, а система нам отфильтровывает список контактов с такими номерами



Потому и поиск продукта по двум полям можно сделать

Владимир Соколов, вот и я в это верю :-)

Andrey Aleksandrov,

Данила правильно ответил. Нужно переопределить метод "getLookupQuery" в странице редактирования детали. Базовый метод находится в "BasePageV2", так что можно отладится и посмотреть как все работает.

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

Здравствуйте! Такой вопрос, могу ли я в серверном коде (с помощью C#) прочитать вьюху, через dblink Oracle? Используя например класс Select для запросов. Если да, то как ?

Спасибо.

Нравится

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

С точки зрения системы с view работают так же, как с таблицами. То есть Вы в базе сайта bpm'online пишете view с нужной логикой выборки данных с другого сервера, затем в конфигурации заводите схему с таким же названием, колонками и поставленной  в свойствах галочкой «Представление в базе данных». В этом случае за наличием view в базе и её структурой нужно следить самостоятельно.

А далее работаете с этой схемой как обычно, хоть из Select, хоть из EntitySchemaQuery.

Зверев Александр,

А если необходима запись в таблицу по дблинку, можно кончено делать процедуру с таким запросом и вызывать её, но в данной ситуации придётся переносить часть логики на plsql, но нельзя ли через дблинк подключиться?

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

На view тоже вполне могут быть II, IU и ID-триггеры, которые реализуют запись куда надо. В таком случае запись в эту view будет работать так же, как в таблицу.

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

Добрый день!

имеем такую диаграмму. Есть ли возможность выгружать диаграммы из Итогов в Excel  в виде таблиц? Например

Качество обслуживания 52

Качество электроэнергии 53

...

Изображение удалено.

Нравится

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

Любовь, добрый день!

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

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

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

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

Выполняем нумерацию собственного объекта (сметы).

Создали настройку, в которой хранится маска номера и текущий номер последнего созданного объекта (последний номер нужен еще для других целей).

Объект создается из другого через бизнес-процесс и при его создании необходимо не просто считать  настройку (текущий номер объекта), но и добавить к значению системной настройке единицу.

Подскажите пжлст можно ли это сделать через БП... городить код не хочется).

ЗАранее спасибо!)

Нравится

8 комментариев
Лучший ответ

Из кода изменить настройку можно так, если дело касается общих настроек или значений по умолчанию:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "SettingName", value);

Для текущего пользователя устанавливается так:

Terrasoft.Core.Configuration.SysSettings.SetValue(userConnection, "SettingName", value);

Для конкретного пользователя или группы:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, sysAdminUnitId, "SettingName", value);

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

Добрый день!



Можно считать настройку с текущим номером, дальше через элемент "формула" получить этот номер и добавить к нему 1. А дальше номер можно передавать в элементы добавить данные или изменить данные, в зависимости от ситуации. 

Евгений Манько,

Евгений,  а каким элементом процесса записать полученный рассчитаный номер обратно в системную настройку?  Через "изменить объект"? или есть более простой способ?). Спасибо!

Есть готовый элемент GenerateSequenseNumberUserTask, предназначенный именно для этого. Вот разные примеры нумерации.

Зверев Александр,

Александр, спасибо! Да, это элемент для нумерации.  Нам нужно не просто пронумеровать объект, а этот получившийся через формулу номер, записать в системную настройку.номевернуть 

Из кода изменить настройку можно так, если дело касается общих настроек или значений по умолчанию:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "SettingName", value);

Для текущего пользователя устанавливается так:

Terrasoft.Core.Configuration.SysSettings.SetValue(userConnection, "SettingName", value);

Для конкретного пользователя или группы:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, sysAdminUnitId, "SettingName", value);

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

Бершеда Д. Н. Спасибо!!!)

Бершеда Д. Н.,

Не получается настроить элемент процесса скрипттаск так, чтоб сохранить значение параметра процесса в системную настройку (общую, не персональную).

 

Попытался вот так:

var userConnection = context.UserConnection;

String IDToken = Get<String>("IDToken"); 

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "System ID Token", IDToken);

return true;

 

Никакой ошибки не дает, компилируется, но при выполнении процесса этот скрипттаск не отрабатывает - процесс на нем и останавливается.

 

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

 

Версия платформы - текущая. Пробую на триальном 14-дневном сайте.

Добрый день.

Скорее всего вы передаете неправильный код системной настройки.

Пример рабочего скрипт-таска:

string settingCode = "SystemIdToken"; // код системной настройки
string settingValue = "Test2"; // новое значение
Terrasoft.Core.Configuration.SysSettings.SetDefValue(UserConnection, settingCode, settingValue);
return true;

Результат:

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

Добрый день коллеги.

Возникла необходимость доработать функционал ProcessDashboardSchema.

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

Публикую сообщение GetHistoryState  в ответ получаю true (булево значение, а не объект)

Выяснилось, что в ProcessDashboardModule это сообщение определено как широковещательное, а не адресное.

Заместил модуль. Поменял тип сообщения на Адресное. GetHistoryState  вернул корректную структуру  historyState.

Не могу найти подписчика на  Широковешательного сообщения GetHistoryState (На это сообщение вообще всего 1 подписчик в NavigationModule.init) 



Является ли это багом?

И если является, то есть ряд вопросов/предложений:

1. Когда этот баг будет исправлен? (на текущей версии он ещё есть)

2. Когда будет рассмотрен вопрос о вознаграждении участников community за отлов таких багов?

3. Предлагаю добавить на community ещё один тип сообщения "Ошибка базовой функциональности" 

Нравится

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

Добрый день.

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

Так же передали пожелания по пунктам 2-3

Коллеги, до сих пор ошибка не устранена.

Зато в ProcessDashboardModule были добавлены стили, из-за чего поплыла вся разметка в панели "Задачи по бизнес-процессам"

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

Мотков Илья,

Илья, в тексте обращения описан конкретный баг. Когда его исправят?

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

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

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

На академии нашел статью:

 Если для шага процесса, предусматривающего действия пользователя, включено выполнение в фоновом режиме, то такой шаг не начнет выполняться, пока пользователь не кликнет на соответствующую задачу на вкладке [Задачи по бизнес-процессам] коммуникационной панели. При этом все шаги процесса — действия системы будут выполняться в фоновом режиме без отображения маски загрузки.

Если для шага процесса, предусматривающего участие пользователя, не включено выполнение в фоновом режиме, то в момент перехода к такому шагу пользователю будет открываться страница этого шага, прерывая любые действия, которые в этот момент выполнял пользователь в bpm’online.

 

В моем случае выполнение в фоновом режиме выключено, но страница все равно не открывается, появляется уведомление в коммуникационной панели.

Нравится

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

Добрый день!



Интерактивные элементы (Выполнить задачу/Вопрос пользователю/Открыть страницу редактирования…) автоматически открывают страницу редактирования если:

- текущий пользователь является инициатором процесса

- текущий пользователь указан ответственным по выполнению интерактивного элемента

- пользователь находится в контексте текущего процесса. (Т.е. если пользователь работая по одному процессу параллельно запускает второй процесс – интерактивные элементы по второму БП автоматически не откроют страницу)

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

Есть кейс - при создании активности с категорией "встреча" кроме ответственного эта встреча должна отобразиться в расписании у сотрудников, которые добавлены в "Участники". 

Фильтр типа "показать активности с категорией Встреча если там есть участник - текущий пользователь" не работает. 

Приходится создавать 2 встречи на каждого из участвующих во встрече. 

Нравится

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

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

Проверили данный кейс на версии 7.12.1. Создали активность с категорией встреча и несколькими участниками. Построили расширенный фильтр "показать активности с категорией Встреча если там есть участник - текущий пользователь". Созданная активность отобразилась. 

Рекомендуем Вам обратиться в службу технической поддержки по адресу support@terrasoft.ru для детального анализа.

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

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

Вопрос: насколько проблематично допилить такой функционал? 

Нравится

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