Есть 10 пользователей в Террасофте.
Есть 2 общие почты, к которым эти пользователи подключены (разрешено многопользовательское использование)
У администратора синхронизация почты проходит хорошо, а у других пользователей не подгружаются данные письма.
Как сделать, чтобы у всех синхронизировалась почта??
Попытка разобраться с штатной деталью "Связи" чтобы добавить туда новое, собственное поле, например в Активностях. Расследование работы этой детали:
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…
Можно написать sql запрос, который удалит ненужные стадии.
Но, как по мне, правильнее не удалять старые стадии, а доработать функциональность таким образом, чтобы у пользователя не было возможности выбрать стадию, которая уже неактуальна.
Для этого Вы можете в справочник стадий добавить поле-признак IsNotUsed и установить его для тех, стадий которые не должны отображаться. А схему страницы доработать таким образом, чтобы выбирались только стадии, у которых признак IsNotUsed <> true.
У нас система новая и в настоящий момент, мы уже пришли к единому формату и пользователи сами не переходят по стадиям, все делает БП, но в старых (2 месяца работы) - каша, а это портит статистику по воронке продаж.
Добрый день, стоит задача помечать метками входящие письма, решили для этой задачи создать справочное поле, подскажите, пожалуйста, можно ли что бы это поле отображалось сразу на панели справа
и как в дальнейшем можно сортировать по этому полю письма, если в активностях письма не отображаются, а на панели справа нет фильтров?
1) Поищите в CommunicationPanelEmailSchema, там генерятся представления для email-ов. Скорее всего можно расковырять ContainerList и вставить туда новое справочное поле.
2) Делать новый раздел с активностями с фильтром тип=почта/добавить в итоги активностей список, отфильтровать его, каждая активность отобразится с url-ссылкой на карточку (крайне криво, зато можно понаделать кучу фильтров)/опять же ковырять CommunicationPanelEmailSchema, добавлять фильтрацию в менюшку с троеточиями(например как новый подпункт), писать кучу обработчиков
Базовый функционал загрузки координат на карте. Работает только тогда, если включен интернет.
Если доступа к интернету нет, будет бесконечная загрузка.
Полазив по модулю карты, ничего не приходит в голову, как можно было бы это пофиксить
Надо чтобы если нет инета, то просто не грузить, или какой-то таймаут поставить...
Можете попробовать все тело init-a OsmMapsModule схемы поставить в условие, единственное что, необходимо понять как синхронно проверить наличие интернета, возможно вам пригодится что-то вроде этого: http://github.hubspot.com/offline/docs/welcome/
Подскажите пожалуйста, каким образом правильно указать англоязычное название разделу (название страницы в списочном представлении), созданного при помощи мастера раздела в русском интерфейсе.
Например, стандартный раздел контакты имеет англ. название Contacts, а мой раздел отображается с русским название. Чтобы было более понятно, прилагаю скриншот того лейбла (в рамке), который необходимо локализовать.
Выполнение запроса как ниже, задачу не решило
INSERT INTO [dbo].[SysModuleLcz]
([RecordId]
,[SysCultureId]
,[Caption]
,[ModuleHeader])
VALUES
('59F6F836-8A1B-4321-939E-BF3509973389','A5420246-0A8E-E111-84A3-00155D054C03','Caption in English','Caption in English')
Для решения:
1) Удалите созданную запись
2) Откройте схему созданного мастером раздела
3) Найдите локализованную строку Caption
4) В поле "Значение" установите нужные значения.
Для установки нажмите на кнопку справа от поля. В результате откроется модальное окно. Внесите нужные значения и сохрените.
5) Сохраните схему.
В результате в таблице SysModuleLcz будут созданы правильные записи. После очистки кеша заголовок будет отображаться корректно.
Также существует раздел "Переводы", но там нужно искать по ключу.
Илья, после ручной вставки записи в SysModuleLcz и очистки кеша + "перезайти", название раздела локализовалось-таки:). Пойду проверять на тестовом контуре в облаке.