Выдает: При привязке SysSettingsValue выдает "Не привязаны данные для связанного объекта "SysSettings" по колонке "SysSettings". Значение "72ab6c8f-fbb6-42ae-ba5c-7288bab96e2d"

Однако запись в SysSettings c Id = 72ab6c8f-fbb6-42ae-ba5c-7288bab96e2d предварительно успешно привязана.

Манипуляции из этой темы проблемы не решили.

Остается только через SQL?

Нравится

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

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

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

Литвинко Павел,

так и было! Благодарю.

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

Добрый день!

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

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

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

Нравится

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

Проверьте лог обновлений! ( \tmp\PackageInstallation\Log\install.log)

Те в логе установки посмотрите что ваши схемы объекты и тд попали в пакет и успешно импортировались, что в нем нет ошибок....

Проверьте есть ли в конфигурации объекты с признаком требует генерации в БД.

Попытайтесь перекомпилировать конфигурацию (Всю) или накатить пакет повторно

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

Литвинко Павел,

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

 

Проверьте лог обновлений! ( \tmp\PackageInstallation\Log\install.log)

Те в логе установки посмотрите что ваши схемы объекты и тд попали в пакет и успешно импортировались, что в нем нет ошибок....

Проверьте есть ли в конфигурации объекты с признаком требует генерации в БД.

Попытайтесь перекомпилировать конфигурацию (Всю) или накатить пакет повторно

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

Коллеги всем доброго времени суток.

Нужна Ваша помощь.

Написал сервис с методом который принимает следующие параметры:

[OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public void StartProcessWithParameters(string processName, Dictionary<object, object> parameters)
        {
            try
            {
                _logService.RecInfo($"[AutobookingServicesPack]:[AbStartProcessManager]:[StartProcessWithParameters(string processName = '{processName}', Dictionary<string, string> parameters)]: ({parameters.Count()})");
                ProcessSchemaManager processSchemaManager = (ProcessSchemaManager)UserConnection.GetSchemaManager("ProcessSchemaManager");
                ProcessSchema processSchema = processSchemaManager.GetInstanceByName(processName);
                Process process = processSchema.CreateProcess(UserConnection);
                foreach (var parameter in parameters)
                {
                    process.SetPropertyValue(parameter.Key.ToString(), parameter.Value);
                }
                process.Execute(UserConnection);
            }
            catch (Exception e)
            {
                _logService.RecInfo($"[AutobookingServicesPack]:[AbStartProcessManager]:[StartProcess(string processName = '{processName}', Dictionary<string, string> parameters)]:Exception: {e.Message}; {e.InnerException}");
            }
 
        }

Через фидлер кидаю следующий json:

{

    "processName":"AbListenCallAfterCancelationOrderProcess",

    "parameters":{

        "OrderId":"e3f25831-2482-4804-9564-72d6670634a5",

        "CallsId":"e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"

    }

}

В логах СРМ следующее:

[AutobookingServicesPack]:[AbStartProcessManager]:[StartProcessWithParameters(string processName = 'AbListenCallAfterCancelationOrderProcess', Dictionary parameters)]: (0)

Видно, что  processName десерелизовало, а вот parameters нет в Dictionary 0 элементов.

 

Подскажите в чем может быть проблема?

заранее благодарен.

Нравится

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

А еще лучше попробовать так

function toDictionary(obj) {
   var data = [];
   for (var key in obj) {
      data.push({ Key: key, Value: obj[key] });
    }
  return data;
}
 
var _parameters = {}
_parameters ["OrderId"] = "e3f25831-2482-4804-9564-72d6670634a5";
_parameters ["CallsId"] = "e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda";
 
 
 
var serviceData = {
   processName: "XrenyaNerabotaychayaProcess",
   parameters: toDictionary(_parameters)
};
//serviceData  это то что отправляется сервису

Чтобы получить в JSON.stringify(serviceData) чтото типа:

""processName":"XrenyaNerabotaychayaProcess",

"parameters":[

{"Key":"OrderId","Value":"e3f25831-2482-4804-9564-72d6670634a5"},

{"Key":"CallsId","Value":"e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"}

]}"

 

 

 

