Добрый день, коллеги! При добавлении контактов в динамическую группу фильтр сохраняется в ContactFolder в поле SearchData. На фронте для получения данных по этому фильтру есть метод Terrasoft.deserialize
Добрый день. У нас приобретено bpmonline ITIL service on-site - 5 (количество лицензий для сотрудников компании).
Какое количество пользователей портала может пользоваться порталом? Какие это лицензии: конкурентные или нет?
Добрый день, подскажите, пожалуйста, можно ли сделать активную ссылку в списке менеджеров(как при выборе во всплывающем окне, но должен оставаться именно списком), чтобы при нажатие на неё происходил переход в карточку менеджера? И можно ли сделать так, чтобы у менеджера отображалось к каким сделкам привязан этот сотрудник (за какие активности ответственен)?
Мария, при использования элемента "Список" - можно открывать карточку контакта. А на страницу самой карточки добавить деталь, которая и свяжет его со сделками.
В лиде есть деталь. Деталь стандартная, при нажатии на "+" открывается карточка создания.
задача состоит в том, чтобы из детали можно было открыть карточку редактирования по ссылке,а не через выбор пункта "изменить". например, как сделано с деталью Контакты в контрагенте. Делаю по аналогии, но у меня не работает. также в детали выведено поле UsrName и при клике на него нужно открыть объект UsrStructure.
есть особенность -объект детали был создан через конфигурацию,а не через мастер разделов. но у него есть страница редактирования,которая настраивается через деталь.
пробовала и через linkClicked и через on[ColumnName]LinkClick. первый вообще не вызывается. Второй тоже, но для него я знаю почему - так как в Terrasoft.configuration.ModuleStructure нет моей сущности.
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];
подскажите, пожалуйста, как я могу реализовать эту задачу?
"Zaitova Liubov" написал:подскажите, пожалуйста, как я могу реализовать эту задачу?
Можно поковыряться в GridUtilitiesV2, метод addColumnLink. Метод вызывается при формировании любого грида, ссылку можно сделать принудительно, для конкретной детали
подскажите, пожалуйста, как я могу реализовать эту задачу?
Можно поковыряться в GridUtilitiesV2, метод addColumnLink. Метод вызывается при формировании любого грида, ссылку можно сделать принудительно, для конкретной детали
я рассматривала метод addColumnLink. в нем есть следующая строка
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];
но моей сущности нет в этой коллекции Terrasoft.configuration.ModuleStructure, потому что я создавала ее через конфигурацию,а не через мастер.
Шаг 1: Нафиг выкинуть все методы террасофта
Шаг 2: Костыли. Я к примеру хочу в детали адрес контрагента лепить ссылку на поле "адрес":
addColumnLink: function(item, column){
var columnPath = column.columnPath;
var onColumnLinkClickName ="on"+ columnPath +"LinkClick";
var profileColumns =this.getProfileColumns();
var profileColumn = profileColumns[columnPath];
var isProfiledLinkColumn =
profileColumn &&(profileColumn.type=== Terrasoft.GridCellType.LINK);
var isLinkColumn =this.getIsLinkColumn(this.getGridEntitySchema(), column);if((isProfiledLinkColumn || isLinkColumn)&&!this.getIsEditable()){
var referenceSchemaName = column.referenceSchemaName;
var schemaConfig = Terrasoft.configuration.ModuleStructure[referenceSchemaName];
var scope =this;if(column.isLookup&& schemaConfig){
item[onColumnLinkClickName]= function(){
var record =this.get(columnPath);if(!record){return"";}
var recordId = record.value;if(!recordId){return"";}return scope.createLink.call(this, referenceSchemaName, columnPath,
record.displayValue, recordId);};}else{
var columnIdName = item.primaryColumnName;
var entitySchemaName =this.getGridEntitySchemaName();
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];if(entitySchemaConfig){
item[onColumnLinkClickName]= function(){
var recordId =this.get(columnIdName);if(!recordId){return"";}
var displayValue =this.get(columnPath);if(scope.Ext.isEmpty(displayValue)){return"";}
var link =
LinkColumnHelper.createLink(entitySchemaName, columnPath, displayValue, recordId);return link || scope.createLink.call(this, entitySchemaName, columnPath,
displayValue, recordId);};}}}/**КОСТЫЛИ**/if(columnPath ==="Address"){
var scope =this;
var columnIdName = item.primaryColumnName;
var entitySchemaName =this.getGridEntitySchemaName();
item[onColumnLinkClickName]= function(){
var recordId = item.get("Id");if(!recordId){return"";}
var displayValue = item.get("Address");if(scope.Ext.isEmpty(displayValue)){return"";}
var editPageName ="AccountAddressPageV2";
var link = Terrasoft.workspaceBaseUrl+"/Nui/ViewModule.aspx#CardModuleV2/"+editPageName+"/edit/"+recordId;return{
caption: displayValue,
target:"_self",
title: displayValue,
url: link
};};}if(Ext.isEmpty(item[onColumnLinkClickName])){
item[onColumnLinkClickName]= function(){return(item.getLinkColumnConfig? item.getLinkColumnConfig(column): null);};}
В дополнение, у меня возникла проблема возврата в ту вкладку, из которой вызывалась страница. В addColumnLink сформировал ссылку. Переход происходит, но при нажатии на странице "Закрыть" возврат на первую вкладку, а вызов происходит из второй. Те же ссылки стандартные, например, "Контрагент" переходят и возвращаются корректно. Что упустил - понять не могу.
"Лапшин Павел Александрович" написал:Переход происходит, но при нажатии на странице "Закрыть" возврат на первую вкладку, а вызов происходит из второй.
Надо разбираться с HistoryState и браузерной строкой. Иногда при переходе по страницам bpm-ка не меняет путь и вот фиг знает, если честно, как система отреагирует на закрытие карточек(PushBackHistoryState событие). Надо тестить)
Попытка разобраться с штатной деталью "Связи" чтобы добавить туда новое, собственное поле, например в Активностях. Расследование работы этой детали:
1) Было определено, что данная деталь работает со специализированными объектами (таблицами): EntityConnection
в ней непосредственно содержатся записи, которые вкратце, описывают связь сущности c ее зависимостями представленными в виде реплики на некий ColumnUId
который в свою очередь представлен так же в SysEntitySchemaReference
более сложном объекте который в сути и описывает предположительно связи объектов через справочные поля, в частности: ColumnUId - собственно поле для связи с EntityConnection, хотя в EntityConnection колонка не является ссылкой (FK) что весьма странно, в любом случае других упоминаний ColumnUId найти не удалось. ColumnName - видимо имя колонки в целевом объекте с которым устанавливается связь ColumnCaption - видимо заголовок который будет указан для связи в детали ReferenceSchemaId - это Id из SysSchema, и судя из названия мы как раз тут указываем идентификатор схемы из которой брать поле указанное в ColumnName SysSchemaId - это тоже Id из SysSchema, и судя по всему оно отражает всё таки к какой сущности принадлежит связь, в нашем случае - то же самое содержится и в самом EntityConnection, но данная таблица судя по всему используется в нескольких механизмах, в т.ч. по-моему и при "сложной настройке колонок" через связи.
2) Изучен исходный код детали и ее зависимостей в частности нас интересует схема EntityConnectionLinksUtilities, а именно вот этот фрагмент:
в котором esq-запросом получаются данные из вышеописанного объекта EntityConnection с некоторыми присоединениями, это так сказать "отправная точка", т.к. вся дальнейшая логика развивается на основе полученных данных.
Вот...
Устанавливаем 2 точки останова, собственно на сам вызов ESQ, чтобы посмотреть что он из себя представляет. Изучаем его и собственно вот его краткая полетная характеристика:
Встал вопрос:
В результирующем объекта такого вот ESQ-запроса, мы наблюдаем результаты вот с такой занимательной структурой
в которой однозначно содержатся данные, которые не запрашивались, по крайней мере явным образом через ESQ
Происхождение объекта ReferenceSchema
было обнаружено в некоем обработчике "createviewmodel"
(я так понимаю это механизм предварительной работы с выборкой до возвращения ее в коллбэк ESQ-запроса)
и вот здесь собственно дальнейшее изучение механизма работы обламывается, т.к. вызовы методов используемые здесь ведут преимущественно в all-combined.js который даже в Pretty print читается очень сложно.
в конечном итоге становится понятно что каким-то "волшебством"
мы получаем массив полей целевой схемы, и уникальными идентификаторами колонок в ней
скорее всего эти ColumnUId и определяются в SysEntitySchemaReference, как часть жизненного цикла формирования объекта и справочных полей в ней создается запись для каждого поля.
В конечном итоге, чтобы расширить "Связи" своим объектом необходимо:
1) В таблице SysEntitySchemaReference обнаружить целевое справочное поле, т.е. поле в объекте с которым устанавливается связь, и там подглядеть его ColumUId.
[проще всего дать полю какое ни будь заведомо уникальное имя, найти, потом переименовать, но можно и отталкиваться в описках и от значения в колонке SysSchemaId это уникальный идентификатор объекта из SysSchema]
1) Добавить Вашу запись в EntityConnection (или у существующей подменить ColumUId, например для подменя связи Лидов(встроенных) на Лиды(кастомные))
для новой записи: SysEntitySchemaUId - значение колонки UId из SysSchema для объекта для которого вы планируете установить связь. ColumUId - значение из SysEntitySchemaReference полученное ранее, фактически это реплика на справочное поле в объекте.
Итоговый результат, в детали "Связи" выведенную на карточку схемы объекта указанного в SysEntitySchemaUId будет выведено соответствующее справочное поле этого объекта. А так же со "Связью" начинают работать все встроенные в типовую конфигурацию "механизмы", н/а виджеты "Связи" в миникарточках
PS: 1) Чтобы отключить "стоковую связь" - удаляем соответствующую запись из EntityConnection
1. Добавить новую запись в таблицу EntityConnection
2. [SysEntitySchemaUId] = C449D832-A4CC-4B01-B9D5-8A12C42A9F89 - Uid схемы объекта ссылочного поля в SysSchema
3. [ColumnUId] - UID ссылочного поля данного объекта в метаданных активности
Вопрос следующий. В Oauth2 если тип авторизации authorization code. Он позразумевает переход по внешней ссылке, разрешение прав для приложения на стороне сервиса и потом происходит переход на callback страницу с code параметром, после этого отправляется code на сервис и получаем заветный access_token.
Поэтому тут несколько вопросов
1) Как сделать callback_url на стороне bpm?
2) Как и куда записывать данные (скажем access_token)
И пара вопросов мимо кассы,
1) В документации очень много оперируеться зависимости модулей (первый параметр для define в js коде), если ли где-то список всех этих модулей и их методов (или все ViewModels реализуют одни и те же методы?)
2) Как получить public URL (или даже content) для attachment file (http://joxi.ru/EA4vGklIwqq0nm), ссылка которая указана там (в Web интерфейсе), являеться доступной только для авторизированого пользовталея который имеет к нему доступ
3) Где посмотреть реальные данные приложения (скажем у меня есть несколько вкладок и в каждой из них есть по 3 файла, я хочу посмотреть где-то данные по этим файлам, и хочу получить по ним info прямо в JS)
Короче по поводу OAuth2 оказалось все просто, нужно создать C# файл через создание в пакете Исходного кода и вводим следующее
publicclass TestService
{[OperationContract][WebInvoke(Method ="GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]public string callback(string data){
var request = HttpContext.Current.Request;using(var client =new WebClient()){
var values =new NameValueCollection();
values["grant_type"]="authorization_code";
values["code"]= request["code"];
values["client_id"]="CLIENT_ID";
values["client_secret"]="SECRET";
values["redirect_uri"]="https://SOME_DOMAIN.bpmonline.com/0/rest/TestService/callback";
var response = client.UploadValues("ACCESS_TOKEN_RETRIEVE_DOMAIN", values);
var responseString = Encoding.Default.GetString(response);return responseString;}return"Error";}}
На стороне сервиса где авторизируемся создаем приложение указываем https://SOME_DOMAIN.bpmonline.com/0/rest/TestService/callback как REDIRECT_URI и получаем то что и требовалось, после предоставления доступа к сервису переходим в BPM CRM в созданный клас, и видим ACCESS TOKEN информацию
"если ли где-то список всех этих модулей и их методов"
Списка нету. Все клиентские схемы, добавленные в конфигурации,
объявляются с использованием Define.
"или все ViewModels реализуют одни и те же методы?"
Учитывая что ViewModels обычно используют "базовую" ViewModel,
то базовые методы в них одни и теже. Но также могут содержатся новые,
добавленные в расширяющей ViewModel.
2) Для получения прикрепленных файлов используется конфигурационный сервис FileService.
Пример: http://bpmonline/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003…
В нём используется userConnection текущего пользователя.
Исходя из этого - скачать файл у неавторизованного пользователя не получится,
даже если у него будет ссылка.
3) Не понял вопрос. Вкладки в браузере? Какие 3 файла? Какую инфу JS хотите видеть?
На практике с помощью генератора, приведённого выше, в код добавляются грид блоки в полном соответствии с массивом myItems (см. скриншот), но без внутреннего содержимого, того, что по документации описывается как item: {}. Для примера решили там вывести просто текст внутри контрола Label.
Как правильно в этом случае подключить label и вывести текст? То, что item1 вынесена в функцию - одна из попыток.. не помогло.
showTestMessage - пустой тестовый метод с дебагером.
В итоге всё нормально генерируется. У меня когнитивный диссонанс: ну вот почему нельзя в items запихивать одну и ту же структуру? Нафига они разворачивают всё в вид:
"colSpan":12,
"column":0,
"row":0,
"item":{}
????? Хотя в тот же самый контейнер items надо складировать в ином виде. Блин. Ну надо же так придумать.
"Смородинов Денис" написал:А возможно ли динамическое получение данных, и передача их в свой контрол?
Это уже что-то типа ContainerList. Там есть коллекция, которая динамически наполняется и вызывается метод onGetItemConfig при добавлении ряда.
Соответственно возможно сделать, но надо выковыривать методы/реализацию из того, что уже есть)
"Варфоломеев Данила" написал:Это уже что-то типа ContainerList. Там есть коллекция, которая динамически наполняется и вызывается метод onGetItemConfig при добавлении ряда.
Соответственно возможно сделать, но надо выковыривать методы/реализацию из того, что уже есть)
Данила, вопрос Дениса по сути про механизм bindTo. Строки нормально биндятся и передаются в контрол, а вот с коллекциями проблема:
Коллеги, добрый день.
Порылся в форуме и не нашел решения, пишу в отдельной темой:
Есть bpmonline 7.10
Есть webitel
Есть сотрудники с мобильными телефонами (как андроид так и iphone, оператор Билайн)
Как настроить систему что бы все звонки писались и были видны в bpmonline?
заранее признателен за советы или ссылку на тему в форуме.
Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии), то они и так пишутся на вкладку "Звонки" в контакте или контрагенте.
А если не проходят через Webitel, то в мобильном приложении при звонке через него есть возможность зафиксировать результат звонка. По умолчанию только для рабочего места Default.
Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии), то они и так пишутся на вкладку "Звонки" в контакте или контрагенте.
В том то и дело что мобильные звонки не проходят через bpm, о возможных способах организации траффика звонков этого и суть поста
Если звонки проходят через bpm(т.е у вас настроена телефония webitel, закуплены лицензии), то они и так пишутся на вкладку "Звонки" в контакте или контрагенте.
Уточняю, в данный момент телефония настроена через ip номер манго, через bpm, но мобильные телефоны в этой схеме не участвуют. Точнее участвуют только при настроенной переадресации звонков с ip телефонов на мобильные. В обратную сторону - нет.
В таком случае, максимум, что можно сделать - фиксировать результаты звонка из мобильного приложения. Полноценной интеграцией это не назовешь, но лучше чем ничего.
Я слышал, что у некоторых операторов в России есть такая услуга - дублирование звонка на SIP, то есть, факт и запись разговора будут идти параллельно разговору по мобильному.
Думаю, что точнее вам помогут с этим специалисты из Webitel - они знают все нюансы
Я слышал, что у некоторых операторов в России есть такая услуга - дублирование звонка на SIP, то есть, факт и запись разговора будут идти параллельно разговору по мобильному.
Думаю, что точнее вам помогут с этим специалисты из Webitel - они знают все нюансы
"Денис Королев" написал:В том то и дело что мобильные звонки не проходят через bpm
Тогда надо уточнять у Webitel, возможно ли как-то оповестить внешнюю систему после совершения вызова(например comagic отправляет http-запрос по указаному адресу с информацией о совершенном звонке).
Тогда надо уточнять у Webitel, возможно ли как-то оповестить внешнюю систему после совершения вызова(например comagic отправляет http-запрос по указаному адресу с информацией о совершенном звонке).
У webitel есть возможность через WebHooks отправлять http-запросы на события сервера и телефонии.
Здесь задача об отображение звонка в bpm'online и сотрудник использует мобильный телефон. Если сотрудник будет звонить через любой SIP клиент, то такие звонки не проблема отобразить в bpm'online, так как они проходят через Webitel. Но, если сотрудник будет звонить напрямую со своего мобильного номера, то мы это никак не увидем в webitel.
Добрый день. К сожалению данный функционал так и не реализован в базовой версии, т.к. запрос не набрал достаточно большого спроса и обратной связи от пользователей.
Как и ранее, Вы можете выполнять набор номера с мобильного приложения нажатием на изображение , но все звонки осуществляются за счет мобильного оператора(то есть, исходящий звонок будет осуществлен напрямую с локального устройства).
Относительно логирования входящих звонков, ситуация аналогична, подобный функционал не реализован, поступающие на телефон звонки никак не фиксируются в системе.
Пожелание по реализации зафиксировано и находится на рассмотрении.
Столкнулась с такой проблемой с блоком "Открыть страницу редактирования" в настройке сохранения страницы по условию необходимо проверить значение поля детали,которая находится на странице.
В системе был создан объект, для которого настроена деталь.
Если в настройках с объекта продажи перехожу на объект детали выводятся только стандартные поля(Пример приведен на скриншоте).
Подскажите, пожалуйста, по какой причине остальные поля объекта не отображаются.
Светлана, такая ситуация возникает, если основной записи может соответствовать несколько записей в таблице детали.
В таком случае вывести значение колонки детали в реестре основной записи невозможно, исключение составляют только колонки, по которым можно определить минимальное, максимальное и среднее значение (это даты, целочисленные и дробные значения), а также количество записей детали, связанных с конкретной записью основного раздела.
Однако, в основном разделе по данным детали можно построить exists или not exists фильтры. Более подробно о построении таких фильтров можно почитать на Академии по ссылке https://academy.terrasoft.ru/documents/sales-enterprise/7-9/rasshirenny…
Скажите пожалуйста, как можно организовать список контактов на обзвон(в котором будет видно кому дозвонились, кому нет, кому еще не звонили) и также добавлять комментарии к звонкам. На форму прочитала, что можно делать это в рамках бизнес процесса. Меня интересует как это сделать в рамках маркетинговой компании или в рамках маркетингового мероприятия.
Добрый день!
Возник следующий вопрос, можно ли сделать обзвон, который упомянался в предыдущем вопросе в рамках кейса? Если да , то не могли бы Вы подробнее описать процесс создания такого кейса. Если нет и данная задача возможна только в рамках бизнес процесса, описать как именно это делается.
Настроить обзвон контактов или запланировать выполнение звонка в рамках процесса/кейса не получится.
В рамках первого процесса можно настроить создание активностей с типом “Звонок” для всех целевых контактов. Таким образом для пользователей будет создано напоминание кому необходимо позвонить.
1-ый процесс будет состоять из одного элемента:
- добавить данные в объект [Активности] в режиме “Добавить результат выборки” по объекту [Контакт] (в фильтре указать по каким контактам необходимо выполнить обзовон)
В рамках второго процесса можно настроить вашу бизнес-логику в зависимости от результата активности (созданной первым процессом):
1. Стартовый сигнал по изменению активности (ожидать изменения поля Состояние), где Тип = Звонок
2. Читать данные в активности, где Id = Пункт 1. Id
Далее в зависимости от результата активности – создавать новую или устанавливать комментарий в контакте.