Два вопроса по версионности процессов:

1. Перенос. Достаточно ли просто перенести с дева новые версии через импорт-экспорт, сгенерировать исходные коды и сделать "компилировать всё"? И всё заработает.

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

3. Интересная штука. Когда я "сохранил как новую версию" у меня у старого процесса осталась галочка "актуальная версия", а у нового не проставилась. Как это все будет происходить при переносе?

Нравится

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

О версионности есть статья.

1. Да.

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

3. Видимо, выбрали не тот ответ на вопрос «Установить текущую версию процесса актуальной?» при сохранении. В любом случае, актуальную версию можно выбрать в интерфейсе карточки свойств процесса.

Статью читал, но внутренний параноик параноид :)

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

Не спрашивает, если предыдущая версия ни разу не запускалась.

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

Добрый день.

Для реализации WS воспользовался статьей https://community.terrasoft.ru/questions/polucit-wsdl-konfiguracionnogo-web-servisa

Но там ничего не сказано про заголовок bpmcsrf. 

Есть простой пример как передать soap header, что настроить?

Нравится

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

Информация по настройке системы для  защиты от CSRF-атак есть тут.

Как передавать soap header, обсуждалось тут и тут.

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

Информация по настройке системы для  защиты от CSRF-атак есть тут.

Как передавать soap header, обсуждалось тут и тут.

Мой soap сервис доступен только после авторизации(authservice), поэтому я сгенерил wsdl локально в сборку dll, чтобы можно было вызывать через конс. приложение и не использую как Service Reference. 

Но у меня не получается создать экз. класса  var postRequest1 = new ICLIntegrationAISPTPPServiceClient();

Доступен только ICLIntegrationAISPTPPService.

1) Почему?

2) Что указывать в namespace ? сейчас указал как в примере.

Код класса заголовка ниже.

namespace ICLIntegrationAISPTPPService

{

    using System.ServiceModel.Channels;

    using System.Xml;

    using System.Xml.Serialization;

    public class MyHeader : MessageHeader

    {

        private readonly UsernameToken _usernameToken;

        public MyHeader(string csrfToken)

        {

            _usernameToken = new UsernameToken(string.Empty, csrfToken);

        }

        public MyHeader(string id, string csrfToken)

        {

            _usernameToken = new UsernameToken(id, csrfToken);

        }

        public override string Name

        {

            get { return "BPMCSRF"; }

        }

        public override string Namespace

        {

            get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sece…"; }

        }

        protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)

