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

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

Реальный, частый кейс:

Пользователю открывается задача по БП с текстом: "Оформите счет и договор по заказу", в системе есть 2 стандартных бп, которые это делают, но, когда пользователь прямо из задачи по ссылке переходит к заказу и через действия пытается это сделать, ничего не происходит (он так думает), но на самом деле процессы то запускаются, просто в фоне...

Очень хотелось бы иметь возможность в конструкторе бп установить признак для процесса "Запускать поверх других процессов". В данном случае у пользователя запускался процесс создание счета и договора.

Нравится

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

А если и у второго процесса галка стоит, что делать? Ещё одну настройку добавлять, «Запускать поверх вообще всех процессов»?

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

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

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

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

П.С. Я не говорю про вариант подвязывания скрипта для кнопки создания продажи или счета.

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

Вы, наверно, меня не понимаете. Даже если это мелкий подпроцесс с 1 задачей, он все равно не позволит запустить процесс сверху.Думаю, Вы с таким не сталкивались, а у нас это не каждый второй процесс, каждый первый. Нам приходит каждый раз делать кодом действия из кнопки. Просто нужно возможность в бп поставить галочку, запустить поверх текущего :))) Просто чтобы запустился сверху если его запускают при открытом другом бп

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

Уважаемый Александр!

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

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

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

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

А то, что вы говорите вообще никак не решает ситуацию, ведь эти страницы и есть часть бп, которые никогда не всплывет, пока активен другой бп.

Добрый день, Д. В таком случае попробуйте прямо в этом БП сделать не 2 блока, а 6, при этом вторые 2 будут связаны с заказом, а третьи 2 — со счётом. Если пользователь будет идти по процессу, ему не нужно будет ни вручную создавать счёт, ни нажимать дополнительные кнопки в карточках, а карточка нового счёта  с уже заполненными полями связи с продажей и заказом автоматически появится при сохранении заказа в соответствии с логикой процесса. Дополнительную информацию пользователю, что от него хочет в этот момент система, можно показывать как раз в автогенерируемых страницах.

Коллеги, если есть возможность создать такой признак (стартовать бп поверх запущенного), это будет супер.

Спасибо.

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

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

Коллеги, простенький вопрос :)

задача: автоматически создать контакт по входящему email.

Создала БП. Сигнал=входящий email, читаем данные из Активности, тип Email

Необходимо получить отдельно email и отдельно ФИО отправителя.

К сожалению, вижу только одно поле [От кого], которое объединяет данные - SenderEnum

Пример: Сергей Петрович Петров ; 

Подскажите, как прочитать отдельно ФИО и отдельно email ?

Пыталась читать объект [Email] - данные не вычитываются. Спасибо.

Нравится

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

Милова Марина Федоровна,

Действитель, забыл using)

должно быть так:

Можно попробовать в скрипт-таске обработать результат:

var senderEnum = @"TEST TESTER <test@test.ru>";
var mail = Regex.Match(senderEnum, "<.*>").Captures[0].Value.Replace("<", "").Replace(">", "");
var user = Regex.Match(senderEnum, "^.*?<").Captures[0].Value;
user = user.Substring(0, user.Length - 2);

 

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

Спасибо. К сожалению, не являюсь разработчиком. В каком элементе БП добавить скрипт-таск? [Добавить данные]?

В смысле «в элементе добавить скрипт-таск»? Скрипт сам по себе является элементом. Читаете из одного параметра, пишете в другой и третий. Как в коде работать с параметрами, описано тут.

А ещё можно попробовать эту логику вставить в элемент-формулу. Отдельно формулы для имени и для адреса.

Милова Марина Федоровна,

Ок. Упростим задачу.

1) Создайте 3 переменные в БП (строки). В SenderEnum с помощью Формулы передавайте значение поля (которое считываете из активности/письма)

2) Добавьте задание-сценарий (script-task)

3) Вставьте туда код (копипаста).

var senderEnum = Get<string>("SenderEnum");
var mail = Regex.Match(senderEnum, "<.*>").Captures[0].Value.Replace("<", "").Replace(">", "");
var user = Regex.Match(senderEnum, "^.*?<").Captures[0].Value;
user = user.Substring(0, user.Length - 2);
 
