Добрый день!

У меня стоит задача обработки событий изменения некоторых реквизитов (Категория, Сервисный договор, Сервис) сущности Case (Обращения). Я могу в  событийном процессе обрабатывать события "Перед сохранением записи", "После сохранения записи", но я не совсем понимаю, как реализовать реакцию именно на изменение некоторых реквизитов. Т.е. если произошла запись, но перечисленные выше реквизиты не изменились, то ничего делать не нужно. Логика подсказывает, что нужно иметь "снимок" объекта до сохранения и сравнить его с значениями после. Как же это сделать? Заранее спасибо за помощь.

Нравится

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

На событие CaseSaving получаете в параметр старое значение поля:

 

AccountOldId = Entity.GetTypedOldColumnValue<Guid>("AccountId");
return true;

 

На событие CasеSaved уже можно сравнивать полученный параметр с новым значением

 

var NameEntity = new Entity(Entity);
if (NameEntity.FetchFromDB(Entity.PrimaryColumnValue)) {
	Guid accountId = NameEntity.GetTypedColumnValue<Guid>("AccountId");
 
	if ((AccountOldId != accountId)  { 
               ....
    }
 
}
return true;

 

Смотрите в сторону объекта Case пакета Case. на событие CaseSaving. Так же есть метод в процессе IsStatusChanged. 

 

Еще очень поможет методы событийного процесса объекта Case пакета SLM. Событие так же CaseSaving. Метод GetIsNeedToLogLifecycle() и GetLoggingColumns(). В последнем определяется на какие колонки пишется жизненный цикл обработки обращения. По аналогии я сделал свой журнал обработки обращения со своими колонками.

На событие CaseSaving получаете в параметр старое значение поля:

 

AccountOldId = Entity.GetTypedOldColumnValue<Guid>("AccountId");
return true;

 

На событие CasеSaved уже можно сравнивать полученный параметр с новым значением

 

var NameEntity = new Entity(Entity);
if (NameEntity.FetchFromDB(Entity.PrimaryColumnValue)) {
	Guid accountId = NameEntity.GetTypedColumnValue<Guid>("AccountId");
 
	if ((AccountOldId != accountId)  { 
               ....
    }
 
}
return true;

 

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

 Большое спасибо за Ваш ответ. Буду разбираться.

Алексей Следь,

 Большое спасибо за Ваш ответ. Буду разбираться.

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

Добрый день!

Периодически возникают задачи для реализации их в системе.

Ищу людей, заинтересованных в сдельной работе.

Важен опыт внедрения и разработки. Объем программирования небольшой. Основной объем задач - разработка / доработка форм, кейсов, процессов.

Нравится

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

Добрый день!

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

Нравится

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

Добрый день!

У нас это реализовано следующим образом:

Забираем у всех права на просмотр лидов. Если необходимо чтобы какая то роль или оргединица имела права на просмотр/редактирование/удаление лидов настраиваем штатно. Создали 2 бизнес-процесса, первый срабатывает при создании лида, второй при смене ответственного в лиде. В этих БП регулируются права на лид.

Добрый день!

У нас это реализовано следующим образом:

Забираем у всех права на просмотр лидов. Если необходимо чтобы какая то роль или оргединица имела права на просмотр/редактирование/удаление лидов настраиваем штатно. Создали 2 бизнес-процесса, первый срабатывает при создании лида, второй при смене ответственного в лиде. В этих БП регулируются права на лид.

К тому же, надо помнить, что не только ответственные должны видеть все лиды, но и, например, ещё отдел маркетинга.



В Operation permissions создаём операцию CanReadLead и добавляем в неё роли. Затем в том же БП выдаём этим ролям права на чтение лидов.



И не забываем про права на редактирование.

А почему бы не использовать стандартную функциональность прав по умолчанию? Если для этого объекта в разделе настройки прав в соответствующей детали убрать всё, то на новые записи будет получать права только автор и ответственный, как Вы и хотите. Плюс можно добавить видимость их начальству.

gif_section_object_permissions_select_groups.gif

Зверев Александр пишет:

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

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

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

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

Добрый день!

 

Я удаляю письмо (Активность типа Email) из стандартного БП, созданного в дизайнере бизнес процессов. 

 

Есть ли возможность из БП обновить коммуникационную панель? Сейчас письмо из неё пропадает только после обновления страницы. 

Нравится

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

Да. Сам так делаю примерно таким методом в схеме CommunicationPanelEmailSchema, а из БП шлю сообщение соответствующее:

onMyBpFinish: function(scope, message) {
    if (!message || message.Header.Sender !== "UpdateEmailHistory") {
        return;
    }
    var ID = message.Body;
    var collection = this.get("EmailCollection");
    var foundItem = collection.collection.items.find(item => item.id === ID);
    foundItem.set("IsNeedReload", false);
    this.reloadEmailsData([ID]);
    collection.remove(foundItem);
}

Скрипт в конце БП: 

var userConnection = Get<UserConnection>("UserConnection");
var EmailID = Get<string>("EmID");
EmailID.ToString();
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection,"UpdateEmailHistory", EmailID);
return true;

Возможно, можно как-то красивее и изящней, но вроде этот метод работает и наша ТП довольна результатом

Да. Сам так делаю примерно таким методом в схеме CommunicationPanelEmailSchema, а из БП шлю сообщение соответствующее:

onMyBpFinish: function(scope, message) {
    if (!message || message.Header.Sender !== "UpdateEmailHistory") {
        return;
    }
    var ID = message.Body;
    var collection = this.get("EmailCollection");
    var foundItem = collection.collection.items.find(item => item.id === ID);
    foundItem.set("IsNeedReload", false);
    this.reloadEmailsData([ID]);
    collection.remove(foundItem);
}

Скрипт в конце БП: 

var userConnection = Get<UserConnection>("UserConnection");
var EmailID = Get<string>("EmID");
EmailID.ToString();
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection,"UpdateEmailHistory", EmailID);
return true;

