Добрый день, коллеги! Подскажите, как правильно реализовать видимость/скрытие кнопки на странице редактирования по условию? Есть очень похожий пример по видимости деталей:

https://community.terrasoft.ru/questions/vidimostskrytie-detali-v-zavis…

но появляется проблема в том, что при формировании страницы сначала формируются кнопки а потом уже поля и их значения и детали, соответственно до отрисовки кнопок невозможно считать, например, "Тип" записи. Подскажите, есть ли варианты решения?

Нравится

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

Антон, для деталей (а также вкладок, групп полей и ) с 7.16.3 предусмотрено управление видимостью в бизнес-правилах.

 

Но для кнопок такого пока нет, заведена идея.

Антон, для деталей (а также вкладок, групп полей и ) с 7.16.3 предусмотрено управление видимостью в бизнес-правилах.

 

Но для кнопок такого пока нет, заведена идея.

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

Добрый день, уважаемые коллеги!

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

Попыталась поискать решение по материалам сообщества, но так и не разобралась, можно ли реализовать такую потребность и каким образом.

https://community.terrasoft.ru/articles/susestvuet-li-v-79-sposob-zadat-cvet-stroke-v-reestre-mobilnogo-prilozenia

https://community.terrasoft.ru/questions/napisanie-stilei-dla-mobilnoi-versii

https://community.terrasoft.ru/articles/kak-v-mobilnoi-versii-prilozenia-vyvesti-dopolnitelnye-kolonki-v-reestra-razdela

 

Подскажите, пожалуйста, понять как работает Terrasoft.util.writeStyles:

  1. можно ли и как в данном случае использовать Terrasoft.util.writeStyles (сложилось впечатление, что стиль определяется для реестра/схемы в целом)?
  2. Если реализация возможна, то на каком типе схемы для реестра надо обращаться к Terrasoft.util.writeStyles ?

Благодарю за помощь

Нравится

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

Марина, это немного нетривиальная задача, но она реализуема.

 

Как подобное можно реализовать. Для этого нужно по сути реализовать свой компонент реестра\грида, расширив базовый компонент list. Именно так сделано в разделе «Лента»\”Feed” (см. MobileFeedList, MobileSocialMessageGridPageView).

  1. Создать свой компонент, расширив базовый list. Например, если нужно менять стиль только основного выводимого поля, то можно реализовать в нем только метод getApplyItemTplPrimaryColumnFn. Что-то типа:

 

Ext.define("Terrasoft.configuration.MyList", {
   extend: "Ext.Terrasoft.List",
   xtype: "cfmylist",
 
   getApplyItemTplPrimaryColumnFn: function() {
      return function(values) {
         var config = this.primaryColumnConfig;
         var value = this.getValueByConfig(config, values);
         var typeId = values["Type"];
         var isRed = false;
         if (typeId === "some_type_value") {
            isRed = true;
         }
         if (value) {
            return "<div class=\"x-list-title\" " + isRed ? "style=\"color: red;\"" : "" + ">" + value + "</div>";
         }
         return "";
      };
   }
 
});

 

  1. Во view страницы реестра своего раздела указать в качестве используемого компонента свой разработанный компонент из п.1.
