ID
выделенная запись
скрипт
Технические вопросы
5.x

BPM 5.4.0
Создал кнопку реестре, для обработки необходимо получить id и другие поля выделенной записи. Как это сделать?
И еще вопрос, как потом в эту запись что-то добавить или изменить?

Нравится

1 комментарий
Page.TreeGrid.SelectedNodes

вернет Вам выделенные клиентом в реестре записи как ObservableCollection
А свойство

SelectedNodePrimaryColumnValue

- Id той записи на которой находится курсор

Какой-то странный вопрос??? Как в уже существующую запись можно что либо добавить. Если Вам нужно изменить запись, то вот код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esq.AddAllSchemaColumns();
var entity = esq.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);
// код модификации записи
// entity.SetValueAndText("Id записи лукапного", "Текстовое представление лукапного поля");
entity.Save();

Для создания новой записи код:

var manager = UserConnection.EntitySchemaManager.GetInstanceByName(Page.DataSource.Schema.Name);
var entity = manager.CreateEntity(UserConnection);
entity.SetDefValues();
// код модификации записи см. выше
entity.Save();

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

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

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

Нравится

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

Здравствуйте, Акмаль.

Сложность интеграции со сторонней системой зависит от следующих факторов:

1. Глубины интеграции (должно быть полноценное техническое задание, вплоть до сопоставления полей двух БД);

2. Метод интеграции (через COM-объекты, веб-сервисы, на уровне БД и т.д.);

3. Периодичность синхронизации.

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

Если базы находятся на разных серверах и/или разных СУБД, необходимо использовать веб-сервис либо утилиту, которая в зависимости от ТЗ будет производить синхронизацию данных.

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

Анна, спасибо за ответ.

Скажите, если упростить задачу до минимума - по нажатию на кнопку происходит синхронизация заданных полей и таблиц в обеих СУБД.
Как лучше решить такую задачу - с помощью независимой утилиты-посредника, или можно написать всё в BPMonline?

Можно написать хранимку в БД BPMonline и по кнопке вызывать её.

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

Да, конечно.
Если это разные схемы, то достаточно просто поставить признак схемы, если же это разные БД, то используйте технологию DBLink.

Здесь ещё упоминался способ интеграции через веб-сервисы. Может кто-нибудь объяснить механизм осуществления подобного вида интеграции? Хотя бы в общих чертах...

Здравствуйте, Акмаль!

В общих чертах механизм таков:

1. Вами пишется веб-сервис на любом языке программирования, который направляет запросы в формате протокола OData (http://odata.org)

2. Данный веб-сервис настраивается на BPMonline в соответствии с механизмом, описанные по следующей ссылке

3. Реализовать интеграцию веб-сервиса с БД биллинга;

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

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

Вчера ставил эксперименты и, как я понял, Linux мне не светит на клиентских машинах из-за аллес капута с SilverLight?
MoonLight, в качестве поддержки, конечно есть, только польза от него заключается, ИМХО, лишь в факте его существования :smile:

Или я ошибаюсь и есть какие нить способы? А то соблазнительно всех пересадить на квантовый кетцаль, так как если внедрить BPM, то от винды то мне ничего и не надо (хотя как оказалось надо: SilverLight), чего не может дать linux.

Нравится

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

"Шамуилов Александр" написал:Вчера ставил эксперименты и, как я понял, Linux мне не светит на клиентских машинах из-за аллес капута с SilverLight?
MoonLight, в качестве поддержки, конечно есть, только польза от него заключается, ИМХО, лишь в факте его существования :smile:

Браузер какой пробовали? Интересно...
Я такое огорчение поймал на планшете с iOS...

Здравствуйте. Работать будет, кроме того функционала, который требует наличия SilverLight (графическое отображение расписания, отчёты, графики).

"Александр Кудряшов" написал:

Браузер какой пробовали? Интересно...

Я такое огорчение поймал на планшете с iOS...


Там типа много вариантов? :wink:
Лиса да хром, естественно. Нет, как ниже заметили оно работает, но бизнес процессы не показывает и дизайнить не дает напрочь....а что там еще может вылезти.....это уж не знаю....

Как я упоминал выше: "графическое отображение расписания, отчёты, графики" Выдержка из руководства по настройке касательно перечня официально поддерживаемых ОС на клиентском рабочем месте:
Microsoft Windows:
• Windows XP Service Pack 3;
• Windows Vista;
• Windows 7.
Mac OS:
• Mac OS X 10.4 Tiger;
• Mac OS X 10.5 Leopard;
• Mac OS X 10.6 Snow Leopard;
• OS X 10.7 Lion;
• OS X 10.8 Mountain Lion.

В 5.3 и выше графики уже без SL.

Silverlight требуют:

  • Расписание
  • Просмотр отчетов
  • Дизайнер процессов (включая редактирование встроенных процессов в дизайнерах страниц и объектов)

Для запуска и выполнения бизнес-процессов Silverlight не требуется. Такие вот ограничения.

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

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

Возник такой баг: Создал свой грид для своего справочника, но при выборе этого справочника грид почему-то не активен:

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

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

Нравится

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

попробуйте раздать права на данный грид, обычно помогает :)