Возможно, можно как-то красивее и изящней, но вроде этот метод работает и наша ТП довольна результатом

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

Добрый день!



Есть необходимость упростить работу пользователей с подчиненной деталью.

Слева расположить главную деталь (например, со списком контактов), а справа от неё деталь с документами выделенного контакта.

И переходя по записям левой детали (контактов) оперативно отображать содержание правой детали (документов) с возможностью присоединить новый документ.



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



Спасибо

Нравится

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

Доброе утро.

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

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

Доброе утро.

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

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

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

Идея возможности создавать базовыми средствами мастер-деталь уже зафиксирована.

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

Настроено бизнес-правило, которое включает в себя фильтрацию и заполнение связанного поля Изображение удалено.

При этом для фильтруемого поля установлено значение по умолчанию.



В итоге, если выбирать в поле Owner значение вручную, то связанное поле заполняется.

Однако, при создании записи связанное поле остаётся незаполненным.

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

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

Каким образом можно "спровоцировать" бизнес-правило выполниться (речь идёт не о Current user account, а про общий случай)?

 

Нравится

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

Владимир, бизнес-правила отрабатывают при изменении полей пользователем, для других случаев могут быть применены другие механизмы. Например, значения по умолчанию в объекте, там есть и контрагент текущего пользователя:

Или, если сохранение происходит до открытия карточки, а логика получения значения более сложная, можно вычислять её на уровне встроенных или отдельных БП.

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



Но мне кажется логичным, чтобы БП срабатывало бы вне зависимости от того, кто заполнил поле - пользователь или система во время открытия страницы при создании новой записи

В 7.17.1 должны такое добавить.

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

Добрый день!

Пытаюсь сделать по инструкции https://community.terrasoft.ua/articles/kak-skryt-knopku-zapustit-process. но кнопка остается.

Что забыл сделать, подскажите, пожалуйста?

 

define("BootstrapModulesV2", ["LeftPanelTopMenuModuleV2"], function() {

    return {

        methods: {},

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

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

    };

});

 

 

 

Прикрепленные файлы

Нравится

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

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

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

Учтите один нюанс, начиная с версии 7.17.0 если ТЭГ будет не заполнен то процесс в "Библиотеке процессов" виден не будет, и Вы не сможете им управлять - сменить версию можно будет только перейдя в процесс из цепочки и проставить "Сделать актуальной версией", а вот выключить уже не как не выйдет. Потому ТЭГ убирайте только у тех процессов что используете как подпроцессы (так как при его вызове, даже если он отключен он все равно включится), в других случаях можно к примеру в ТЭГ писать имя процесса.

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

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

 

 

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

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