Ext.define("Terrasoft.configuration.view.ContactGridPage", {
   extend: "Terrasoft.view.BaseGridPage.View",
   xtype: "contactgridpageview",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   },
  1. Прописать в манифесте в CustomSchemas схему, в которой реализовали свой компонент.

Марина, это немного нетривиальная задача, но она реализуема.

 

Как подобное можно реализовать. Для этого нужно по сути реализовать свой компонент реестра\грида, расширив базовый компонент list. Именно так сделано в разделе «Лента»\”Feed” (см. MobileFeedList, MobileSocialMessageGridPageView).

  1. Создать свой компонент, расширив базовый list. Например, если нужно менять стиль только основного выводимого поля, то можно реализовать в нем только метод getApplyItemTplPrimaryColumnFn. Что-то типа:

 

Ext.define("Terrasoft.configuration.MyList", {
   extend: "Ext.Terrasoft.List",
   xtype: "cfmylist",
 
   getApplyItemTplPrimaryColumnFn: function() {
      return function(values) {
         var config = this.primaryColumnConfig;
         var value = this.getValueByConfig(config, values);
         var typeId = values["Type"];
         var isRed = false;
         if (typeId === "some_type_value") {
            isRed = true;
         }
         if (value) {
            return "<div class=\"x-list-title\" " + isRed ? "style=\"color: red;\"" : "" + ">" + value + "</div>";
         }
         return "";
      };
   }
 
});

 

  1. Во view страницы реестра своего раздела указать в качестве используемого компонента свой разработанный компонент из п.1.
Ext.define("Terrasoft.configuration.view.ContactGridPage", {
   extend: "Terrasoft.view.BaseGridPage.View",
   xtype: "contactgridpageview",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   },
  1. Прописать в манифесте в CustomSchemas схему, в которой реализовали свой компонент.

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

 

Александр, огромное спасибо за подробное описание алгоритма с примерами. Стала пытаться реализовать алгоритм и столкнулась с проблемой во 2-м пункте :)

 

В конкретной ситуации рассматривается реестр Контрагентов. Сейчас отображается MobileAccountGridPage, который надо изменить и в коде которого:

Ext.define("AccountGridPage.View", {
	extend: "Terrasoft.view.BaseGridPage.View",
	xtype: "accountgridpage",
	config: {
		id: "AccountGridPage",
		navigationPanel: {
			id: "AccountGridPage_navigationPanel",
			title: LocalizableStrings["AccountGridPage_navigationPanel_title"]
		},
		grid: {
			id: "AccountGridPage_grid",
			iconCls: "user",
			store: "AccountGridPage.Store"
		}
	}
});

Так как здесь я не могу вносить изменения, то пытаюсь реализовать либо как:

- расширение от вышеуказанного класса "AccountGridPage.View", но в этом случае возникает ошибка - Uncaught Error: [Ext.Loader] Failed loading 'AccountGridPage/View.js', please verify that the file exists

- расширение от класса "Terrasoft.view.AccountGridPage.View" , возникает ошибка - sencha-touch-all-debug.js:8634 Uncaught Error: [Ext.Loader] Failed loading 'app/view/AccountGridPage/View.js', please verify that the file exists,

- расширение от "Terrasoft.view.BaseGridPage.View", но в этом случае ничего не происходит.

Ext.define("Terrasoft.configuration.view.UsrAccountGridPage", {
 // extend: "Terrasoft.view.AccountGridPage.View", //  Failed loading 'app/view/AccountGridPage/View.js'
 // extend: "AccountGridPage.View", // ошибка Failed loading 'AccountGridPage/View.js
  extend: "Terrasoft.view.BaseGridPage.View", // ничего не происходит
   xtype: "usraccountgridpage",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   }
});

Как правильно выполнить расширение в данном случае? Благодарю за помощь

Можно скопировать текст текущей view (MobileAccountGridPage, если не ошибаюсь), создать свою схему, вставить туда скопированный текст, у свойства grid указать свой новый xtype компонента грида и не забыть указать эту схему в манифесте в свойстве Grid у модели Account.

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

 

Александр, попробую. Благодарю Вас за ценные рекомендации

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

Уважаемые коллеги из Dev Labs!

подскажите, пожалуйста, по использованию приложения Phone lookup for Creatio (Дополнение для облегчения последующей обработки звонка и поиска данных в клиентской базе). Приложение было бы для нас очень полезно (испольpetv Asterisk)

Пытаюсь использовать на тестовой базе следующим образом:

1. Установила приложение

2. В строку браузера ввожу, адрес приложения, далее , как по инструкции и номер телефона.

3. Все время получаю пустой результат, в консоли ошибка Cannot read property 'call' of undefined .

В связи с этим вопросы:

1. Можно ли использовать (тестировать) приложение, как пробую я, т.е. вводя вручную номер телефона в браузерную строку по требуемому адресу

