Всем доброго времени суток!

Столкнулся с проблемой интеграции с Google Analytics. Написал сервис с с ипользованием следующих библиотек - https://prnt.sc/mmm8kd

Но при вызове сервиса вываливаются следующие ошибки -https://prnt.sc/mmm98e

Я понял что идет конфликт встроенных библиотек Google и тех что добавили в кастомном пакете.

Что можете посоветовать? 

Нравится

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

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



Приносим свои извинения за неудобства. Версии библиотек Google API планировали обновлять с версии 7.13.0, но в результате тестирования возникли технические проблемы. На данный момент ответственная команда занимается решением  этого вопроса. Обновления версии библиотек Google API запланировано на ближайшие релизы.



Спасибо за понимание!

Мотков Илья,

Благодарю!

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

добрый день.

Нигде не смог найти пример на формирование значения поля на основании других полей.

Например для конфигурационной единицы. Автоматически генерировать Название КЕ по формуле Тип КЕ + Производитель КЕ (собственное поле) + Модель КЕ. 

Как вариант повесить БП и после создания КЕ автоматически делать название, но лучше, чтобы пользователь видел результат еще до сохранения КЕ.

Подскажите в каком направлении идти.

Нравится

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

Это можно сделать с помощью зависимостей атрибутов. Более подробно посмотрите пример настройки вычисляемого поля на Академии.

Исходя из Ваших требований, вариант с БП не подойдет.

Это можно сделать с помощью зависимостей атрибутов. Более подробно посмотрите пример настройки вычисляемого поля на Академии.

Исходя из Ваших требований, вариант с БП не подойдет.

Что не работает. Сделал как описано в примере. Для начала решил сделать просто заполнение текстовым значением, потом переделать на заполнение значениями из справочника. Но даже так поле не заполняется. Что не так сделал?

define("ConfItemPage", [], function() {
	return {
		entitySchemaName: "ConfItem",
		attributes: {
			"EpmName": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				dependencies: [
					{
						columns: ["TypeId", "ModelId", "EPMManufacturerId", "Name"],
						methodName: "generateNewName"
					}
					]
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.generateNewName();
			},
			generateNewName: function() {
				var result = this.get("Name") + " Hello word!";
				this.set("EpmName", result);
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "EpmName",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 5,
						"layoutName": "Header"
					},
					"bindTo": "EPMName",
					"labelConfig": {
						"caption": {
							"bindTo": "Resources.Strings.EpmNameCaption"
						}
					},
					"enabled": true
				},
				"parentName": "Header",
				"propertyName": "items"
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Разобрался. 

В разделе attributes указывается поле страницы Оно у меня записано как EmpName

А вот в методе в строке this.set("EPMName", result); надо писать уже имя поля куда сохраняем значение bindTo. У меня было записано как имя поля EpmName.  А такого поля в схеме нет. Поменял на EPMName или все заработало.

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

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



Есть следующая ситуация:



Заходим в деталь карточки раздела, добавляя туда запись отрабатывает БП который меняет значение поля в Entity, но при возвращении в карточку остается старое значение.

Поэтому возникает необходимость актуализировать данные в карточке, к примеру, при помощи метода this.reloadEntity(), но непонятно как отправить message из БП в схему карточки и там уже запустить обновление.



Есть идеи?

Нравится

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

На сервере через Элемент скрипты делаете так:

 

string messageText = "{\"любой текст, если хотите\"}";
string sender = "NeedUpdatedGrid";
MsgChannelUtilities.PostMessageToAll(sender, messageText);

Затем создаете клиентский модуль, такого содержания:

 

define("ClientMessageBridge", ["ConfigurationConstants"],
function(ConfigurationConstants) {
    return {
        messages: {
            "NeedUpdatedGrid": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function() {
                this.callParent(arguments);
                this.addMessageConfig({
                    sender: "NeedUpdatedGrid",
                    messageName: "NeedUpdatedGrid"
                });
            },
            afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
            }
        }
    };
});

А там, где хотите обновить грид, делаете так:

init: function() {
  this.callParent(arguments);
  this.sandbox.subscribe("NeedUpdatedGrid", this.myNameMethod, this);
},
myNameMethod: function(args) {
    this.reloadEntity();
}

Ну и соответственно не забудьте в схеме дописать 

блок messages, сообщение можете принимать как BROADCAST

 

На сервере через Элемент скрипты делаете так:

 

string messageText = "{\"любой текст, если хотите\"}";
string sender = "NeedUpdatedGrid";
MsgChannelUtilities.PostMessageToAll(sender, messageText);

Затем создаете клиентский модуль, такого содержания:

 

define("ClientMessageBridge", ["ConfigurationConstants"],
function(ConfigurationConstants) {
    return {
        messages: {
            "NeedUpdatedGrid": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function() {
                this.callParent(arguments);
                this.addMessageConfig({
                    sender: "NeedUpdatedGrid",
                    messageName: "NeedUpdatedGrid"
                });
            },
            afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
            }
        }
    };
});

