Неистово глючит стартовый таймер. Уже нашел, что он не работает в компилируемом процессе.

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

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

Что с этим можно сделать?

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

Нравится

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

Алексей, здравствуйте!

Запуск компилируемых процессов по стартовому таймеру реализован в версии 7.11.3 и выше.

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

Для версии 7.11.2 Вы можете при необходимости в элементе Задание-сценарий в расширенных настройках снять признак Для интерпретируемого процесса, снять признак Компилируемого процесса и выполнить деактивацию\активацию процесса. При этом будет пересоздан триггер для процесса.

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

Логвин Андрей Витальевич,

За 2 абзац спасибо, не знал.

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

Есть хеш логотипа компании. Пробую вывести изображение на сайте по URL https://epo.bpmonline.com/0/img/entity/hash/SysImage/Data/MYHASH, но там 401 ошибка (доступ запрещен). Как можно этот доступ разрешить? Или может есть другой способ вывести лого компании на сайта?

Нравится

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

Возможно, будет достаточно просто сначала залогиниться на сайте bpm'online через веб-форму логина. Если после этого по URL грузится нужное изображение, то стоит в серверной логике Вашего сайта логиниться программно через AuthService и далее работать с выданной кукой.

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

Вообще, каждый раз тянуть из bpm'online картинки для сайта, доступного извне — плохая идея, потенциальная уязвимость при DDOS-е. Лучше кешировать.

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

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

При создании бизнес-процесса в поле даты можно проставить "Текущее значение даты и времени" (см. скриншот).

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

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

Не хотелось бы использовать new Date() для некоторых задач - т.к. в этом случае значение времени берётся с компьютера пользователя, где оно может быть указано неверно.

Нравится

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

я так полагаю это DateTime.Now (или UtcNow. Тут я не уверен. Процентов на 80 - просто Now. Соответственно устанавливается часовой пояс сервера); В базу переносится всё в Utc. На клиенте берётся время конкретной машины.

Для того чтобы вытащить серверное время скорее всего придётся пилить маленький сервис(если это уже не сделано).



PS. тру-стори: когда только знакомился с платформой нашли с клиентом баг. Суть такая — на пк отставали часы и при сохранении записи createdOn было 15.00 (время сервера), потом запись тут же правилась и пересохранялась. ModifiedOn - 14.59(время клиента). Полезли разбираться во взаимосвязях: Время пк/Часовой пояс пк <-> Настройка часового пояса в террасофте <-> время сервера/часовой пояс сервера <-> время базы . Вся эпопея кончилась тем, что саппорт выдал фикс и исправил конфигурацию, но с того времени у нас поговорка:

"Если что-то не работает:

1) проблема в вас

2) проблема со временем

3) проблема в террасофте

4) см. п 1."



И да... лучше не ввязываться в эту помойку со временем)) Я и сейчас не уверен на 100% как там что берётся.

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

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

Если нужно получить в процессе серверное время, Вы можете воспользоваться Datetime.UtcNow.

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

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

Добрый день

 

есть необходимость отобрать средства связи контрагента (справочник AccountCommunucation) с отбором по контрагенту.

У меня есть значение ГУИД этого контрагента, но метод GET не отрабатывает при попытке наложить фильтр на поле Account, т.к. оно имеет тип "справочник"

Я пробовал накладывать отбор как на Account так и на AccountId.

например я пробовал следующие конструкции:

AccountCommunicationCollection?$filter=substringof('ИдентификаторBPM', AccountId)

AccountCommunicationCollection?$filter=substringof('ИдентификаторBPM', Account)

AccountCommunicationCollection?$filter=AccountId eq guid 'ИдентификаторBPM'

AccountCommunicationCollection?$filter=Account eq guid 'ИдентификаторBPM'

Но каждый раз я получаю ошибку при вызове GET

 

 

Нравится

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

Добрый день!

Вы почти пришли к ответу =)

Попробуйте такой запрос:

AccountCommunicationCollection?$filter=Account/Id eq guid'идентификатор'

Большое спасибо, получилось

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

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

Хотел уточнить есть ли возможность загрузки фото сотрудников в bpm'online sales enterprise при синхронизации с каталогами LDAP?

Нравится

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

Здравствуйте, Роман

На данный момент в механизме синхронизации с LDAP нет возможности синхронизации фото сотрудников с приложением bpmonline.

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

Denys Diachenko, Денис спасибо! 

Может есть другие методы решения этого вопроса или все-таки придётся добавлять фото вручную? 

Роман Никулин,