2. Можно ли его использовать, если не настроен Глобальный поиск в системе?

Благодарю за помощьИзображение удалено.

Нравится

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

Марина, добрый день!

 

обновленный пакет опубликован на маркетплейс. Установите дополнение повторно из маркетплейс и проверьте обновления.

Марина, добрый день!

 

работу решения можно проверять, вводя вручную номер телефона в браузерную строку по требуемому адресу.  Функциональность решения не зависит от настроек глобального поиска.

 

Ошибку воспроизвела и направила на исправление ответственной команде. По готовности уведомлю в отдельном комментарии.

Лазоренко Ирина,

 

Ирина, большое спасибо! ожидаю

Марина, добрый день!

 

обновленный пакет опубликован на маркетплейс. Установите дополнение повторно из маркетплейс и проверьте обновления.

Лазоренко Ирина,

 

Добрый день, Ирина! да, спасибо большое. Ошибка ушла

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

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

И после рефреша всё проходит, но потом может появиться снова

 

Как с этим бороться?Изображение удалено.

Нравится

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

1) Делаем select запрос в EntityConnection, видим поле Position, радуемся, настраиваем порядок.

2) Обновляем деталь, видим беспорядок, грустим (сортировка как бы есть, но её нет, т.к. в коде детали хлам, который не работает)

3) Вспоминаем, что у нас есть руки, и редактируем EntityConnectionsDetailV2:

methods: {
	/**
	 * Убираем позиции с 999 индексом (исключаем ненужные связи)
	 * */
	removePositions: function(item) {
		return item.$Position !== 999;
	},
 
	/**
	 * обработка и сортировка связей
	 * */
	processEntityConnectionsResponse: function(collection) {
		var filtered = collection.filterByFn(this.removePositions, this);
		var sorted = filtered.sort(null, null, function(a, b) {
			var v1 = a.$Position;
			var v2 = b.$Position;
 
			return v1===v2 ? 0 : (v1 > v2 ? 1 : -1);
		});
		collection.clear();
		collection.loadAll(sorted);
		this.loadColumnValues(collection);
 
		return sorted;
	}
}

 

Молитвой и божьим словом, на сколько я помню обращения в саппорт коллег))

1) Делаем select запрос в EntityConnection, видим поле Position, радуемся, настраиваем порядок.

2) Обновляем деталь, видим беспорядок, грустим (сортировка как бы есть, но её нет, т.к. в коде детали хлам, который не работает)

3) Вспоминаем, что у нас есть руки, и редактируем EntityConnectionsDetailV2:

methods: {
	/**
	 * Убираем позиции с 999 индексом (исключаем ненужные связи)
	 * */
	removePositions: function(item) {
		return item.$Position !== 999;
	},
 
	/**
	 * обработка и сортировка связей
	 * */
	processEntityConnectionsResponse: function(collection) {
		var filtered = collection.filterByFn(this.removePositions, this);
		var sorted = filtered.sort(null, null, function(a, b) {
			var v1 = a.$Position;
			var v2 = b.$Position;
 
			return v1===v2 ? 0 : (v1 > v2 ? 1 : -1);
		});
		collection.clear();
		collection.loadAll(sorted);
		this.loadColumnValues(collection);
 
		return sorted;
	}
}

 

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

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

 

Подскажите, пожалуйста, при работе с коннектором https://marketplace.terrasoft.ua/app/file-storage-creatio какие есть ограничения по правам доступа, или по объему файлов?



Например, как поведет себя приложение, если менеджер в Creatio добавит новый документ Контрагенту, к папке хранилища которого у него нет доступа?

Или передача данных осуществляется под учетной записью Системного администратора и ошибок отсутствия прав доступа не должно происходить?



Выводятся ли в интерфейсе Creatio какие-то пользовательские уведомления об ошибке синхронизации, если таковые произошли?



Заранее спасибо!

Нравится

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

Мы используем. По правам доступа проблем нет. Т.к. выгрузка осуществляется под пользователем приложения. Главное дать права на папку этому пользователю IIS.

Ограничения файлов и размеров - системные настройки.