А там, где хотите обновить грид, делаете так:

init: function() {
  this.callParent(arguments);
  this.sandbox.subscribe("NeedUpdatedGrid", this.myNameMethod, this);
},
myNameMethod: function(args) {
    this.reloadEntity();
}

Ну и соответственно не забудьте в схеме дописать 

блок messages, сообщение можете принимать как BROADCAST

 

Литвинко Павел,

Спасибо, попробую.

А зачем эта функция?

afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
                }

И модуль этой же функции должен от кого-то наследоваться?

Литвинко Павел,

На сервере через Элемент скрипты делаете так:

Под - "...Элемент скрипты..." , вы имели ввиду элемент задание сценарий?

Если это так, то следующий код там неприменим:

MsgChannelUtilities.PostMessageToAll(sender, messageText);

Так как объект MsgChannelUtilities отсутствует в данном контексте.

Андреев Андрей Сергеевич пишет:

Литвинко Павел,

На сервере через Элемент скрипты делаете так:

Под - "...Элемент скрипты..." , вы имели ввиду элемент задание сценарий?

Если это так, то следующий код там неприменим:

MsgChannelUtilities.<span>PostMessageToAll</span><span>(</span>sender, messageText<span>)</span><span>;</span>

Так как объект MsgChannelUtilities отсутствует в данном контексте.

ЕщеСвернуть

Да, задание сценарий 

Андреев Андрей Сергеевич пишет:

Литвинко Павел,

Спасибо, попробую.

А зачем эта функция?


 
afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
                }

И модуль этой же функции должен от кого-то наследоваться?

https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr…;

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

Добрый день!

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

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

При нажатии на одну из ссылок (например, Тест) клиенту автоматически открывается ответное письмо по следующему шаблону:

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

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

Вопрос 2 - Как сделать, чтобы при нажатии ссылки сразу автоматически отправлялось письмо?

P.S. Вообще в принципе стоит цель создания в bpm sales функционала, подобному оценке удовлетворенности по шкале, который сейчас есть bpm service.

Нравится

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

Это обычная гиперссылка на URL «mailto:test@example.com?subject=sss&body=bbb», её обрабатывает выбранный на компьютере почтовый клиент. Формировать гиперссылки с макросами можно аналогично другим шаблонам со ссылкой (например, письмам с уведомлениями по инцидентам).

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

Оценка сделана без всяких писем, там дёргается веб-сервис, доступный извне без авторизации.

 

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

Александр, большое количество шаблонов перелопатил, но к сожалению, так и не понял, как формировать гиперссылку с макросом. Не могли бы вы написать пример?

В маркете есть БП, который для задач формирует письма-уведомления с гиперссылкой на их карточку. В стандартной версии нашёл подобный «Шаблон уведомления о новой визе счета (US)».

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

Понял, спасибо.

Это обычная гиперссылка на URL «mailto:test@example.com?subject=sss&body=bbb»

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

Или вообще, в принципе, при нажатии на ссылку клиентом происходили изменения полей в системе?

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

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

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

Коллегу, у меня такой вопрос.

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

Ну и вопрос в следующем, каким образом можно сделать подобный функционал в кастомном разделе и детали? Что бы при изменении карточки раздела происходила отправка сообщения во все карточки детали. Подписка в init в карточки детали (___productPage) не работает.

Нравится

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

Посмотрите в объекте Invoice процесс InvoiceSaving. В методе OnSaving устанавливается признак необходимости пересчета (при изменении курса).



А в процессе InvoiceSaved в методе OnSaved уже вызывается сам пересчёт

Посмотрите в объекте Invoice процесс InvoiceSaving. В методе OnSaving устанавливается признак необходимости пересчета (при изменении курса).