на данный момент в приложении нет возможности решить такую задачу базовыми средствами приложения и также мы не имеем примеров решения такой задачи. Как обходные решения, могу Вам предложить либо ручное обновление записей либо Вы можете самостоятельно доработать функционал синхронизации с LDAP используя нашу документацию по разработке по ссылке https://academy.terrasoft.ru/documents/technic-sdk/7-11/dokumentaciya-p…

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

В CRM есть возможность в "Средствах связи" добавлять любое количество полей с одним названием. Например можно добавить сколько угодно Email. Может кто-нибудь знает как при создании Контакта добавить несколько Email?

Вот что я передаю:

            $arr = [

                'RootSchemaName' => "Contact",

                'OperationType' => "Insert",

                'ColumnValues' => [

                    'Items' => [

                        'Name' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Text',

                                'Value' => $Name

                            ]

                        ],

                        'UsrMainMail' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Text',

                                'Value' => $UsrMainMail

                            ]

                        ],

                        'Gender' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Guid',

                                'Value' => $Gender

                            ]

                        ],

                        'Skype' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Text',

                                'Value' => $Skype

                            ]

                        ],        

                        'MobilePhone' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Text',

                                'Value' => $MobilePhone

                            ]

                        ],        

                        'Phone' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Text',

                                'Value' => $Phone

                            ]

                        ],

                        'Email' => [

                            'ExpressionType' => 'Parameter',

                            'Parameter' => [

                                'DataValueType' => 'Text',

                                'Value' => $Email

                            ]                        

                        ],                    

                    ]

                ]

            ];        

Нравится

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

mlmvn

Деталь "Средства связи" на странице контакта = Объект "Средство связи контакта" = Таблица "ContactCommunication".

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

Толмачев Дмитрий Юрьевич,

Спасибо!!

 

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

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

Имел ли кто дело с реализацией анонимной аутентификации внешних запросов, например, к написанному Вами web-сервису по аналогии с сервисом оценок обращений?

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

Нравится

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

Добрый день, Михаил.

Этот функционал разработан для продукта Service, соответственно требует наличия этого продукта в Вашей системе. Инструкция по настройке веб-сервисов, доступных без авторизации:

 

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

  • в WebApp\ServiceModel зарегистрировать веб-сервис, в котором будет указан путь к конфигурационному веб-сервису. Например, <Название сервиса>.svc, с содержимым:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.<Название сервиса>" %>
  • в WebApp\Web.config добавить:
<location path="ServiceModel/<Название сервиса>.svc">
  <system.web>
    <authorization>
      <allow users="*" />
    </authorization>
    </system.web>
</location>
  • в WebApp\Web.config секции appSettings изменить значение ключа AllowedLocations. В значение добавить:
ServiceModel/<Название сервиса>.svc
  • в конфигурации реализовать веб-сервис. Например:
namespace Terrasoft.Configuration 
{
         using System;
         using System.Runtime.Serialization;
         using System.ServiceModel;
         using System.ServiceModel.Activation;
         using System.ServiceModel.Web;
         using System.Web;
         using Terrasoft.Core;
         using Terrasoft.Web.Common;

 
         [ServiceContract]
         [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
         public class ConfigurationService : BaseService
         {

 
                 private SystemUserConnection _systemUserConnection;
                 private SystemUserConnection SystemUserConnection {
                          get {
                                   return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
                          }
                 }

 
                 [OperationContract]
                 [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Post() {
                 }

 
                 [OperationContract]
                 [WebGet(RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Get() {
                 }
         }
}
  • в WebApp\ServiceModel\http|https\services.config добавить:
<service name="Terrasoft.Configuration.<Название сервиса>">
  <endpoint name="<Название сервиса>EndPoint"
    address="" 
    binding="webHttpBinding"
    behaviorConfiguration="RestServiceBehavior"
    bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
    contract="Terrasoft.Configuration.<Название сервиса>" />
</service>

Сервис будет доступен по адресу WebApp/<Номер конфигурации>/ServiceModel/<Название веб-сервиса>.svc/<Название веб-метода>

Т.к. пользователь не авторизирован, то UserConnection не будет проинициализирован (Session["UserConnection"] == null).

 

Добрый день! 

Настроил анонимный веб-сервис по инструкции. С авторизованным пользователем отрабатывает, а без авторизации сервер возвращает 302. Кто нибудь сталкивался с такой проблемой?

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

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

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

 

Ну и наоборот, в БП элементе вызова веб-сервиса есть лимит на длину названия в поле Code в методе вызова внешнего веб-сервиса, со слишком длинным сохранить нельзя.

 

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

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

Добавил несколько категорий активностей и заполнил им поле описание. Потом решил поменять им поле описание для большей информативности и я вижу, что оно отображается как будто поменялось, но в базе старые значения. Это как???!!!

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

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

Нравится

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

Алексей, здравствуйте!

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

Если у Вас значения полей в приложении и в БД все же отличаются, напишите о проблеме на support@terrasoft.ru для более детального анализа (необходим будет доступ к БД и к приложению).

Одеяненко Юлия, я сервер перезагрузил - оно так и осталось!

Алексей, в таком случае необходим более детальный анализ кейса. Напишите о проблеме на support@terrasoft.ru, необходим будет доступ к БД и к приложению

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

 Добрый день!

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

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

 

//Метод-обработчик нажатия кнопки завершить
				doneActivityClick: function(){
					var activeRow = this.get("ActiveRow");
				if (activeRow) {
					var cOwnerId = $("#ActivityPageV2OwnerLookupEdit-link-el").attr('href').split('ViewModule.aspx#CardModuleV2/ContactPageV2/edit/')[1].toUpperCase();
					var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "Activity"
					});
					esq.addColumn("Opportunity.Owner.Id","OpportunityOwnerId");
					esq.addColumn("Opportunity.UsrSaleAgreemAmountPlan", "OpportunityCountAgreem");
					esq.addColumn("Opportunity.UsrSalePriseSum","OpportunityPriseSum");
					esq.addColumn("Opportunity.UsrObjCountPlan","UsrObjCountPlan");
					esq.getEntity(activeRow, function(result) {
										if (!result.success) {
										// обработка/логирование ошибки, например
										this.showInformationDialog("Ошибка запроса данных");
										return;
										}
										var oSumPrise = result.entity.get("OpportunityPriseSum");
										var oOwnerId = result.entity.get("OpportunityOwnerId");
										var oCountAgreem = result.entity.get("OpportunityCountAgreem");
										var oCountObj =result.entity.get("UsrObjCountPlan");
										var mesSumPrise= (oSumPrise<=0)?"Планируемая премия\n":"";
										var mesCountAgreem=(oCountAgreem<=0)?"Планируемое количество договоров\n":"";
										var mesCountOdj= (oCountObj<=0)?"Количество объектов\n":"";
										if (cOwnerId!=oOwnerId.toUpperCase()) {
											this.showInformationDialog("Ответственный по задаче отличается от ответственного по активности");
										}
										else{
											if (oCountAgreem<=0 || oSumPrise<=0|| oCountObj<=0){
												this.showInformationDialog("Заполните поля в продаже:\n"+mesSumPrise+mesCountAgreem+mesCountOdj);
											}
											//завершение задачи
											else{
												var newStatus ={
													displayValue: "Завершена",
													value: "4BDBB88F-58E6-DF11-971B-001D60E938C6"
												};
												var newResult ={
													displayValue: "Реализовано",
													value: "BB360D72-1AD7-4BBC-BADC-AABC0E334A74"
												};
											// как установить в данные поля значения?
												this.set("Status", newStatus);
												this.set("Result", newResult );
												this.set("ButtonEnabled", false);
 
											//сохраняем все изменения
											var cardModuleSandboxId = this.getCardModuleSandboxId();
											var resultMes =	this.sandbox.publish("OnCardAction", "save", [cardModuleSandboxId]);
 
											}
										}
				},this);
 
				}//if(activeRow)
 
				}

 

Нравится

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

Добрый день, Владислав!

Используя this.set() отобразить изменения сразу, Вы можете проверить это добавив обработчик кнопки в котором без проверок измените значения полей, в результате при нажатии на кнопку изменения сразу отобразятся. 

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

Потому, рекомендую передать внешний скоуп используя bind:

...
esq.getEntity(activeRow, function(result) {
...
				}.bind(this));
...

 

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

В БП-ах есть компонент привязки объекта к БП. Как им грамотно воспользоваться?

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

Как мне организовать эту деталь? Что будет masterColumn, а что detailColumn?

Нравится

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

Алексей, добрый день!

При привязке к процессу выполняется добавление записи в объект "Объект в процессе" (SysProcessEntity). При необходимости вывести связанные процессы для раздела нужно

- Создать деталь, указав в качестве объекта Объект в процессе

- Вывести данную деталь на страницу редактирования записи, указав связь Колонка детали.Объект = Колонка объекта.id

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