Ошибок не будет выводится. Если что то пошло не так в момент выгрузки в файловое хранилище, то файл останется в БД (у нас не было еще таких ситуаций). 

Данное дополнение не дружит с мобильной версией. Загрузить файл с мобильного приложения не получится.

Мы используем. По правам доступа проблем нет. Т.к. выгрузка осуществляется под пользователем приложения. Главное дать права на папку этому пользователю IIS.

Ограничения файлов и размеров - системные настройки.

Ошибок не будет выводится. Если что то пошло не так в момент выгрузки в файловое хранилище, то файл останется в БД (у нас не было еще таких ситуаций). 

Данное дополнение не дружит с мобильной версией. Загрузить файл с мобильного приложения не получится.

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

 

Алексей совершенно верно уточнил, что права доступа на сетевые папки нужно предоставить пользователю, под которым запущен сайт (процесс IIS) и права пользователей Creatio не учитываются.

Размер файла не должен превышать размер в Мб, указанный в системной настройке MaxFileSize. Если больше, выдаст пользователю сообщение.

В случае, если не будет прав доступа - ошибка будет записана в лог-файл FileService, а загружаемый файл будет сохранен базовым способом - в БД.

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

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

Столкнулся с такой проблемой, валятся ошибки при использовании ATF.Repository объектной модели и выгрузке данных в список:

 

[Schema("Account")]
    public class Account : BaseModel
    {       
 
        [SchemaProperty("Name")]
        public string Name { get; set; }        
 
        [DetailProperty("Account")]
        public virtual List<AccountWorkingTime> WorkingTimes { get; set; }
    }
 
[Schema("AbWorkingTimeStation")]
    public class AccountWorkingTime : BaseModel
    {
        [SchemaProperty("Account")]
        public Guid AccountId { get; set; }
 
        [LookupProperty("DayOfWeek")]
        public virtual DayOfWeek DayOfWeek { get; set; }
 
        [SchemaProperty("From")]
        public DateTime From { get; set; }
 
        [SchemaProperty("To")]
        public DateTime To { get; set; }
 
    }
 
namespace PlatformIntegration.Files.cs
{
    [DefaultBinding(typeof(IAccountAdapter))]
    public class AccountAdapter : IAccountAdapter
    {
        public UserConnection UserConnection { get; set; }
 
        public AccountAdapter(UserConnection userConnection)
        {
            UserConnection = userConnection;
        }
        private IRepository _repository;
 
        private IRepository Repository
        {
            get => _repository ??= new Repository
                {UserConnection = UserConnection, UseAdminRight = false};
            set => _repository = value;
        }
 
        public Models.Account GetAccountById(Guid id)
        {
            var account = Repository.GetItem<Models.Account>(id);
            return account;
        }        
    }
}

При отработке метода GetAccountById - вылазят ошибки https://prnt.sc/uh1zso

Terrasoft.Web.Common.ServiceModel.ErrorHandler HandleError - Error getting value from 'WorkingTimes' on 'Castle.Proxies.AccountProxy'.

