Добрый день!

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

Спасибо заранее!

Нравится

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

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

Не совсем ясна Ваша задача. Вам необходимо проводить отладку процесса, но при этом Вам необходимы данные страницы. Вы можете создать параметры процесса и передать туда параметры со страницы (на самом деле достаточно передать Id записи, а потом элементом "Чтение данных" подтянуть остальные параметры). Уточните, пожалуйста, Вашу задачу.

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

Спасибо, что уделили время моему вопросу!

Программный продукт: Realty v5.4. (вроде ж тему создал в нужном разделе...)

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

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

Page.someCheckBox1Edit.Value

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

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

UserConnection.OpenedPages.GetPage("MyPage").someCheckBox1Edit.Value

Это не реальный код, а просто прообраз того, как (может быть - потому и спрашиваю!) мне получить то, что мне нужно.

Думал как-то прикрутить это:

GetInstanceByName()

но как-то ума не приложу, что и к чему...(

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

Нашел по "UserConnection.SessionData" вот это:

http://www.community.terrasoft.ua/forum/topic/9471

Среди всех постов есть вот такой код, по которому у меня еще несколько вопросов:

var defValuesId = new Guid("775F0C4C-9176-449E-B284-4108272F87AA");
var defValues = new Dictionary <string, object>();
 
defValues.Add("Type", new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6"));
defValues.Add("Account", Customer );
defValues.Add("PGNHK_AuctionLot", AuctionLot );
defValues.Add("Notes", Notes );
 
UserConnection.SessionData[defValuesId.ToString()] = defValues;

Правильно ли я понял. Для текущего пользователя создается переменная с названием "defValuesId.ToString()" и в нее передается коллекция "defValues" типа "Dictionary()" с ранее инициализированными значениями этой коллекции. В любом (в любом?) другом месте я, используя код:

var myDefValues = UserConnection.SessionData["775F0C4C-9176-449E-B284-4108272F87AA"];

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

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

Да, Вы правы. Но только в пределах сессии пользователя. Если параллельный процес запущен по какому-то событию в пользовательском интерфейсе, то нормально. А если по таймеру-кварцу или внешней интеграции — сессия уже, наверно, другая.

Это как раз то, что мне нужно. Александр, очень благодарен Вам!

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

Добрый день!

Столкнулся с таким поведением различных версий BPMonline. В Loyalty (версия 5.3) не возникает проблем с всплывающими окнами в Internet Explorer 11 (Windows Server 2012 R2 Standard), а в Realty (версия 5.4) при идентичных настройках браузера ничего не работает, кроме авторизации. Т.е. всплывающие окна не появляются.

Возможно, проблема в чем-то другом. На просторах интернета, увы, ничего похожего нет.

Прошу помощи, кто сталкивался с подобным. Заранее благодарю!

Нравится

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

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

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

Никогда подобное не встречалось.

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


Настройки перепробовал все, вплоть до полного отключения блокировки всплывающих окон. Также "игрался" с включением/отключением сценариев и ActiveX. Сайт добавил во все разрешения и список надежных сайтов. Ничего не помогает. На Loyalty при этом (повторюсь) все работает без проблем.

А в другом браузере всё нормально?
А в таком же на другом компьютере?

Первое. В ЯндексБраузере все отлично работает (в плане всплывающих окон и уведомлений, если таковые блокируются). В ГуглХроме тоже, но Хром не поюзаешь для работы, т.к. он не поддерживает SilverLight.
Второе. Это серверный компьютер, и все пользователи (практически) работают на нем через RDP.

Если в одних браузерах всё работает, а в другом нет, то проблема либо в IE, либо в специфических настройках Windows, которые IE подхватывает. Поскольку между 5.3 и 5.4 особых доработок интерфейса не было, то дело, скорее всего, в адресе сайта. Если сайты Ваши, попробуйте поменять их местами и посмотрите, проблема в адресе или в версии.

Если ли бы и там (в 5.3) и там (в 5.4) были проблемы, то я бы смирился с Windows'ом и его "странным" IE. Но ведь в IE версия 5.3 работает без проблем! Т.е. получается, что в 5.4. всё же что-то есть, что на это может влиять...

Можете уточнить, что Вы имеете в виду под словами "попробуйте поменять их местами"? Сайты зарвёрнуты на нашем сервере. Мне нужно в IIS'е поменять номера портов местами?

Здравствуйте.
Пробовал проверить работу всплывающих окон Realty 5.4 на IE11 - всё нормально. Думаю, что решение Вам нужно искать у себя. Для начала, как рекомендовали выше, поменять местами порты сайта. Если не поможет, тогда, всё таки, смотреть настройки браузера, ОС, политики безопасности и т. д..

Спасибо коллеги! Буду копаться...

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

defValues.Add("Symptoms", Page.TitleEdit.Value.ToString());

А если поле имеет тип дата/время, то, подскажите, пожалуйста, как правильно написать то же самое?

Нравится

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

Добрый день
Пытаюсь создать Инцидент из активности типа Email . Делаю кнопку в странице карточки Email, обработчик. В БП:

При компиляции выходит ошибка:

Нравится

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

Судя по сообщениям об ошибке, что-то неправильно написано в Вашем коде.

По первой, вы используете обращение к Terrasoft.Core.UserConnection.UserContext. А надо Page.UserConnection.UserContext.

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

Я смотрела тут: http://www.community.terrasoft.ru/forum/topic/9208
Там тоже подобная ошибка была, а сам процесс у меня правильный?

1) первую ошибку устранила.
2) по второй ошибке: создала новый параметр в БП: myParam.
В скрипте подготовки процесса действия открыть карточку пишу:
myParam = IncidentId;
В скрипте Генерации номера Инцидента пишу:
Page.DataSource.ActiveRow.SetColumnValue("IncidentId", myParam);