Set("User", user);
Set("Email", mail);
return true;

Выглядеть в итоге должно так:

Всё. После выполнения сценария в параметре User будет лежать текст с фио пользователя, в Email - почта.

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

И все свалится если не добавлять using в БП, а как это сделать и не все программисты найдут :)

Коллеги, уже писала, что не программист. У меня сейчас вот такой процесс

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

Вставила задание-сценарий. Идет публикация

Григорий, жду, чем закончится 

Ну вроде не всё так страшно

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

По совету Григория добавьте в Usings значение «System.Text.RegularExpressions». Usings находится на вкладке «МЕТОДЫ» свойств процесса.

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

Пространство имен?

 

Публикую

Марина, а зачем Вы написали в Usings свою фамилию?

Поле обязательное для заполнения. Не знала что написать. Могу изменить :)))

Милова Марина Федоровна,

Действитель, забыл using)

должно быть так:

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

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

Коллеги всем доброго времени суток. Нужна Ваша помощь.

В БП есть элемент Web-сервис в  котором есть массив - http://prntscr.com/kyim63.

Данный массив объектов состоит из двух полей Number и Description - http://prntscr.com/kyimnk

Данные поля необходимо заполнять по следующему правилу из двух выборок - http://prntscr.com/kyin8y

Правила заполнения реализовал следующим образом через тернальные выражения в формуле поля - http://prntscr.com/kyio17http://prntscr.com/kyioa3

Но при отработке элемента Web-сервис видим что массив Communications пустой - http://prntscr.com/kyip7z

Если же посмотреть на данные трассировки двух элементов из которых должна осуществляться выборка видим:

Идем в "Читать Контакты СТО в платформе" - http://prntscr.com/kyiq70 здесь по нулям следовательно логике должно брать значение из другого элемента, идем в "Читать Основной контакт Контрагента" - http://prntscr.com/kyir2v, здесь данные есть, вопрос почему не заполнились в веб-сервисе?

Заранее благодарю за ответ.

Нравится

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

Нужно ещё больше ссылок на prntscr.com.angry

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

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

Добрый день!

В процессе выполнения этой задачи выяснил, что в документации по Terrasoft.controls.Grid отсутствуют упоминания о нескольких методах этого элемента управления, например onKeyDown, goToPreviousRow, gotToNextRow (именно так, с "ошибкой") и несколько других.

Как теперь с этим знанием существовать? :)

Нравится

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

"Как теперь с этим знанием существовать? :)" — я с этим вопросом существую с 2016 года. Пришел в конфигурацию 7.6-7.7, знатно прифигел от количества параметров в diff-конфигах некоторых элементов, пошел на sdk, увидел шиш с маслом.

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

Сколько ещё открытий чудных ждет Вас впереди ;-)

А, если серьезно, напишите в support - они передадут данную информацию техписателям.

"Как теперь с этим знанием существовать? :)" — я с этим вопросом существую с 2016 года. Пришел в конфигурацию 7.6-7.7, знатно прифигел от количества параметров в diff-конфигах некоторых элементов, пошел на sdk, увидел шиш с маслом.

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

Согласен пока об этом не знали и не думали как то а что теперь делать?

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

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

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

Вариант со справочником не подходит, т.к. в этом случае нельзя вывести системную колонку "id bpm" Контрагента.

Прошу подсказать , какие есть варианты.

Спасибо.

Нравится

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

Шевчук Александр,

Для вывода информации из детали можно использовать стандартный элемент итогов 'Список'. Информация, отображаемая в данном блоке может быть выгружена в MS Excel. Ознакомиться с документацией можно по ссылке.

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

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

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

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

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

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

 

Опишите более подробно кейс который вы хотите сделать с названием полей  и тд

 

Шевчук Александр,

Для вывода информации из детали можно использовать стандартный элемент итогов 'Список'. Информация, отображаемая в данном блоке может быть выгружена в MS Excel. Ознакомиться с документацией можно по ссылке.

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

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

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

Алла Савельева,

Спасибо за помощь, это именно то, что нужно!

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