Newtonsoft.Json.JsonSerializationException: Error getting value from 'WorkingTimes' on 'Castle.Proxies.AccountProxy'. ---> System.Reflection.TargetInvocationException: Адресат вызова создал исключение. ---> System.InvalidCastException: Объект должен реализовывать интерфейс IConvertible.

   в System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)

   в ATF.Repository.Repository.FillPropertyValue[T](T model, PropertyInfo propertyInfo, Object value)

   в ATF.Repository.Repository.FillPropertyValues[T](T model, IDictionary`2 values)

   в ATF.Repository.Repository.CreateItem[T](IDictionary`2 values)

   в ATF.Repository.Repository.LoadModelByValues[T](IDictionary`2 values)

   в ATF.Repository.Repository.<>c__DisplayClass64_0`1.b__0(IDictionary`2 recordValues)

   в System.Collections.Generic.List`1.ForEach(Action`1 action)

   в ATF.Repository.Repository.GetItems[T](String filterPropertyName, Guid filterValue)

   --- Конец трассировки внутреннего стека исключений ---

   в System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)

   в System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)

   в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)

   в System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)

   в ATF.Repository.Repository.FillDetailValue[T](T model, ModelItem detail)

   в ATF.Repository.Builder.InstanceProxyHelper`1.FillProperty(IInvocation invocation, PropertyInfo property)

   в ATF.Repository.Builder.InstanceProxyHelper`1.InternalGet(IInvocation invocation, PropertyInfo property)

   в ATF.Repository.Builder.InstanceProxyHelper`1.Intercept(IInvocation invocation)

   в Castle.DynamicProxy.AbstractInvocation.Proceed()

   в Castle.Proxies.AccountProxy.get_WorkingTimes()

   в GetWorkingTimes(Object )

   в Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)

   --- Конец трассировки внутреннего стека исключений ---

   в Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)

   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)

   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)

   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)

   в Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)

   в Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer)

   в Newtonsoft.Json.JsonConvert.SerializeObject(Object value)

   в AutobookingPlatformIntegration.AccountIntegrationService.GetAccountById(Guid id)

   в SyncInvokeGetAccountById(Object , Object[] , Object[] )

   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)

   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)

   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)

   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

 

Кто нибудь сталкивался с таким поведением?



 

 

Нравится

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

Нашел в чем проблема. Не может десерелизовать в модель колонку с типом Время - https://prnt.sc/uhpw7o в DateTime. Кто работал с данным репозиторием знает решение данной проблемы?

Алексей, не вижу никаких упоминаний о ATF.Repository, кроме этой темы. Речь о тех ATF, которые сделали «.NET Core connector»? Там указан адрес на GitHub для связи с разработчиками. Возможно, они подскажут по этому механизму.

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

да, эти, писал и на почту, правда по другому вопросу, по текущему на гитхабе- пока ответа не получал

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

Подскажи, как можно сделать массовое добавление записей?

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

Код выполняется на сервере, в конфигурационном сервисе.

Нравится

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

Александр, у элемента вставки в БП есть возможность вставлять выборку из другого объекта с нужным фильтром.

Из того, что Вы хотите, нет разве что указания количества. Возможно, получится через view с привязанным объектом, там в SQL-запросе можно сразу прописать и фильтр, и количество.

 

Ну или всю логику и считывания, и вставки реализовать в C#-скрипте с использованием классов ESQ или Select и Insert.

Зверев Александр, Реализовать надо в сервисе, выходит только через Select

Query selectQuery = new Select(UserConnection).Top(numberCountForNumberPool)
	.Column(Column.Parameter(request)).Column(Column.Parameter(currentUserContactId))
	.Column(Column.Parameter(currentUserContactId))
	.Column("KtSimManagementInitialPoolNumbers", "KtIccid")
	.Column("KtSimManagementInitialPoolNumbers", "KtImsi")
	.Column("KtSimManagementInitialPoolNumbers", "KtMsisdn")
	.Column("KtSimManagementInitialPoolNumbers", "KtName")
	.Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue&lt;Guid&gt;(city.Name)))
	.Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue&lt;string&gt;(note.Name)))
	.Column(Column.Parameter(DateTime.UtcNow.Date))
	.Column(Column.Parameter(DateTime.UtcNow.Date
		.AddDays((int)Core.Configuration.SysSettings.GetValue(UserConnection,
			"DayCountForDedicatedPoolNumbers") + 1).AddSeconds(-1)))
	.From("KtSimManagementInitialPoolNumbers")
	.OrderByAsc("KtSimManagementInitialPoolNumbers", "KtName")
	.Join(JoinType.LeftOuter, "KtJasperFullNumberPool")
	.On("KtSimManagementInitialPoolNumbers", "KtName")
	.IsEqual("KtJasperFullNumberPool", "KtName")
	.Where("KtJasperFullNumberPool", "KtName")
	.IsNull()
	.And("KtSimManagementInitialPoolNumbers", "KtMarketCodeId")
	.IsEqual(Column.Parameter(cityForMarketCode));