var entitySchemaManager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager;
var TargetScemaQuery = new EntitySchemaQuery(entitySchemaManager, "ServiceRequest");
var primaryColumn = TargetScemaQuery.AddColumn(TargetScemaQuery.RootSchema.GetPrimaryColumnName());
TargetScemaQuery.AddColumn("Number");
TargetScemaQuery.Filters.Add(TargetScemaQuery.CreateFilterWithParameters(
FilterComparisonType.Equal,
"Id",
myParam));
var incidentCollection = TargetScemaQuery.GetEntityCollection(UserConnection);
if(incidentCollection.Count != 0){
Page.IncidentEdit.SuspendAjaxEvents();
Page.IncidentEdit.SetValueAndText(incidentCollection[0].GetTypedColumnValue(primaryColumn.Name), incidentCollection[0].GetTypedColumnValue("Number"));
Page.IncidentEdit.ResumeAjaxEvents();

}

return true;

При опубликовании ошибка:

....исправила тип на Уникальный идентификатор.... Опубликовалось без ошибок

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

ВСЕ!!! ПОЛУЧИЛОСЬ!!!!

Еще вопрос: Не подскажете, как сделать так, чтобы при нажатии на ОК в созданным таким образом Инциденте, закрывалось не только окно Инцидента, но и окно Е-мейл Активности (из к-го и был создан этот Инцидент)

Нет, простыми средствами такое невозможно.

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

Добрый день
Есть ли видео урок, как делать отчеты-диаграммы ?

Нравится

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

Может, это (где-то в середине ролика) поможет?
Также посмотрите другие ролики этого пользователя, особенно старые. В основном там 7.Х, но есть и 5.Х.

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

Добрый день

Пытаюсь сделать отчет. При сохранении - выдало ошибку:

Нравится

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

Татьяна, а как Вы делали отчёт, по этой инструкции (стр. 524)?
Может, что-то не заполнили?

я делала по видеоинструкции (Город-Страна)

А что, напр., я могла не заполнить?

Татьяна, а можете дать ссылку на эту инструкцию?
Расскажите подробнее, что именно делали?
Вы создавали отчёт с нуля или правили уже существующий?
Сохраняли в файл или в базу?

Такое воспроизводится каждый раз на любом отчёте или только на одном конкретном?