        {

            XmlSerializer serializer = new XmlSerializer(typeof(UsernameToken));

            serializer.Serialize(writer, _usernameToken);

        }

    }

    [XmlRoot(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sece…")]

    public class UsernameToken

    {

        public UsernameToken()

        {

        }

        public UsernameToken(string id, string csrfToken)

        {

            Id = id;

            CsrfToken = csrfToken;

        }

        [XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-util…")]

        public string Id { get; set; }

        [XmlElement]

        public string CsrfToken { get; set; }

    }

Также Прикладываю код интерфейса.

using System.Collections.Generic;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Web.Services.Protocols;

namespace ICLIntegrationAISPTPPService

{

    [ServiceContract]

    public interface IService

    {

        [OperationContract]

        GetNewTCRequestListResponse GetNewTCRequestList();

}}

[DataContract]

    public class GetNewTCRequestListResponse

    {

        private List<string> id = new List<string>();

        [DataMember]

        public List<string> result

        {

            get { return id; }

            set { id = value; }

        }

    }

 

В академии есть готовые примеры клиентских C#-программ, работающих с веб-сервисом.

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

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

https://community.terrasoft.ru/questions/polucit-wsdl-konfiguracionnogo…;

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

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

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

Добрый день.

Необходимо заменить по всей системе термин Контрагент на Компания.

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

Может есть готовые скрипты с массовым переводом?

Нравится

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

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

Так что, лучше продать идею использовать термин "Контрагенты"

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

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

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

Здравствуйте. Спасибо за информацию. Не думал, что все так сложно (

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

1. Найти и переименовать соответствующие строки в схемах SysSchema, SysModule, QuickAddMenuItem, SysEntitySchemaReference. Тут обычно все без склонений. Нужно ориентироваться на название и заголовок (Контрагенты и Account соответственно).

2. Найти все нужные строки в схеме: SysLocalizableValue и заменить на новые. Тут есть ряд особенностей: нужно использовать регулярные выражения, чтобы охватить все склонения слов. Более того, иногда нужно учитывать исключительные случаи, когда окончания слов склоняются совсем по разному. Для этого мы расписывали склонения нового термина (привет 6 класс школы) и на основании этих данных составляли SQL скрипт с регулярными выражениями.

Удобно, если есть on-site песочница с доступом к БД. В случае с on-demand всё будет делаться "в слепую" и очень легко ошибиться.

Как все это накладывается на обновления системы я, к сожалению, не в курсе.

 

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

Добрый день!

При разработке добавление файлы и связи столкнулся с проблемой, которая не отображает файлы, добавленную на страницу.Ниже скриншот ошибки. Деталь унаследовал от FileDetailV2. Объект создал унаследованные Файлы и связи база знаний. В таблице Sysdetail и SysModuleEntity, SysModuleEdit добавил записи по объектам. Можете подсказать что я упустил, так как если посмотреть в БД таблицу, то оно заполняется данными.

 

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

 

Нравится

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

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

/**

             * Initializes parent entity.

             */

            initParentEntity: function() {

                this.parentEntity = {};

                var entitySchemaName = this.entitySchema.name;

                var parentSchemaName = entitySchemaName.replace("File", "");

                var masterRecordId = this.get("MasterRecordId");

                this.parentEntity.EntityName = parentSchemaName;

                this.parentEntity.RecordId = masterRecordId;

            },

 var parentSchemaName = entitySchemaName.replace("File", "");

 

Зачем на название объекта завязывать parentSchemaName? Это же вообщее низкий уровень программирование. 

 

 

Добрый день!

В приложении присутствует своя базовая логика (от части в приложении используется DSL -

https://en.wikipedia.org/wiki/Domain-specific_language) и если Вы используйте свои методы реализации, то будьте готовы, что при возникновении ошибок необходимо будет проводить отладку кода.

В статье https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-detali-fayly-i-ssylki описан алгоритм добавления данных и там говориться, что должен использоваться объект [Название объекта раздела]File.

В статье https://academy.terrasoft.ru/documents/technic-sdk/7-12/sozdanie-novogo-razdela описаны как должны называться объекты.

Также Вы можете воспользоваться базовым функционалом – Мастер раздела для создания всех необходимых объектов и привязок на уровне БД.

Мы зафиксировали данное поведение, чтобы в будущем аналитики продукта пересмотрели логику.

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

Добрый день.

Нашли две ссылки на инструкции, которые отличаются довольно сильно:

https://academy.terrasoft.ru/documents/administration/7-12/nastroyka-gl…

https://academy.terrasoft.ru/documents/common/7-12/ustanovka-servisa-gl…

Начали настройку через docker. Хотелось бы получить подтверждение, что это рабочий вариант.

Также в ходе установки возникла ошибка при выполнении команды addSearch. Пишет что не может подключиться к серверу. При этом контейнеры es рабочие (проверено через docker ps -a). Через telnet можно подключиться к серверу по порту 9200. Причина ошибки непонятна.  Согласно инструкции в default-env в параметре GS_ES_URL нужно указывать IP-адрес сервера, на котором развернут docker (в нашем варианты все компоненты, Elastic, RabbitMQ, MySQL развернуты через docker). Так и настроено, но выдается ошибка при addSearch.

Нравится

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

Добрый день!



Для версии 7.11.2 и выше настройка выполняется через docker. Если проблема всё ещё сохраняется, создайте обращение в техническую поддержку. 

Как решили проблему?

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

Как можно реализовать правила поиска дублей для пользовательского раздела?

Нравится

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

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



1. Создать процесс для поиска записей в своем разделе (аналогично процессу StartGlobalContactDuplicatesSearch).

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

3. Процедура будет записывать данные в созданный Вами объект MyObjectDuplicates (создайте объект по аналогии с объектом ContactDuplicate)

4. Необходимо создать новую страницу редактирования, которая будет отображать данные из созданного объекта MyObjectDuplicates по аналогии со страницей DuplicatesPageV2 (либо заместите DuplicatesPageV2, добавив в нее нужную логику).

 

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



1. Создать процесс для поиска записей в своем разделе (аналогично процессу StartGlobalContactDuplicatesSearch).

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

3. Процедура будет записывать данные в созданный Вами объект MyObjectDuplicates (создайте объект по аналогии с объектом ContactDuplicate)

4. Необходимо создать новую страницу редактирования, которая будет отображать данные из созданного объекта MyObjectDuplicates по аналогии со страницей DuplicatesPageV2 (либо заместите DuplicatesPageV2, добавив в нее нужную логику).

 

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

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

BPM Online 7.12

СУБД Oracle 11g

Проблема в том, что большинство инструкций относятся к MS SQL. В Oracle просто не вижу большинство указанных хранимых процедур. Плюс просто не вижу раздела "Правила поиска дубликатов" в Дизайнере системы. Не вижу в БД процедур типа "tsp_FindAccountDuplicateByName", процедура tsp_FindAccountSimilarRecords есть, но там пустышка.

Если я правильно понял, то глобальный поиск дубликатов пока недоступен для Oracle. Нужно хотя бы настроить локальный поиск дубликатов. 

Изменение пакета tspkg_DuplicatesSearch (функции fn_GetAccountDuplicates и процедуры tsp_SearchForAccountDuplicates) результата не дало. 

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

Нравится

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

Проверка на дубли при сохранении через миникарточку появилась в 7.12.3. В версии 7.12.3 появился поиск дублей на основании правил для Oracle. В будущих релизах планируется массовая дедупликация для данной СУБД + пользовательская настройка правил + уже можно технически с версии 7.12.3 для новой дедупликации добавить новое правило. Инструкция тут.

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

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

Спасибо за информацию. Один уточняющий вопрос. У нас на DEV не настроен GlobalSearch (BPM развернут on-site). Однако дедубликация по name срабатывает. Как это может быть?

Видимо, это предыдущая версия, без глобального поиска. Новый то добавили только в 7.12.3:

Для БД Oracle, появилась возможность поиска дублей лидов, а также локального поиска дублей контактов и контрагентов при сохранении. Базовый набор правил поиска можно включать по ссылке “Правила поиска дублей” в дизайнере системы. Для работы поиска дублей на Oracle необходимо настроить глобальный поиск и включить функциональность “ESDeduplication”.

Добрый день. Апдейт на 7.12.3 провели. Global Serach и ESDeduplication включили, правило новое настроили. Видим, что оно работает корректно в миникарточке.

НО при сохранении/изменении в обычной карточке поиск дублей не происходит. Этот функционал для Oracle еще не реализован?

P.S. Стандартные правила также не работают при сохранении/изменении через основную карточку.

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

Понятно. Спасибо

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

Добрый день!

Необходимо настроить интеграцию BPM Online 7.12 с контакт-центром Avaya через TSAPI-протокол.

Вопрос: нужны ли дополнительные дистрибутивы? Где можно посмотреть примеры настройки? Нужна именно интеграция через TSAPI без DMCC.

Заранее благодарю!

Нравится

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

Для интеграции нужно покупать bpm’online avaya connector. Также ставится сервис сообщений bpm’online Messaging Service. Вот инструкция по их настройке. Интеграция работает только по DMCC.

Добрый день. Согласно информации от Terrasoft использование протокола DMCC опционально. Уверили, что достаточно TSAPI. Лицензии на Avaya коннектор получены и установлены. BPM Online Messaging Service установлен и настроен согласно инструкции. Однако при открытии cti-панели выдает: "Отсутствует подключение к серверу телефонии. Возможно, не настроены параметры соединения или сервер телефонии недоступен."

Асылан, не опционально:

Сервис сообщений позволяет соединить bpm’online c телефонией, подключаясь по интеграционному протоколу DMCC. NET API к Avaya и распределяя события о звонках между пользователями bpm’online.

Игорь, Terrasoft 3.X умеет интегрироваться с телефониями Oktell, Infinity, Webitel и с АТС, поддерживающими стандарт TAPI (универсальный, подходит к разным АТС, но менее функциональный, чем специализированные в списке). Вероятно, для Avaya используется он.

Логика работы с телефонией, смены статуса и прочее реализовано в скриптах scr_CallClientUtils, scr_TAPIClientUtils и scr_TAPIUtils. Первый — общий для разных телефоний, два других — для этого коннектора. Последний скрипт доступен для чтения и правки только при наличии лицензии на нужную телефонию в 3.Х.

Инструкцию к функциональности телефонии можно скачать тут.

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

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

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

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

Нравится

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

Добрый день!

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

хотя при записи результата текст разбивался на абзацы.

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

Нравится

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

Посмотрел в базе, сообщения ленты хранятся в таблице SocialMessage в поле Message в таком формате:

&lt;p&gt;строка 1&lt;/p&gt; &lt;div&gt;строка 2&lt;/div&gt; &lt;div&gt;строка 3&lt;/div&gt;

Видимо, при добавлении программно нужно имитировать этот формат.

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

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