Создаю деталь по инструкции https://academy.terrasoft.ru/documents/technic-sdk/7-12/sozdanie-detali… , но при попытке зайти в выбор получаю ошибку

Uncaught TypeError: Cannot read property 'caption' of undefined

    at i.getDefaultProfile (LookupPageViewModelGenerator.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:1368)

    at i.load (LookupPageViewModelGenerator.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:59)

    at i. (LookupPage.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:194)

    at LookupPage.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:328

    at Object.execCb (require.js:1699)

    at Module.check (require.js:881)

    at Module. (require.js:1136)

    at require.js:134

    at require.js:1186

    at each (require.js:59)

Нравится

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

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

Объект который используете для вашей детали имеет отображаемое поле? 

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

Скорее всего поэтому  и ошибка. Можете проэксперементировать, добавить текстовое поле и сделать его отображаемым?

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

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

Добрый день! Есть задача обновить значения в таблице при удалении элемента детали: в обработчике onDelete - делаю все необходимые изменения, но потом необходимо вызвать this.callParent(arguments); - но насколько я понимаю этого невозможно добиться в асинхронной функции. Как правильно поступить в таком случае? Если вызывать сallParent(); в теле основной функции, то в асинхронном запросе не могу получить данные, так как они уже удалены из БД.

Нравится

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

Добрый день, а вы пробовали вызвать this.callParent(arguments) в callback-функции при асинхронном запросе (при получении ответа)

Конечно пробовал, так не работает( Видимо контент this теряется и возвращается уже не тот...

mcNosferatum,

а передать контекст выполнения внутрь функции?

Колодяжный Владислав Эдуардович,

Да, пробовал. Не работает(

Если обновить значения в таблице нужно в базе, то можно сделать на уровне серверной логики: добавить обработчик во встроенном БП объекта, где есть событие «Deleting», вызываемое до удаления.

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

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

Нравится

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

В мобильном приложении это делается кодом на странице. См. тут, свойство «readOnly».

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

О деталях ещё есть такая статья.

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

Всем доброго времени суток. Версия 7.12.

Есть инструкция по созданию пользовательского виджета итогов: https://academy.terrasoft.ru/documents/technic-sdk/7-10/dobavlenie-polz…

Из неё честно говоря, совершенно не понятно, как передаются в модуль виджета данные записей для дальнейших манипуляций с ними. Или в модуле их придётся вытягивать через EntitySchemaQuery (но тогда вопрос - как передать параметры фильтра?)

Конкретная задача состоит в том, чтобы вывести соотношение между двумя суммами по разным колонкам (разумеется, с учётом фильтров и т.д.) Стандартными средствами можно вывести просто "Показатель" (например, сумму значений колонки Column, попадающих в фильтр), но не получится посчитать процентное соотношение между суммами по двум разным колонкам, или соотношение вроде "Сумма по Колонке Column в случае если её значение равно 1 / Общая сумма по колонке Column".

Возможно, есть какие-то примеры решения подобных задач?

Нравится

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

Добрый день, можете посмотреть данное дополнение https://marketplace.terrasoft.ru/app/calculated-metrics-bpmonline либо оно закроет вашу нужду, либо на его основе можете сделать свое решение

Добрый день, можете посмотреть данное дополнение https://marketplace.terrasoft.ru/app/calculated-metrics-bpmonline либо оно закроет вашу нужду, либо на его основе можете сделать свое решение

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

Всем доброго времени суток. Версия 7.12.

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

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

Нравится

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

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

 

setMultiSelect: function() {
				this.callParent(arguments);
				var rows = this.getGridData();
				this.addSelectedRecords(rows);
			},
			addSelectedRecords: function(gridData) {
				if (gridData) {
					var rowKeys = gridData.getKeys();
					this.set("SelectedRows", this.Ext.Array.push(rowKeys[0]));
				}
			}

 

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

 

setMultiSelect: function() {
				this.callParent(arguments);
				var rows = this.getGridData();
				this.addSelectedRecords(rows);
			},
			addSelectedRecords: function(gridData) {
				if (gridData) {
					var rowKeys = gridData.getKeys();
					this.set("SelectedRows", this.Ext.Array.push(rowKeys[0]));
				}
			}

 

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