Сделала все заново - получилось! но ошибка так и осталась непонятной...

Скажите, пжста, каким образом мне сделать выборку еще и по Состоянию активности (по прооисхождению Инцидента - уже сделано)?
Т.е. в отчете мне нужно сгруппировать Активности так:

Инцидент.Происхождение
Активность.Состояние
А здесь уже список активностей, попадающих под данную выборку

Заранее спасибо

И еще вопрос - как сделать отчет за заданный период ?

"TatianaM" написал:

Сделала все заново - получилось! но ошибка так и осталась непонятной...


Вероятно, какой-то случайный сбой.

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

По поводу периода, код на скриншоте очень похож на обычную работу с EntitySchemaQuery в системе.
Может, там и подойдёт обычное наложение фильтра методом CreateFilterWithParameters?

Да, лучше так:

Инцидент.Происхождение
Инцидент.Номер
здесь уже список активностей с типом Задача, привязанных с этому номеру Инцидента.

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

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

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

Чтобы выглядело примерно так:

Происхождение - Е-мейл
Номер Инцидент 1
активность
активность
активность
активность
активность
Номер Инцидент 2
активность
активность
активность
Происхождение - Звонок
Номер Инцидент 3
активность
активность
активность
активность
активность
Номер Инцидент 4
активность
активность
активность

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


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

Может, Вы хотите построить отчёт с деталью? См. стр. 525 по этой инструкции.

Да, я строю отчет с Деталью.
В инструкции на стр 527 написано:

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

- это где? потому что у меня что-то вывод активностей получается не связанным по группам.

По поводу выбора периода, в том отчёте, что Вы смотрите, есть 2 схемы:
Первая, «Статистика работы службы поддержки», редактируется в дизайнере отчётов.
Вторая, «Страница настройки отчета "Статистика работы Службы поддержки"», унаследована от «Базовая страница параметров отчета» и редактируется в браузере, как обычная страница.

Посмотрите в этом отчёте, как происходит взаимодействие отчёта и страницы и попробуйте аналогично.

ок, посмотрю

ок, посмотрю

ок, посмотрю

#14 TatianaM 17 ноября 2015 – 16:37
Да, я строю отчет с Деталью.
В инструкции на стр 527 написано:

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

- это где? потому что у меня что-то вывод активностей получается не связанным по группам.

Может, под признаком имеют в виду галочку в дереве на скриншоте выше?

это я поставила.

Подскажите пожалуйста, как на С# написать условие в скрипте отчета:
если в Инциденте поле "Происхождение" - такое-то, то далее выполняется вывод активностей.

Происхождение - Е-мейл
Номер Инцидент 1
активность
активность
активность
активность
активность

Татьяна, работа с отчётами описана в PDF-инструкции и видео-уроках, также в конфигурации можно посмотреть исходники уже существующих отчётов.
Если Вы хотите получить какую-то новую логику и не знаете, как её разработать самостоятельно, можете обратиться к Terrasoft или к кому-то из их партнёров и заказать такую доработку.

"Мария Ватулина" написал:

Татьяна, работа с отчётами описана в PDF-инструкции и видео-уроках, также в конфигурации можно посмотреть исходники уже существующих отчётов.

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


