Подозреваю что должно выглядеть это как то так, но не получается:

 

$url = 'https://MYSITE.bpmonline.com/0/DataService/json/reply/UpdateQuery';

                $arr = [

                    'RootSchemaName' => "Contact",

                    'OperationType' => "Delete",

                    'ColumnValues' => [

                        'Items' => [

                            'Skype' => [

                                'ExpressionType' => 'Parameter',

                                'Parameter' => [

                                    'DataValueType' => 'Text',

                                    'Value' => 'skype_login_4'

                                ]

                            ]                

                        ]

                    ],

                    'Filters' => [

                        'RootSchemaName' => 'Contact',

                        'FilterType' => 'FilterGroup',

                        'Items' => [

                                'FilterByUsrMainMail' => [

                                    'FilterType' => 'CompareFilter',

                                    'ComparisonType' => 'Equal',

                                    'LeftExpression' => [

                                        'ExpressionType' => 'SchemaColumn',

                                        'ColumnPath' => 'UsrMainMail'

                                    ],

                                    'RightExpression' => [

                                        'ExpressionType' => 'Parameter',

                                        'Parameter' => [

                                            'DataValueType' => 'Text',

                                            'Value' => contactemail@example.com

                                        ]

                                    ]

                                ]

                        ]

                    ]

                ];

$this->crm_curl($url, $arr, 10);

Нравится

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

Добрый день.

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

{
   "QueryType":2,
   "Filters":{
      "FilterType":6,
      "ComparisonType":0,
      "Items":{
         "FilterByName":{
            "FilterType":1,
            "ComparisonType":3,
            "LogicalOperation":0,
            "LeftExpression":{
               "ExpressionType":0,
               "ColumnPath":"Number",
            },
            "RightExpression":{
               "ExpressionType":2,
               "Parameter":{
                  "DataValueType":1,
                  "Value":"Skup4",
               },
            },
         }
      },
   },
   "RootSchemaName":"ContactCommunication",
   "OperationType":0
}

удалит скайп "Skup4". И не забывайте про куки, и заголовки, более подробно на академии (запрос изменится для DataService) https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

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

Добрый день

методом POST добавляю строку в таблицу SysImage

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

{

    "Name": "Тестовая картинка"

    "Data": "X'23AB............ и так далее'"

}

{

    "Name": "Тестовая картинка"

    "Data": "binary'23AB............ и так далее'"

}

{

    "Name": "Тестовая картинка"

    "Data": "'23AB............ и так далее'"

}

а так же без одинарных кавычек

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