Попробуйте может WebMessageBodyStyle.Bare вместо Wrapped

Литвинко Павел,

При 

Bare 500 ошибку вываливает

Попробуйте так

В описание метода:

 StartProcessWithParameters(string processName, Dictionary<string, string> parameters)

 

Параметры как то так попытайтесь подставить



"processName":"AbListenCallAfterCancelationOrderProcess",

"parameters":

[{"OrderId" :"e3f25831-2482-4804-9564-72d6670634a5"},

{"CallsId": "e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"}]

}

 

В CallsId будет строка список Id через ; 

А еще лучше попробовать так

function toDictionary(obj) {
   var data = [];
   for (var key in obj) {
      data.push({ Key: key, Value: obj[key] });
    }
  return data;
}
 
var _parameters = {}
_parameters ["OrderId"] = "e3f25831-2482-4804-9564-72d6670634a5";
_parameters ["CallsId"] = "e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda";
 
 
 
var serviceData = {
   processName: "XrenyaNerabotaychayaProcess",
   parameters: toDictionary(_parameters)
};
//serviceData  это то что отправляется сервису

Чтобы получить в JSON.stringify(serviceData) чтото типа:

""processName":"XrenyaNerabotaychayaProcess",

"parameters":[

{"Key":"OrderId","Value":"e3f25831-2482-4804-9564-72d6670634a5"},

{"Key":"CallsId","Value":"e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"}

]}"

 

 

 

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

Добрый день!

 

у нас есть стороннее веб приложение которое использует данные из BpmOnline. получает, создает, обновляет данные.

работа идет через DataService, пользователь Supervisor.

иногда в процессе работы выходит ошибка 401.

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

может есть какое-то время жизни токена? или может нужно как-то настроить сайт в иис чтобы не было ошибок?

Нравится

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

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

Без кода трудно понять 

но конечно у каждой сесии (сеанса подключения) есть таймаут

При каждом вызове внешнего сервиса нужно подключать авторизационные кукие как это описанно в статье https://academy.terrasoft.ua/documents/technic-sdk/7-13/rabota-s-obekta… Или для доступа к данным сделать свой анонимный вэб сервис

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

Григорий Чех,

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

 

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

Кроме обычной куки, нужно ещё BPMCSRF.

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

передаем. без этого бы вообще не сработало

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

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

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

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

Zaitova Liubov,

Здравствуйте. не забывайте, что куки авторизации действительны определенное время. Например Вы аторизировались под Supervisor "покидали" некие запросы в срм и потом на протяжении 1 часа действий со стороны Вашего приложения не происходило то тогда Ваши куки устаревают, если мене не изменяет память, по умолчанию таймаут сеанса пользователя составляет 20-30 мин. Данную настройку можно редактировать в профиле пользователя системы. 

http://prntscr.com/l7fu09

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

Добрый день!

Необходимо отправлять email-оповещение при назначении обращения по шаблону из справочника.

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

Сообщение из раздела обращений которое нужно прочитать:

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

Upd. Процессом считывания данных и заполнением шаблона занимается бизнес-процесс "SendEmailToSROwner", пакет "CaseService". 

Есть ли возможность вытащить из ленты в бизнес-процессе последнее сообщение?

Нравится

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

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

Лента — это обычный объект ESNNotification и связанный с ним SocialMessage. Можно читать стандартными элементами чтения данных.

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

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

Добрый день!



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



Все начальники входят в функциональную роль "Начальники".



Реализацию вижу следующим способом:

1) Считать группу ответственных

2) Найти контакт, который входит в эту группу и в группу "начальники"

3) Если этот контакт не совпадает с ответственным, запустившим БП, то передать его в параметр БП

4) Если контакт совпадает, то взять ParentRoleID и повторить поиск по новой группу+группа начальников, а затем уже передать найденный контакт в параметр БП

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



Навыки владения C# скудны, поэтому прошу помощь в понимании следующих нюансов:

1) Как считать нужные данные

2) Как найти контакт, который входит в обе группы