Мария ! а где их взять ?(

Кого, партнёров?
Есть страница, где они перечислены.

Мария уроки и инструкции по отчетам версии 5.2

Александр его делали.. только не понятно что там он не работает

У меня ссылка открывается.

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

Добрый день

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

Нравится

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

Пользовательскими средствами такое сделать нельзя.
Нужно либо сделать отдельный бизнес-процесс, проводящий необходимые вычисления, либо логику на объекте «Активность» на события добавления, удаления активности или её сохранения с новым значением поля. Ещё один вариант реализации — триггер на таблицу Activity, делающий то же самое на уровне БД (см. пример).

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

Здравствуйте.
У меня есть страница для ввода параметров поиска. Страница не привязана ни к какому объекту. Значения из её полей передаются в параметры бизнес-процесса, выполняющего поиск. Как мне с помощью функции asyncValidate из BasePageV2 проверить, что на моей странице поиска заполнены все поля?

Нравится

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

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

Для поля Вы можете использовать свойство enable: true. Этот признак сделает поле обязательным для заполнения. Таким образом Вы сможете осуществить валидацию на заполнения полей значениями.

Алексей, у меня в ТЗ указано, в частности, условие, что заполнение любого из полей не обязательно. Поэтому, я и прошу показать мне как проверить заполнение полей с помощью asyncValidate. Моя страница унаследована от модуля "Базовая схема карточки" из пакета NUI. К этому посту я прикрепил текстовый файл, содержащий Javascript страницы.

Евгений, добрый день!

Рекомендую Вам посмотреть реализацию данного метода в DocumentPageV2. Вы можете реализовать необходимый функционал по аналогии. Сначала необходимо реализовать метод проверки заполненности полей (по аналогии с validateAccountOrContactFilling), который принимает в качестве входящих параметров функцию обратного вызова и контекст выполнения, потом вызвать его в asyncValidate. Например:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.myValidationMethod(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function() {
				callback.call(scope, response);
			},
			this);
		}, this]);
},

Спасибо.

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

Займався створенням нового розділу за принципом розділу "Пользователи" (того, що в робочих місцях не відображено).
Потрібно було в процесі відладки подивитись, як веде себе "Страница реестра вхождения в роли" (AdministrativeUserInRoleGridPage).
В дизайнері схеми був присутній пул з доріжкою й субпроцесом, в якому шаблонами були внесені "Начальное сообщение" зв"язане з "Промежуточным генерирующим сообщением", причому обидва не проініціалізовані. При збереженні схеми в такій ситуації видається помилка на обидва елементи.
Як на мене, весь цей пул з доріжкою, субпроцесом і пустипи елементами був зайвий і я його зтер.
Схему опублікував.
Після цього, при спробі відкрити розділ "Администрирование.Пользователи" отримую помилку в
AdministrationUnitsGridPageEventsProcess.ScriptChildDataSourceLoadRowsResponseRegisteredExecute
в коді:

var buttonMenu = Page.AddButton.Menu;
var organizationMenuItem = buttonMenu.Find(item => item.Name.Contains(new Guid("DF93DCB9-6BD7-DF11-9B2A-001D60E938C6").ToString("N")));
var unitMenuItem = buttonMenu.Find(item => item.Name.Contains(new Guid("B659F1C0-6BD7-DF11-9B2A-001D60E938C6").ToString("N")));
var chiefMenuItem = buttonMenu.Find(item => item.Name.Contains(new Guid("B759F1C0-6BD7-DF11-9B2A-001D60E938C6").ToString("N")));
var teamMenuItem = buttonMenu.Find(item => item.Name.Contains(new Guid("462E97C7-6BD7-DF11-9B2A-001D60E938C6").ToString("N")));

Власне помилку генерує наступний код:
organizationMenuItem.Enabled = true;
unitMenuItem.Enabled = true;
chiefMenuItem.Enabled = !hasUnitChief;
teamMenuItem.Enabled = true;

По тій причині, що всі означені об'єкти = NULL.

(Зауважу, що дану схему я не чіпав)

Я не схильний новоотриману помилку пов'язувати із знищенням того самого пулу з доріжкою (хоча й не буду це категорично заперечувати).

Я ще попередньо спочатку створив вже існуючий розділ "Администрирование", потім вилучив його, далі виявив, що він і в таблиці [SysModule] зник, тому запис імпортував з оригінальної БД.
Потім я так само створив вже існуючий розділ "Пользователи", який відобразився зо всім пакетом деталей.
Вже після цього я вилучав порожні елементи й публікував схему.

На даний момент ще не вдається розібратися, в чому ж справа ...

Нравится

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

Якщо потрібен скан помилки - можу відправити в приват

Посмотрел на коробке эту страницу, там только 3 подпроцесса по сообщениям: «OpenRoles», «DeleteButtonClick» и «PageLoad».