InsertSelect insertSelectQuery = new InsertSelect(UserConnection)
	.Into("KtJasperFullNumberPool")
	.Set("KtRequestId", "ModifiedById", "CreatedById", "KtIccid", "KtImsi", "KtMsisdn", "KtName", "KtCityId", "KtNote", "KtReserveDate", "KtReserveToDate")
	.FromSelect(selectQuery);
int numberCountInserted = insertSelectQuery.Execute();

И все работает отлично, но на PostgreSQL, при установке на версию для Oracle ругается 

"ERROR IIS APPPOOL\CreatioCRMOracle Terrasoft.Web.Common.ServiceModel.ErrorHandler ProvideFault - Псевдоним колонки запроса не может быть пустым".

 

Что бы понятно было - конфигурации полностью одинаковые, просто dev среда на PostgreSQL а Prod на Oracle. И вот найти проблему тут уже не как не выходит

А на какое именно место в коде ругается? Если просто Select, без Insert, то тоже? Попробуйте последовательно запускать Select без разных колонок, чтобы выяснить, в какой из них дело.

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

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

Прикладываю скрины.



Версия: 7.16.2

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

Нравится

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

Артём,  сейчас такое не поддерживается, считываются только календари владельца ящика. Зарегистрировал пожелание.

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

Добрый день.

Мной разработан конфигурационный веб-сервис

 

[ServiceContract]
   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
   public class ConnectorService : BaseService
   {
      [OperationContract]
      [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
      public bool CreateContact(string firstName, string middleName, string lastName)
      {
...
return true;
}
}



На страницах академии есть материалы о том как вызвать конфигурационный веб-сервис с с помощью Postman или ServiceHelper, но нет информации как его вызвать со страницы другого веб-сайта, например с использованием API XMLHttpRequest.  Функциональность и работоспособность веб-сервиса проверена с помошью Postman. Все работает.

Однако указанный метод  веб-сервиса должен вызываться со страницы стороннего сайта (доступ к которой имеется). 

Подскажите как вызвать конфигурационной веб-сервис Creatio со страницы другого веб-сайта. Желательно с примерами. 

Нравится

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

Андрей, пример использования XMLHttpRequest для POST есть тут, но это наоборот, вызов со страниц 7.Х внешнего сервиса. В обратном направлении должно быть аналогично, но нужно учитывать необходимость авторизации при помощи AuthService и получение всех нужных кук, либо делать его доступным анонимно. Также по поводу возможных ограничений при работе с другого домена и путей их обхода см. темы: 1, 2, 3.

 

Другой вариант — работать с веб-сервисом не из браузера, а из серверного кода другого сайта. Конкретная реализация зависит от языка, на котором он написан: PHP, C#, Java, JS и др.

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

Каким образом можно, кликнув на номер телефона в Creatio, сделать звонок через tel-протокол?

То есть,  кликать по ссылке вида "tel: +35722444032"? Желательно, глобально, а не переопределяя каждое поле

 

Нравится

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

Владимир, вопрос обсуждали тут и тут.

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

/**
 * Starts call in CTI panel.
 * @param {String} number Phone number to call.
 * @return {Boolean} False, to stop click event propagation.
 */
onCallClick: function(number) {
	return this.callContact(number, this.$Id, this.$Account);
}

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

/**
 * Starts phone call in CTI panel.
 * @protected
 * @param {String} number Phone number to call.
 * @param {String} entitySchemaName Customer field entity schema name.
 * @param {String} customerId Customer record unique identifier.
 * @param {Terrasoft.Collection} relationFields Call instance crelation column values collection.
 * @return {Boolean} False to stop click event propagation.
 */
makeCall: function(number, entitySchemaName, customerId, relationFields) {
	if (this.isNotEmpty(number)) {
		this.sandbox.publish("CallCustomer", {
			number: number,
			customerId: customerId,
			entitySchemaName: entitySchemaName,
			callRelationFields: relationFields
		});
	}
	return false;
},

Также пробовал просто создавать средство связи типа «web» и там писать ссылку с tel и цифрами, но так работать не будет.

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