3) Как передать найденное значение в параметр БП для его дальнейшего использования



Буду признателен за помощь.



 

Нравится

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

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

Это можно было бы сделать, будь у меня пользователь только в одной роли. Как найти ID пользователя, если он в организационной роли и функциональной?

Настраивать нужное условие фильтрации.

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

Любые мои варианты сделать фильтрацию провалились. Как сделать фильтр, если человек может быть в двух группах и мне нужно найти его? Было бы "или" - вопросов нет. Если предлагаете какой-то вариант - тогда предлагайте до конца. 



Поэтому возвращаемся к исходной задаче и к элементу [Задание-сценарий]. Просто документации с хорошо расписанными примерами просто нету, вот и прошу помощи

А что не так с «или»?

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

Мне надо найти пользователя, который входит сразу и в группу ответственных и в группу функциональную. Это никак не "или". Я не говорю что там нет "или", я говорю что в моей задаче надо "и". И вроде как в описании задачи это написано.

Было бы "или" - вопросов нет.

 Это никак не "или". Я не говорю что там нет "или", я говорю что в моей задаче надо "и".  

Вы всё же определитесь, что Вам надо. Напишите  SQL-запрос, которым бы хотели фильтровать записи, а потом уже думайте, как перевести на язык фильтров в дизайнере или на язык EntitySchemaQuery или Select в C#-скриптах.

Написал sql запрос, который находит нужный мне ID контакта (начальник отдела). Может по нему будет проще понять что же я хочу получить в итоге. Сами ID для поиска заранее определяются в БП:

A7E3D18A-0F2D-444D-BE2B-CD625DC3C097 - организационная роль

3DAFC997-65E9-47E4-9434-F036077D66F4 - функциональная роль

SELECT [ContactId]
 FROM [URFUbase].[dbo].[SysAdminUnit] where [id] in (SELECT distinct r1.[SysAdminUnitId]
 FROM [URFUbase].[dbo].[SysAdminUnitInRole] r1
	join [URFUbase].[dbo].[SysAdminUnitInRole] r2 on r2.SysAdminUnitRoleId = '3DAFC997-65E9-47E4-9434-F036077D66F4' and r1.[SysAdminUnitId]=r2.[SysAdminUnitId] 
 where r1.SysAdminUnitRoleId = 'A7E3D18A-0F2D-444D-BE2B-CD625DC3C097')

 

Такой запрос, наверное, будет делать при помощи класса Select. Там синтаксис почти полностью повторяет SQL.

И этот запрос, мне кажется, было бы логичнее вывернуть наизнанку, сделав выборку из SysAdminUnitInRole r1 корневой, а получение Id контакта — колонкой подзапроса или ещё одним join-ом.

 

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

UserConnection userConnection = Get&lt;UserConnection&gt;("UserConnection");
var group = Get&lt;Guid&gt;("ProcessSchemaParameter1");
var subSelect = new Select(userConnection).Column("r1", "SysAdminUnitId")
	.From("SysAdminUnitInRole").As("r1").Join("SysAdminUnitInRole").As("r2")
		.On("r2","SysAdminUnitInRole").IsEqual("3DAFC997-65E9-47E4-9434-F036077D66F4")
			.And("r1","SysAdminUnitId").IsEqual("r2","SysAdminUnitId").Where("r1","SysAdminUnitRoleId").IsEqual(group);
var Select = new Select(userConnection).Column("ContactId").From("SysAdminUnit").Where("Id").IsEqual(subSelect);
Set("ProcessSchemaParameter2", Select);
return true;

Очень нужна помощь в понимании того как делать правильно

var userConnection = Get&lt;UserConnection&gt;("UserConnection");
var group = Get&lt;string&gt;("ProcessSchemaParameter1");
 
string selectID = ((Select)new Select(userConnection)
   .Column("t1", "SysAdminUnitId")
   .From("SysAdminUnitInRole").As("t1")
   .Join(JoinType.Inner, "SysAdminUnitInRole").As("t2")
   .On("t2", "SysAdminUnitRoleId").IsEqual(Column.Parameter(new Guid("3DAFC997-65E9-47E4-9434-F036077D66F4")))
   .And("t1","SysAdminUnitId").IsEqual("t2","SysAdminUnitId")
   .Where("t1", "SysAdminUnitRoleId").IsEqual(Column.Const(group))).ExecuteScalar&lt;string&gt;();