По какой-то причине не подтягиваются настройки колонок грида. Т.е. в странице грида выбрана колонка для отображения "Название", в детали справочника "Колонки" тоже выбрана колонка название, но в гриде она не отображается. При попытке настроить колонки (правой кнопкой в гриде -> настроить колонки) не появляется окно с выбором колонок.

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

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

как построить бизнес-процесс постановки задачи другому сотруднику отслеживанием статуса изменения задачи? процесс выглядит так:
- менеджеру ставится задача создать документ, указывается дата и срок исполнения
- менеджер должен принять задачу, изменив статус на Принято, постановщику должно прийти уведомление об изменении статуса задачи
- после исполнения задачи менеджер меняет статус на выполнено, постановщику задачи приходит уведомление, у задачи меняется статус на Условно завершена
- если постановщик принимает задачу, статус меняется на завершена и увеомление приходит менеджеру

Нравится

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

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

Реализовать такую функциональность можно при помощи элемента БП Промежуточный сигнал:

signal_0

Пример настройки сигнала для Вашего случая:

signalsettings

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

Уважаемые товарищи. Необходимо убрать обязательность заполнения полей Контакт (Контрагент) из карточки раздела Обращение. Смотрел в объекте и в карточке - данные поля являются необязательными для заполнения. Подскажите куда копать?

Нравится

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

Добрый день.

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

1

Или же свойство выставляется где-то программно.

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

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

PS: как вариант в объекте для этого поля можно задать значение по умолчанию (в объекте).

"Олейник Дмитрий" написал:Денис, в дизайнере карточки поле отображается красным?

Нет

"Словачевский Денис" написал:Но при сохранении Обращения система все равно требует заполнить одно из них

В БП карточки на событии после PageLoadComplete закомментируйте строку вроде:

Terrasoft.Configuration.MultiLookupHelpers.IsRequiredRegisterScript(Page.AccountEdit, Page.ContactEdit,
	Page.BaseMessagePanel, Page.DataSource, Page.AddScript);
Показать все комментарии
Технические вопросы
5.x

Создала объект Address. Чтобы зарегистрировать для него рабочее место, создаю так же объекты типа Base Folder и Base Item in Folder.
При публикации Base Item in Folder получаю ошибку :

Что не так?
Использую англоязычную демо-версию BPMonline Realty.

В документации нашла, что нужно указать еще кое-какие установки :

Но у меня это выглядит по другому :

Нравится

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

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

Сначала попробуйте создайть и опубликовать изначально объект AddressFolder, а затем AddressInFolder.

> Сначала попробуйте создайть и опубликовать изначально объект AddressFolder, а затем AddressInFolder.
Именно в такой последовательности я и делала. Еще хочу добавить, что такая проблема возникла именно в выше указанной версии. До того я работала с простой русскоязычной версией BPMonline и там таких проблем не возникало.

Здравствуйте, Наталия.

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

О, прошу прощения, я почему-то была уверена, что указала версию.
Это 5.4.0.917(745)_Realty_DemoInternal_MSSQL_ENU

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

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

Показать все комментарии
контрагенты
продажи
Продукты
5.x

Подскажите плиз!
Наша компания предоставляет услуги телефонно-справочной службы (принцип подписки на длительное время), а также 5 печатных изданий. Поставлена задача отобрать предприятия не стоящие на телефонной справке на сегодняшний день, а также предприятия стоявшие когда либо, но отказавшиеся от этой услуги.
Заранее спасибо!