<?xml version="1.0" encoding="utf-8" standalone="yes"?>4An error occurred while processing this request.An error occurred while processing this request.System.Data.Services.DataServiceException   в System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)&#xD;

   в System.Data.Services.Serializers.Deserializer.HandlePutRequest()&#xD;

   в System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;

   в System.Data.Services.DataService`1.HandleRequest()A stream property was found in a JSON request payload. Stream properties are only supported in responses.Microsoft.Data.OData.ODataException   в Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadStreamPropertyValue()&#xD;

   в Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)&#xD;

   в Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)&#xD;

   в Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()&#xD;

   в Microsoft.Data.OData.ODataReaderCore.ReadImplementation()&#xD;

   в Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)&#xD;

   в System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)&#xD;

   в System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)&#xD;

   в System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)

Нравится

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

Возможно, стоит попробовать для загрузки использовать стандартный FileApiService. Тут описываются примеры работы с ним. Ещё есть ImageAPIService для картинок. Примеров по нему не видно, но сам интерфейс системы при работе с картинками должен работать через него, можно попробовать отловить запросы в Fiddler.

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

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

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

Эти процессы спокойно перенеслись через SVN на другие дев стенды и на QAS - и там начали работать по расписанию.

Но, когда перенесли наш пакет с помощью WorkspacecConsole, то на целевой среде они не запускаются по расписанию. Стартовые сигналы в таблице SysStartTimerInProcess появились, но триггеров в QRTZ_TRIGGERS нет.  Запускал вручную - они отлично отрабатывают, но далее по расписнию все равно не работают (триггеров по-прежнему нет).

В процессе установлена галка Повторять при пропуске.

Еще такой момент: на целевой среде, куда переносим пакет с помощью WsC - SalsesEnterprise, а на девах и QAS какая-то более сложна сборка с маркетингом и  сервисом. Версия везде 7.11.3.1175

 

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

Прикрепленные файлы

Нравится

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

Добрый день, Андрей!

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

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

Tsopa,

Добрый день. Что сделал:

  1. Выключил пул приложений
  2. Установил пакет с помощью WorkspaceConsole
  3. Почистил redis
  4. Включил пул 
  5. Убедился, что в QRTZ_TRIGGERS триггеров нет
  6. Залогинился и сделал Генерировать исходные коды для всех
  7. Сделал компилировать все
  8. После этого в QRTZ_TRIGGERS появились нужные трриггеры
Показать все комментарии

Перестали запускаться БП по таймеру. В логах вижу

2018-03-16 10:00:38,970 [BPMonlineQuartzScheduler_Worker-1] ERROR CP-BPM2\bpmadmin Terrasoft.Core.Scheduler.ProcessJobStub Execute - Cross-domain process launch for workspace "Default" ended abnormally

System.AppDomainUnloadedException: The application domain in which the thread was running has been unloaded.

Server stack trace: 

   at System.Threading.Thread.InternalCrossContextCallback(Context ctx, IntPtr ctxID, Int32 appDomainID, InternalCrossContextDelegate ftnToCall, Object[] args)

   at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)

   at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage reqMsg)

Exception rethrown at [0]: 

   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)

   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

   at Terrasoft.Core.Scheduler.ProcessJobProxy.Execute(IWebAppJob job, IJobExecutionContext context)

   at Terrasoft.Core.Scheduler.ProcessJobStub.Execute(IJobExecutionContext context)


 

Что это такое? Почему? И как с этим быть?

Нравится

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

Не помогает даже ребут сервера

2018-03-16 10:40:44,066 [9] INFO  CP-BPM2\bpmadmin Quartz.Core.QuartzScheduler Initialize - Scheduler meta-data: Quartz Scheduler (v2.3.2.0) 'BPMonlineQuartzScheduler' with instanceId 'auto'

  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.

  NOT STARTED.

  Currently in standby mode.

  Number of jobs executed: 0

  Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 5 threads.

  Using job-store 'Quartz.Impl.AdoJobStore.JobStoreTX' - which supports persistence. and is clustered.

 

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

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

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

Добрый день! 

Для работы с тикетной системой в нашей Компании (******) используются почтовые ящики - с них приходят заявки.  Были настроены следующие процессы:

1. Подключены почтовые ящики

2. Настроена система регистрации обращений из email

3. Настроены группы пользователей и доступы к почтовым ящикам

4 Настроены очереди и их наполнение из данных обращений (по принадлежности оператора группе)

5 Настроено единое окно в которое поступают обращения и из которого операторы работают с ними

 

Столкнулись со следующими проблемами:

1 актуализация вкладки "Единое окно" не происходит автоматически, по мере поступления новых обращений. При этом, все обращения поступают в раздел "Обращения" своевременно. 

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

 

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

 

Просим помочь.

Нравится

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

Добрый день!

отвечу на ваши вопросы по порядку:

1) Процесс наполнения очередей и Единого Окна запускается автоматически согласно времени указанному в системной настройке "Интервал обновления очередей единого окна" Рекомендую проверить данную настройку, 

Так же настройку - "Количество одновременно добавляемых записей в элементы очереди"

Так же если во время работы процесса наполнения очереди возникли ошибку Вы их увидите в "Журнале процессов". 

2) В очередь попадают записи раздела, которые соответствуют фильтру указанному при настройке/создании очереди. Таким образом, Вы можете перейти в раздел Обращения и построить в нем фильтр, который используется для очереди. В результате Вы увидите все записи, которые попадут в очередь. Если в этом случае появятся лишние записи, значить необходимо переделать фильтр.

Действительно помогло выставление параметров как описано в п.1. Спасибо

33SLONA пишет:

(******)

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

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

Спасибо за наблюдательность. 

33SLONA,

Будьте внимательней. Рекомендую изменить стандартный пароль: 

https://academy.terrasoft.ru/documents/sales-enterprise/7-11/stranica-p…;

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

Добрый день, коллеги! Нужно просуммировать значения DurationInMitutes активностей контакта и поместить значение в поле контакта, для этого, как написано в академии, можно присоединить схему, в нашем случае Activity, но почему то вы результат приходит пустой ответ. Я попробовал упростить задачу и просто вывести диалоговой окно с заголовками всех активностей без фильтров, результат тот же, пустые ответы по каждому элементу коллекции (пример кода ниже)... Интересно что при построении пути колонке в виде esq.addColumn("Activity.Title", "ActivityName"); выдает диалоговое окно со значениями undefinedundefinedundefined...., то есть значение каждого элемента коллекции undefined, подскажите в чем может быть проблема?

                var message= "";

                // Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].

                var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "Contact"

                });



                esq.addColumn("[Activity:Id:Owner].Title", "ActivityName");                



                esq.getEntityCollection(function (result) {

                    if (!result.success) {

                        // обработка/логирование ошибки, например

                        this.showInformationDialog("Ошибка запроса данных");

                        return;

                    }

                    result.collection.each(function (item) {

                        // Обработка элементов коллекции.

                        message += item.get("ActivityName");

                    });

                    this.showInformationDialog(message);

                }, this);

Нравится

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

Кочев Антон Сергеевич,

1. Вместо [Activity:Id:Owner] требуется писать [Activity:Owner:Id] (или [Activity:Owner]), т.к. на втором месте идет поле дочернего объекта по которому присоединяем, а на третьем поле текущего объекта.

2. У вас нет фильтра

Спасибо за совет! Сделал оба пункта - все равно пустые ответы, при этом если ставить вместо параметра CurrentContactId значение id контакта, то результаты приходят корректно... пробовал указывать тип данных фльтра Terrasoft.DataValueType.GUID, ничего не меняется, в чем может быть проблема?

                var CurrentContactId = this.get('Id');

                var message= "";

                var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "Contact"

                });

                esq.addColumn("[Activity:Owner:Id].Title", "ActivityName");

                var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, '[Activity:Owner:Id].Id', CurrentContactId);

                esq.filters.add("esqFirstFilter", esqFirstFilter);

                esq.getEntityCollection(function (result) {

                    if (!result.success) {

                        this.showInformationDialog("Ошибка запроса данных");

                        return;

                    }

                    result.collection.each(function (item) {

                        message += item.get("ActivityName");

                    });

                    this.showInformationDialog(message);

                }, this);

Антон,

Ваш фильтр:

esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, '[Activity:Owner:Id].Id', CurrentContactId);

Сравнивает Id активности и текущий Id сущности (предположительно контакт).

Вы же хотите сделать фильтр по контакту:

esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 'Id', CurrentContactId);

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

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

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

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

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

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

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

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

Нравится

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-е. Лучше кешировать.

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

Коллеги, здравствуйтей!



Возник вопрос по созданию древовидного выбора категории в объекте "продукты".

К примеру категория: "БАРНЫЕ АКСЕССУАРЫ И ТОВАРЫ ДЛЯ СЕРВИРОВКИ"  и подкатегория: "Зубочистки", только после чего выбирается тип "Зубочистки с логотипом", "Зубочистки без логотипа" итд.



Возможно ли это реализовать?

Нравится

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

Добрый день, Роман!

На сколько понял Вы хотите использовать две категории для одного и того же продукта. Для этого достаточно создать через мастер раздела еще одно справочное поле в карточке продукта на основании справочника "Категории продукта" (назвать, например, его "Категория 2"). После чего перейти к настройке каталога продукта, где верхнеуровневым сделать, например "Категория", потом "Категория 2", и после "Тип". Таким образом у Вас в каталоге будет отрабатывать фильтрация по двум категориям (хоть это и разные поля продукта по сути).

Если не совсем корректно интерпретировал Ваш запрос, то просьба более детально описать свой кейс.

Адасюк Валерий Викторович, не совсем верно. Я бы хотел реализовать в продуктах три справочника (дерево), на основе которых в правильной последовательности можно выбрать продукт. То есть изначально выбрать категорию, далее тип, а после этого только вид продукта. 

В таком случае начало аналогичное: через действие "Настроить каталог продуктов" настраиваем категорию и тип, а далее через действие "Настроить типы и фильтры продуктов" добавляем еще фильтрацию по полю продукта, выбрав поле "Вид" предварительно создав его (так как в базовой конфигурации такого поля нет). Таким образом получаем следующее.

 

Адасюк Валерий Викторович, да это получается :)

Но не совсем то, что наверно я имел в виду.

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



Вот как должно выглядеть дерево. Соответственно вид "лента в рулоне" мы не сможем выбрать в другом типе и категории.





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

Приветы,

 

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

на столбце где ссылка контакта "Петров И. А." - затем открывается страница редактирования этого контакта. Когда пользователь закрывает страницу редактирования то на странице (разделе/секции) контакты заново отрисовывается выбранная строка, вопрос: какое событие возникает, как этот факт обработать? 

 

Где-нибудь есть полный список событий и типовые примеры как их обрабатывать? Хотя бы сигнатуры.

Нравится

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

Добрый день!

Много событий описаны в академии, но очень разбросаны по статьям. А консолидирвоанного списка - нет.

Еще вариант - это в Chrome Developer Tools просмотреть исходный код прямо на странице. Так как он прокоментирован можно разобраться какой метод чем занимается. Плюс ко всему вы можете использовать там CallStack чтобы отследить вызовы методов. Ну или посмотреть исходники тут:

https://academy.terrasoft.ua/documents/technic-sdk/7-11/javascript-api-klientskoy-chasti-yadra-platformy

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

Золотарев Артем Андреевич,

Спасибо. Но примеров там нет или почти нет. 

"Много событий описаны в академии, но очень разбросаны по статьям. А консолидированного списка - нет." (Вот что-то открыл - https://academy.terrasoft.ru/api/jscoreapi/7.11.3/?_ga=2.110357765.1829… )

Их для роботов (гугла, яндекса) писали? Или для людей, как так... 

Приходится лазить в исходниках, но, зачем, я же не в Террасофте работаю.

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

Напишите книгу, чтобы ее можно было читать, с "консолидированными данными". Хороший образец MSDN :) Думаете часто приходится лезть в исходники asp.net?

Притом ответы с академии от ребят у которых другая версия (из предыдущих) не работают. (У нас 7.11.3 ентерпрайз сейлз) приемственности нет...

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