Учтите один нюанс, начиная с версии 7.17.0 если ТЭГ будет не заполнен то процесс в "Библиотеке процессов" виден не будет, и Вы не сможете им управлять - сменить версию можно будет только перейдя в процесс из цепочки и проставить "Сделать актуальной версией", а вот выключить уже не как не выйдет. Потому ТЭГ убирайте только у тех процессов что используете как подпроцессы (так как при его вызове, даже если он отключен он все равно включится), в других случаях можно к примеру в ТЭГ писать имя процесса.

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

Александр Тыра пишет:

Учтите один нюанс, начиная с версии 7.17.0 если ТЭГ будет не заполнен то процесс в "Библиотеке процессов" виден не будет

А почему бы разработчикам не придумать второй тэг "Hidden Business Process"?

Александр Тыра пишет:

Убрать кнопки можно, я уже делал это

 Александр, можете свой вариант скинуть убирания кнопки? Вариант с неотображением процессов не очень нравится заказчику. Кроме того, манипуляции с изменением/удалением тега не убирают из списка процесс, к сожалению.

Создайте модуль без наследников, в нем:

 

define("KtLeftPanelTopMenuModule", ["LeftPanelTopMenuModule"],

    function() {

        Ext.define("Terrasoft.configuration.KtLeftPanelTopMenuModuleViewModel", {

            alternateClassName: "Terrasoft.KtLeftPanelTopMenuModuleViewModel",

            override: "Terrasoft.LeftPanelTopMenuModuleViewModel",

            getTopMenuConfig: function() {

                var esq = this.callParent(arguments);

                var index = esq.map(function(e) { return e.id; }).indexOf("menu-startprocess-button");

                if (index > -1) {

                    esq.splice(index, 1);

                }

                return esq;

            }

        });

    }

);

 

Это уберет кнопку круглую. Думаю по аналогии можно убрать и кнопку с надписью "Запустить процесс", а вот как команду выпилить не подскажу, даже не смотрел

При этом необходимо замещать BootstrapModulesV2?

 

define("BootstrapModulesV2", ["KtLeftPanelTopMenuModule"], function() {

    return {

        methods: {},

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

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

    };

});

Павлов Антон,

 Нет, не надо

Спасибо за ваши ответы

Но пока не получается реализовать на своей стороне...

Проведите отладку, отрабатывает ли у Вас вообще изменённая логика.

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

Какие формулы скрыты за "Не заполнено"

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

Нравится

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

Есть необходимость перенести данные справочника Tax , включая id,на препрод

Я спросил как это правильно сделать, и мне посоветовали создать замещающий объект, но при попытке публикации пишет , что Элемент с именем "Tax" не найден

Для исправления ошибки, пробовал советы из этой темы  https://community.terrasoft.ru/questions/oshibka-sokhraneniya-element-n…

А именно генерацию исходных кодов, просто вылетает страница с ошибкой

А при компиляции всего, вылетает Элемент с именем "Tax" не найден

Нравится

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

Не совсем понял, что Вы собирались сделать: перенести записи в справочнике или его схему?

Если первое, то нужно, чтобы на базе, куда переностите, уже была такая схема и создавшаяся по ней после публикации таблица в БД. Или же схема создавалась или дополнялась в том же пакете, что и данные в неё. А наполнение справочника затем переносить при помощи привязки данных к пакету.

Если второе, то нужно не создавать объект или замещающий объект вручную, а переносить с сайта-источника готовую схему (или путём выгрузки в md-файл, или через SVN, или пакетами).

Объект Tax — стандартный, у Вас в нём есть какие-то доработки?

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

Всем привет!

 

Есть БП довольно простой. Изображение удалено.

До таймера все работает как положено, а после таймера ничего не происходит.

Без таймера все работает отлично, но он тут очень необходим.

Нравится

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

Михаил, причины могут быть различными.

Например,  если есть большое количество процессов, которые используют таймер (и, следовательно, планировщик), то может быть, сейчас очередь планировщика перегружена, что и могло вызвать проблемы с зависанием процессов. В таком случае нужно увеличить threadCount во внешнем Web.config с 5, например, до 10. Стандартно там:

<add key="quartz.threadPool.threadCount" value="5" />

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

Михаил, подскажите, пожалуйста, удалось ли решить проблему.

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

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