А в процессе InvoiceSaved в методе OnSaved уже вызывается сам пересчёт

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

Привет!

 

Подскажите как в схеме с типом "Исходный код" прочитать значение ключа, добавленного мной в web.config в раздел appSettings?

<appSettings>
    <add key="MyKey" value="MyValue" />
</appSettings>

 

Нравится

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

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

Возможно кто-то сталкивался с кейсом интеграции bpm и power bi? Нужно получить доступ к данным bpm для сравнительного анализа в power bi.

Нравится

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

Сталкивались.

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

http://[адрес сайта]/0/ServiceModel/EntityDataService.svc

Базовая аутентификация, можете использовать любого юзера с лицензией и правами на чтение везде.Если будут права ограничены на чтение объекта/раздела вы их при обмене не увидите.

Сталкивался:

Настройка аналитики выполнена не только базовыми возможностями раздела [Итоги], а и с помощью интеграции bpm’online с MS Power BI. Настройка интеграции достаточна проста, а возможности для составления аналитики значительные.

Говорят, что в настройке Сервис Групп справились сами и там всё было очень просто.

Как именно делать, зависит от механизма интеграции на стороне Power BI: это может быть прямой доступ в базу MS SQL (если система развёрнута on site) или доступ к данным по OData.

Сталкивались.

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

http://[адрес сайта]/0/ServiceModel/EntityDataService.svc

Базовая аутентификация, можете использовать любого юзера с лицензией и правами на чтение везде.Если будут права ограничены на чтение объекта/раздела вы их при обмене не увидите.

Плотников Денис пишет:

Сталкивались.

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

http://[адрес сайта]/0/ServiceModel/EntityDataService.svc

Базовая аутентификация, можете использовать любого юзера с лицензией и правами на чтение везде.Если будут права ограничены на чтение объекта/раздела вы их при обмене не увидите.

Огромное спасибо, Денис и Александр! 

Добрый день. 

 

Заранее прошу прощения за ап старой темы, но нельзя ли поподробнее описать или дать ссылку на описание интеграции по oData? 

В настоящий момент проблема в том, что при обновлении запросов через oData, PI сильно загружает систему (CRM развернута на сайте).

Возможно кто то сталкивался с подобной проблемой и имеет решение?

Алексей Заворотный пишет:

В настоящий момент проблема в том, что при обновлении запросов через oData, PI сильно загружает систему (CRM развернута на сайте).

Нужно смотреть, на что конкретно нагрузка, какие запросы идут в базу. Если у вас развёрнуто локально,  можно увидеть в SQL-профайлере.

 

Например, многие интеграции (в том числе Excel и Power BI,) не умеют правильно авторизироваться и затем хранить сессии, логинясь заново для каждого обращения к OData, в результате происходит много запросов на вставку в SysUserSession, которые могут проходить тяжело, если в таблице и так много записей или вызвать deadlock-и.

 

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

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

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

 При подключении из Power BI по oData3 согласно инструкции

подключение происходит по ссылке типа

 http://[адрес сайта]/0/ServiceModel/EntityDataService.svc

 

При этом мне не понятно, как при использовании подобного подключения использовать параметры/операторы/заголовки запроса. Скажите, это возможно?

Это нужно настраивать на стороне сторонней системы. 

Не встречали ли Вы кейс по настройке подключения Power BI к Creatio?

См. верхние 2 комментария.

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

Добрый день, 

В продолжении этой темы хотела спросить как настроить такой вид подключения о котором вы писали "это может быть прямой доступ в базу MS SQL (если система развёрнута on site)"  где можно про это почитать? Как понять что это можно у себя настроить?

Диана, речь о том, что когда сайт установлен на локальном сервере, то есть доступ к базе (чаще всего MS SQL), где данные каждой схемы (Contact, Account и др.) находятся в таблицах с такими же названиями, их можно считывать или добавлять и изменять. Нужно только учесть, что при изменении через базу не отработает логика на объекте и в БП, если она есть, её аналоги нужно разрабатывать самостоятельно. Но при использовании данных в базе только для чтения это не играет роли.

 

Можно ли использовать это конкретно при работе из Power BI, лучше уточнить у работающих с этой системой. Поскольку она, как и БД, разработана Microsoft — скорее всего, можно. См., например, туттут и тут.

Hi,  We would like to use PowerBI to develop reports, based on data stored in Creatio. Do have instructions for a CLOUD version of Creatio? This thread seems to be focus on on-premise.  Thank you.