процесс

Возможно, Вы смотрите на версию страницы с чьими-то доработками.

Шукаю зараз, де формується меню для кнопки "Добавить" для розділу "Администрирование.Элементы организационной структуры"
(те, що читається в AdministrationUnitsGridPageEventsProcess.ScriptChildDataSourceLoadRowsResponseRegisteredExecute)

Игорь, это стандартный механизм для раздела с несколькими карточками для разных типов. В BaseGridPage в скрипте ScriptTaskBaseGridPageInit:

var editPages = GetEditPages();
if (TypeColumnUId != Guid.Empty && Page.DataSource.CurrentStructure.Columns.FindByMetaPath(TypeColumnUId.ToString()) == null) {
	var typeColumn = Page.DataSource.Schema.Columns.GetByUId(TypeColumnUId);
	var column = Page.DataSource.CurrentStructure.AddColumnByPath(typeColumn.Name);
	column.IsVisible = false;
	column.IsAlwaysSelect = true;
}
foreach (var item in editPages) {
	var addMenuItem = CreateAddButtonMenuItem(item.Value, item.Key);
	Page.AddButton.Menu.Add(addMenuItem);
	if (!IsContextHelpButtonInitialized) {
		string formatString = "{0}.on('click', function(el) {{ {1} }}, this)";
		var parameters =  item.Key.Split('&');
		var typeEditPageUId = new Guid(parameters[0]);
		var typeEntityId = new Guid(parameters[1]);
		var typeEditPageUIds = TypeEditPageUIds as Dictionary<Guid, Dictionary<string, Guid>>;
		string script = GetRegisterAddPageScript(typeEditPageUId, typeEditPageUIds[typeEntityId]["SysModuleEditId"], typeEntityId);
		Page.AddScript(string.Format(formatString, addMenuItem.ClientID, script));		
	}
}

Я вже теж дійшов висновку, що щось не так з типами карточок.
Перевірив запис розділу [Пользователи], - виявилось, що в результаті маніпуляцій з розділами (в робочих місцях) збилися параметри
[Использовать отдельные карточки для работы с записями разного типа]
[Тип записи указан в колонке]

При спробі відновити значення через стандартну форму виходило повідомлення:

Необходимые элементы конфигурации не найдены
Для использования групп необходимы следующие объекты: AdministrativeUsersFolder, AdministrativeUsersInFolder

Подивився на робочій - відсутні такі об'єкти, тому відновив значення через SQL - все запрацювало.
Дякую за підказку :smile:.

Цікаво, а як формувався запис розділу [Пользователи], зважаючи на те, що в оригінальній версії він відсутній у списку робочих місць, і навіть якщо його добавити, то для збереження все одно ще треба створювати два додаткових об'єкти
[AdministrativeUsersFolder] та [AdministrativeUsersInFolder]
які, як видно, насправді не були створені і тим не менше, розділ чудово функціонує без вказаних об'єктів.

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

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

Добрый день.
Есть задача отобразить рабочий телефон отвтетственного по продаже в ПФ Word. Телефон хранится в детали Средства связи контакта. Как мне получить данные детали Ответственного и отфильтровать их по типу.
Пытался добавить:
1. Через вкл. "Поля печатной формы" -> Системные связи. Однако, там отображается только агрегированные данные (количество, сумма).
2. Через вкладку "Табличные части печатной формы", но добавить туда новые объекты не представляется возможным (ошибка:Невозможно обновить представление или функцию "dbo.VwSysSchemaInfo", так как изменение влияет на несколько базовых таблиц.)

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

Нравится

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

Игорь, а какая используется версия системы?

Я использую BPMOnline Cargo 5.4.0.1555. Но данная проблема является общей для всех версий BPMOnline в части формирования отчётов Word

Может, стоит пойти другим путём?
В карточке контакта есть поле «рабочий телефон»?
Если есть, брать оттуда.
Если нет — добавить поле в объект «контакт» (можно в карточку не выводить) и заполнять его при добавлении-изменении-удалении средства связи на уровне объекта детали или триггером.

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