var contact = ((Select)new Select(userConnection)
	.Column("ContactId")
	.From("SysAdminUnit")
	.Where("Id").IsEqual(Column.Const(selectID))).ExecuteScalar&lt;string&gt;();
 
Guid contactId = new Guid (contact);
Set("ProcessSchemaParameter2", contactId);  
 
return true;

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

Поправка, лучше использовать таблицу SysUserInRole

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

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

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

 

Нравится

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

Дело может быть в том, что объект детали «Продукт в продаже» (OpportunityProductInterest) сделан на основе базового объекта, а другие подобные детали «Продукт в заказе» (OrderProduct) и «Продукт в счете» (InvoiceProduct) — на основе виртуального объекта «Базовое вхождение продукта» (BaseProductEntry). Соответственно, у объектов OrderProduct и InvoiceProduct есть поле «Название» и оно является первичным для отображения.

Сравните между собой детали и попробуйте сделать аналогично.

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

Есть потребность сделать реестр который можно редактировать. У реестра нет таблица в БД. Он должен формироваться динамически с разных таблиц. Одна колонка должна быть редактируемая где пользователь будет писать значение. Этот реестр наверно должен быть в отдельном окне. После заполнения пользователь жмет кнопку Ок и БПМ обрабатывает реестр и проделывает работу в исходном коде.

Вопрос: Возможно ли сделать такое окно и если да то куда копать?

Нравится

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

На мой взгляд, Вашу задачу можно решить проще.

1. Создаете представление (view) с нужными Вам данными.

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

3. Над реестром добавляете виртуальное поле и кнопку [OK]. В зависимости от перемещения по детали подтягиваете в виртуальное поле нужное значение соответствующее активной записи. На click кнопки реализуете сохранение введенного пользователем значения в нужную таблицу или таблицы.

Визуально это будет выглядеть приблизительно так.

Конечно, этот способ тоже сложно назвать тривиальным, но по реализации все-таки реальней и после обновлений проблем однозначно будет меньше.

На мой взгляд, Вашу задачу можно решить проще.

1. Создаете представление (view) с нужными Вам данными.

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

3. Над реестром добавляете виртуальное поле и кнопку [OK]. В зависимости от перемещения по детали подтягиваете в виртуальное поле нужное значение соответствующее активной записи. На click кнопки реализуете сохранение введенного пользователем значения в нужную таблицу или таблицы.

Визуально это будет выглядеть приблизительно так.

Конечно, этот способ тоже сложно назвать тривиальным, но по реализации все-таки реальней и после обновлений проблем однозначно будет меньше.

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

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

Радчук Виталий Владимирович,

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

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

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

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

Привет всем !

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

нужно что то вроде:

Ответственному - (Логический тип), Время - (Дата/Время) 



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

Я так понимаю нужно сделать что то вроде ModalBox после чего передать параметры поля размер и т.д . Но как это сделать не знаю.

Если кто знает подскажите.

Нравится

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

Тут расписано как создать окно, в нем добавляете нужные вам атрибуты (столбцы) и задаете в diff их прорисовку.

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

Тут расписано как создать окно, в нем добавляете нужные вам атрибуты (столбцы) и задаете в diff их прорисовку.

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

Григорий Чех,

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

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

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

Нужно запустить БП по событию изменеия: изменение, удаление добавление дня рождения, мобильного телефона, email.

При стандартном "Сигнал" не отслеживает, хотя в таблице изменения вносит

Нравится

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

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

Для решения данной бизнес цели Вам необходимо учитывать что в bpm'online средства связи и знаменательные события это отдельные таблицы, в которые добавляются записи. И в данных таблицах указывается связь с записью контакта.

Необходимо отслеживать изменения записей в отдельных объектах

http://prntscr.com/l62dpt

http://prntscr.com/l62dsn

 

 

 

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