Нравится

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

Добрый день.

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

Если будут вопросы - задавайте.

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

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

float Val1 = Page.MyControl1Edit.Value;
float Val2 = Page.MyControl2Edit.Value;
Page.MyControl3Edit.Value = Val1*Val2;

не компилируется.

float Val1 = float.Parse(Page.MyControl1Edit.Value.ToString());
float Val2 = float.Parse(Page.MyControl2Edit.Value.ToString());
Page.MyControl3Edit.Value = Val1*Val2;

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

Как написать правильно?

Нравится

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

Лучше берите не значения из контролов, а у DataSource.

Page.DataSource.ActiveRow.GetTypedColumnValue<float>("FieldName");
Page.DataSource.ActiveRow.SetColumnValue("FieldName", value);

Ольга,
спасибо получилось как Вы советуете.

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

Коллеги, подскажите что и где нужно прописать, чтобы решить такую задачку: при удалении контрагента должна проходить проверка: если контрагент имеет статус "действующий", то пользователю выдается сообщение о том, что его нельзя удалить, и удаление, соответственно, не происходит.
Насколько я понимаю, нужно просто добавить проверку на событие кнопки "Удалить" реестра контрагентов. Но что именно там нужно писать?

Нравится

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

Решал похожую задачу: при клике OK в карточке проверял условие и если оно выполнялось - показывал вопрос пользователю (да или нет). Если да - выполнял некое действие, а затем базовая логика сохранения и закрытия карточки. Если нет - не делал ничего, карточка оставалась открытой.
фрагмент БП
У вас должно быть похоже, но проще. Принимается сообщение нажатия на кнопку, в блоке-скрипте присваивается значение булевскому параметру (его надо создать в дизайнере). Затем два потока, один условный при параметре, равном true, на событие нажатия кнопки в базовом процессе. Другой - по умолчанию (если параметр false) - сообщение пользователю о невозможности удаления и всё.

В скрипте scr_AccountsGridArea событие btnDeleteOnClick необходимо изменить примерно так:

var SelectedIDs = grdData.SelectedIDs;
	var SelectedIDs = grdData.SelectedIDs;
	var SelectedIDsCount = SelectedIDs.Count;
	if (!SelectedIDsCount) {
  		return;
	}
	var deleteflag = true;
	var i;
	for (i = 0; i<SelectedIDsCount; i++) {
		if (GetDatasetFieldValueByID('ds_Account', SelectedIDs([i]), 'StatusID') == StatusIdValue) {
			deleteflag = false;
		}
	}
	if (deleteflag) {
		scr_BaseGridArea.btnDeleteOnClick(Control)
	}
        else {
		ShowInformationDialog('Нельзя удалить действующего контрагента');
	}

Где 'StatusID' - Имя поля Статус, а StatusIdValue - ID статуса "действующий"

Не заметил, что BPM. Но может кому-то понадобится для CRM.

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

При таком подходе, Вы возвращаете серверную подписку на кнопку, в то время, как по умолчанию - клиентская.
Как выход, на событии Init своей страницы, перед вызовом базового обработчика подписаться на событие DataSource.BeforeRemoveRow, выполнить проверку на условие и в случае отрицательного результата такой проверки установить свойство DataSourceEventArgs.Cancel = true; При таком подходе, Вам не придется делать какие-то дополнительные запросы в БД, поскольку аргумент DataSourceEventArgs будет содержать ссылку на удаляемую строку.

Приблизительно будет так:
В скрипте перед вызовом базовой логики пишете:

Page.DataSource.BeforeRemoveRow += (sender, e) => {
var account = e.Row;
if (account == null) {
return;
}
Guid statusId = account.GetTypedColumnValue("StatusId");
if (statusId.Equals(ActiveAccountStatusId)) {
e.Cancel = true; // Это нужно, что не прошло базовое удаление
ErrorMessageText = new LocalizableString("Вы не можете удалить действующего контрагента");
}
};

Где StatusId - название поля статуса в БД, ActiveAccountStatusId - константа действующего статуса контрагента, а ErrorMessageText - локализируемая строка с сообщением (разумеется Вашим :) ).
Потом вставляете Исключающее или с условным потоком в котором проверяете:

!string.IsNullOrEmpty(ErrorMessageText.ToString())

и после которого идет скрипт о сообщении.

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