Hello Frédéric,

Here are the examples of integration. You can use oData protocol to connect from Power BI to Creatio Cloud.

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

Добрый день!

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

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

Нравится

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

Установите значение class для вашей детали в значение class="ts-controlgroup detail grid-detail ts-controlgroup-collapsed", можно сделать через DOM

Установите значение class для вашей детали в значение class="ts-controlgroup detail grid-detail ts-controlgroup-collapsed", можно сделать через DOM

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

Добрый день!



Каким образом можно выгрузить все документы из CRM (Cloud) прикрепленные во вложениях, детали "Файлы и ссылки"?

Нравится

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

Здравствуйте! Вы можете воспользоваться готовым решением  External File Storage, чтобы выгрузить файлы на Google Drive или One Drive. Подробнее ознакомиться с функционалом вы можете на нашем сайте https://samarasoft.com/docs/external-file-storage/sending-files-to-ftp/

Как мне кажется самый простой способ - запросить бд, развернуть у себя, на С# написать скрипт, который присоединяется к бд, ходит по ****File схемам и сохраняет файлы на диск

Либо поднять у себя FTP сервер и выгрузить с облака на него аналогичным скриптом. Так можно исключить запрос бэкапа.

Написать свою страничку которая сделает запрос к нужной детали (Например файлы и примечания контрагента) получит список id записей с типом файл, пройтись по полученной коллекции и скачать (выгрузить со странички клиенту файлы) в автоматическом режиме все файлы используя FileApiService. Вроде ничего сложного и не нужен доступ к БД. 

Здравствуйте! Вы можете воспользоваться готовым решением  External File Storage, чтобы выгрузить файлы на Google Drive или One Drive. Подробнее ознакомиться с функционалом вы можете на нашем сайте https://samarasoft.com/docs/external-file-storage/sending-files-to-ftp/

Да, забыл добавить: также можно настроить интеграцию с FTP

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

Добрый день!

Каким образом можно построить конверсионную воронку продаж с указанием количества продаж прошедших через каждую из стадий?



Пример:

- У нас есть 100 созданных продаж на стадии Квалификация. В системе существует 5 стандартных стадий: Квалификация, Презентация, Коммерческое предложение, Контрактация, Завершена с победой.

- Менеджер начинает работу по созданным продажам. Соответственно через первую стадию пройдут 100 продаж;

- На стадию "Презентация" перешли 90 продаж (10 - завершились с поражением) и т.д. Т.е. с каждой новой стадией идет отсев продаж. По итогу менеджер завершил успешно 40 продаж. При этом эти 40 продаж прошли через все стадии.

- Итоговая воронка должна выглядеть как - Квалификация - 100, Презентация - 90, Коммерческое предложение - 70, Контрактация - 40, Завершена с победой - 40.

Нравится

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

См документацию по воронке продаж тут

См документацию по воронке продаж тут

Григорий Чех пишет:

См документацию по воронке продаж тут

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

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

Сквозная воронка - это не то что хочется видеть.

1)В моем первоначальном вопросе, речь идет только о продаже.

2)Нужны не процентные, а числовые показатели из которых будет понятна конверсия.

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

Для чисел нужно переключиться на первую вкладку.

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

В такой воронке отображает не конверсию, а количество продаж на каждой из стадий. Т.е. если у меня есть 100 продаж, они будут распределены по стадиям: Квалификация - 30, Презентация - 30, Коммерческое предложение - 15, Контрактация -20, Завершена с победой - 5.

Тогда вторую вкладку, с процентами. 

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

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

О, да! Равномерная воронка - это обман зрения. Графики нужны для того, чтобы не вчитываться в цифры. 



Хотелось, чтобы разработчики сделали более наглядную воронку 

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

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

Владимир, если в гугл-картинках вбить «воронка продаж», то чуть менее, чем все

А если вбить "Sales pipeline", то будет уже поинтереснее.

Например, в одной крупной системе виден источник, очень напоминающий воронку в TS 3.x (которая наглядно отражала план и факт в виде заполнения каждой стадии)



В другой крупной системе высота стадии зависит от числового показателя (не так наглядно, но всё же) 



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

Да, в 3.Х была неказистее, но нагляднее:

1

2

В 7.X высота элемента воронки отображает количество продаж на соответствующей стадии.

1_Анализ.png (1215×683)

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