В разделе есть поле IsExpertRecBadTurnoverNotify (логическое), которое должно быть доступно на чтение всем пользователям, и пользователям роли "ЗГД по маркетингу" на запись. Делаю настройку по инструкции:



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

Роль "ЗГД по маркетингу" организационная, впрочем, с функциональной ролью все так же.



Если я пытаюсь затем отредактировать это поле в странице раздела, система сообщает "Недостаточно прав для изменения значения колонки "IsExpertRecBadTurnoverNotify " объекта "Арендатор"".



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



В чем проблема, почему не работает доступ по колонкам?

Нравится

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

Если не работает надо раздавать видимость через код карточки и право доступа на операции, это более контролируемая функциональность.

Юрий, попробуйте сначала просто выполнить действие «Актуализировать роли» в разделе «Пользователи».

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

Добрый день. Есть деталь от FileDetailV2, нужно сделать так, чтобы в зависимости от настроек, сделанных на странице редактирования, в детали показывалась кнопка "добавить". В детали я определяю атрибут:

"isAddVisible": {
   dataValueType: Terrasoft.DataValueType.BOOLEAN,
   type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
   value: true
}

и добавляю в diff:

{
  "operation": "merge",
  "name": "AddRecordButton",
  "values": {
    "visible": { bindTo: "isAddVisible" }
  }
}

В схеме страницы в diff определена деталь:

{
  "operation": "insert",
  "name": "UsrReportFileDetail",
    "values": {
      "itemType": 2,
      "markerValue": "added-detail",
      "isAddVisible": "false"
    },
    "parentName": "NotesAndFilesTab",
    "propertyName": "items",
    "index": 0
 }

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

Нравится

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

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

{

                "operation": "merge",

                "name": "AddRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "tag": "addFileButton",

                    "fileUpload": true,

                    "filesSelected": {"bindTo": "onFileSelect"},

                    "click": {"bindTo": "onAddFileClick"},

                    "visible": {"bindTo": "getAddRecordButtonVisible"},

                    "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}

                }

            }

Юрий, а зачем там «value: true» в свойствах атрибута? Он задаётся для виртуальных колонок с фиксированным значением, а для каждый раз вычисляемых  функцией — не нужен. Пример приводил в теме ниже.

 

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

 

Попробуйте передавать свой параметр не в diff, а как из карточки на её детали передают свойства вроде filterMethod или useRelationship:

details: /**SCHEMA_DETAILS*/{
...
	OpportunityContact: {
		schemaName: "OpportunityDetailV2",
		filter: {
			masterColumn: "Contact",
			detailColumn: "Contact"
		},
		defaultValues: {
			Contact: {
				masterColumn: "Contact"
			}
		},
		useRelationship: false,
		filterMethod: "opportunityAccountFilter",
		captionName: "CustomerOpportunitiesCaption"
	},

 

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

{

                "operation": "merge",

                "name": "AddRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "tag": "addFileButton",

                    "fileUpload": true,

                    "filesSelected": {"bindTo": "onFileSelect"},

                    "click": {"bindTo": "onAddFileClick"},

                    "visible": {"bindTo": "getAddRecordButtonVisible"},

                    "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}

                }

            }

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

Есть раздел UsrTenant, в нем есть поле Room, принимающее значения из справочника UsrRoom. В свою очередь, в UsrRoom есть поле-справочник Shop, принимающее значение из справочника UsrShop. В UsrShop есть текстовое поле Name. Задача - показать в карточке UsrTenant значение UsrTenant.Room.Shop.Name (сделать привязку элемента управления на это значение), лучше в режиме "только чтение". Как это сделать?



Теоретически, можно прикрутить к UsrTenant атрибут, привязать к нему элемент управления в diff, в UsrTenant.onEntityInitialized() определять значение Room.Shop.Name через EntitySchemaQuery и присваивать его атрибуту. Но нет ли способа, позволяющего напрямую привязать элемент управления по такой иерархии? Что-то, может, вроде:

 

// Конечно, прямо в таком виде код не работает, выдается ошибка, 
// что невозможно найти колонку по конфигурации Room.Shop.Name
{
  "operation": "insert",
  "name": "ShopNameView",
  "values": {
    "layout": {
      "colSpan": 12,
      "rowSpan": 1,
      "column": 12,
      "row": 1,
      "layoutName": "Header"
    },
    "bindTo": "Room.Shop.Name",
    "enabled": false,
    "contentType": 5
  },
  "parentName": "Header",
  "propertyName": "items",
  "index": 3
}

 

Нравится

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

Добрый день.

 

В атрибутах добавляете виртуальное поле, которое будет отображаться в карточке:

			"DBMReady": {
				"dataValueType": Terrasoft.DataValueType.BOOLEAN,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"value": false
			}

В атрибутах указываете, какие поля справочного поля нужно ещё получить:

			"BTContactPatient": {
				"lookupListConfig": {
					"columns": ["BTDBMReady"]
				}
			},

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

			onEntityInitialized: function() {
				this.callParent(arguments);
				if (!this.isNew) {
					this.setPatientFieldsValue();
					}
			},
			setPatientFieldsValue: function() {
				var patient = this.get("BTContactPatient");
				if (!patient) {
					return;
				}
				this.set("DBMReady", patient.BTDBMReady);
			},

 

Алла Савельева,

Добрый день. Может, я не совсем точно донес свою мысль...



В общем, моя ситуация такова, что BTDBMReady - не скалярное значение, а ссылка на справочник. И атрибуту на странице мне нужно присвоить, например, BTContactPatient.ВTDBMReady.CustomParameter (т.е. простым

ВTDBMReady.displayValue тут не обойтись). Можно ли это сделать без EntitySchemaQuery? 

Юрий, а почему не использовать EntitySchemaQuery?

Пример заполнения виртуальных полей таким образом есть в OpportunityMiniPage пакета Opportunity:

/**
 * Last activity in opportunity.
 * @type {Object}
 */
"LastActivity": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"referenceSchemaName": "Activity"
},
 
/**
 * Last activity result caption in opportunity.
 * @type {String}
 */
"LastActivityCaption": {
	"dataValueType": Terrasoft.DataValueType.TEXT,
	"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"value": ""
},
...
onEntityInitialized: function() {
...
	this.getLastActivity();
...
	this.callParent(arguments);
},
...
/**
 * Gets last activity from opportunity.
 * @protected
 */
getLastActivity: function() {
	var esq = this.getLastActivitySelect();
	esq.getEntityCollection(function(response) {
		if (response && response.success) {
			var collection = response.collection;
			if (collection.getCount() > 0) {
var firstItem = collection.getByIndex(0);
this.setLastActivityAttributes(firstItem);
			}
		}
	}, this);
},
 
/**
 * Sets last activity attributes.
 * @protected
 * @param {Object} activity Activity object from response.
 */
setLastActivityAttributes: function(activity) {
	var date = this.getShortDate(activity.get("DueDate"));
	this.set("LastActivityCaption", Ext.String.format(
			this.get("Resources.Strings.LastActivityCaption"), date));
	this.set("LastActivity", {
		value: activity.get("Id"),
		displayValue: Ext.String.format("{0} / {1}", activity.get("CategoryName"),
				activity.get("StatusName"))
	});
},
 
/**
 * Gets last activity select.
 * @protected
 * @return {Terrasoft.EntitySchemaQuery} Last activity select query.
 */
getLastActivitySelect: function() {
	var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.rowCount = 1;
	esq.addColumn("Status.Name", "StatusName");
	esq.addColumn("ActivityCategory.Name", "CategoryName");
	var dueDate = esq.addColumn("DueDate");
	dueDate.orderPosition = 0;
	dueDate.orderDirection = Terrasoft.OrderDirection.DESC;
	this.setLastActivityRequestFilters(esq);
	return esq;
},
 
/**
 * Sets last activity filters.
 * @protected
 * @param {Terrasoft.EntitySchemaQuery} esq Activity select query.
 * @return {Terrasoft.EntitySchemaQuery} Activity select query with filter.
 */
setLastActivityRequestFilters: function(esq) {
	var id = this.get("Id");
	if (!Ext.isEmpty(id)) {
		esq.filters.add("opportunityFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL, "Opportunity", id));
	}
	return esq;
},

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

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

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



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



Вроде бы все должно работать, и значение поля CalculatedValue должно вычисляться после загрузки страницы и после изменения значений в полях TurnoverF и TurnoverP. Но реально изменение случается только при загрузке страницы - т.е. метод, прописанный в dependencies, не срабатывает. Почему?

entitySchemaName: "UsrTenant",
attributes: {
 "CalculatedValue": {
     dataValueType: Terrasoft.DataValueType.FLOAT,
     dependencies: {
       columns: ["TurnoverF", "TurnoverP"], 
       methodName: "calculateValue"
     }
  }
},
methods: {
  onEntityInitialized: function() {
    this.callParent(arguments);				
    this.calculateValue();
  },
  calculateValue: function() {
    var turnoverF = this.get("TurnoverF");
    if (!turnoverF) {
      turnoverF = 0;
    }
    var turnoverP = this.get("TurnoverP");
     if (!turnoverP) {
       turnoverP = 0;
     }				
    var result = (turnoverP === 0) ? 0 : (turnoverF / turnoverP - 1);
    this.set("CalculatedValue", result);
  }
},
diff : {
//.....................
{
  "operation": "insert",
  "name": "INT_TurnoverF",
  "values": {
    "layout": {
      "colSpan": 12,
      "rowSpan": 1,
      "column": 0,
      "row": 0,
      "layoutName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333"
    },
    "bindTo": "TurnoverF",
    "enabled": true
  },
  "parentName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333",
  "propertyName": "items",
  "index": 0
},
{
  "operation": "insert",
  "name": "INT_TurnoverP",
  "values": {
    "layout": {
      "colSpan": 12,
      "rowSpan": 1,
      "column": 12,
      "row": 0,
      "layoutName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333"
    },
    "bindTo": "TurnoverP",
    "enabled": true
  },
  "parentName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333",
  "propertyName": "items",
  "index": 1
},
{
  "operation": "insert",
  "name": "INTCalculatedValue",
  "values": {
    "caption": "Вычисляемое поле",
    "bindTo": "CalculatedValue",
    "layout": {
      "column": 12, 
      "rowSpan": 1,
      "row": 4, 
      "layoutName": "Header",
      "colSpan": 9
    }
  },
  "parentName": "Header",
  "propertyName": "items",
  "enabled": true,
  "index": 9
},
//.....................
}

 

Нравится

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

Добрый день.

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

	"dependencies": [
		{
			"columns": ["Patient"],
			"methodName": "setPatientFieldsValue"
		}
	]

 

Добрый день.

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

	"dependencies": [
		{
			"columns": ["Patient"],
			"methodName": "setPatientFieldsValue"
		}
	]

 

Алла Савельева,

как и предполагалось, ошибка была абсолютно дурацкой...

Спасибо!

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

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

Введется разработка в пользовательском пакете, нужно добавить текстовое поле в замещающий объект Файл таким образом, что бы другие объекты, такие как AccountFile, ContactFile, тоже унаследовались от моего объекта Файл и имели в себе новое текстовое поле.

Насколько я понял решение состоит в настройке зависимости пакетов, но не до конца понимаю как должна выставляться иерархия. В настройках пакета стоит зависимость от Base

Нравится

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

Илья, это разные явления,  замещение в разных пакетах схемы с одним и тем же именем и наследование (в одном или разных пакетах) одних схем от других с разными именами (например, ContactFile на основе базового File).

 

Если бы и базовая, и наследуемая схема были бы в одном пакете, после добавления поля в File было бы достаточно пересохранить AccountFile. Но у Вас схема есть только в коробочном пакете, её менять не получится.

 

Видимо, Вам нужно заместить File в пакете Custom (или другом, где разрабатываете), добавить поле, сохранить и опубликовать. Затем в том же пакете Custom заместить уже AccountFile, ContactFile, где появится и новая колонка, тоже сохранить и опубликовать, чтобы новая колонка создалась в БД.

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

Можно ли ограничить определенным ролям возможность экспорта данных в excel?

 

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

 

Позволяет ли Creatio такое, если да, то какие параметры в организации ролей за это отвечают? 

Нравится

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

Добрый день.

Да, это можно сделать через доступ на системную операцию [Экспорт реестра]. Ознакомиться с информацией о настройках прав доступа на системные операции Вы можете по этой ссылке.

Добрый день.

Да, это можно сделать через доступ на системную операцию [Экспорт реестра]. Ознакомиться с информацией о настройках прав доступа на системные операции Вы можете по этой ссылке.

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

Есть необходимость записывать в объект File поля Name и Notes через всплывающее окно. Не могу определить что нужно использовать, ModalBox или MiniPage. Вкратце задача состоит в том, чтобы при вводе поля Name генерировать ссылку и записывать её в поле Notes. 

Получилось создать ModalBox, но не удалось найти как сохранять поля в базу данных, также как через метод this.save(); в BasePage.

А вызывать MiniPage своей же кнопкой, совсем не удалось

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

Нравится

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

Здравствуйте, Илья!

 

Как программно открыть мини-карточку описано тут. Но для того, чтобы этом метод работал, Вам необходимо зарегистрировать мини-карточку - это описано тут

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

Есть справочник, унаследованный от базового справочника, со стандартными полями Id, Name, Description.

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

Есть раздел, в котором есть поле, принимающее значения из этого справочника (UsrYesNo), а также ряд других полей, содержащих значения INTEGER (UsrIntValue), TEXT (UsrTextValue) и т.п.



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

 

// Возвращает целочиcленное значение, работает корректно
var a = this.get("UsrIntValue");
// Возвращает строковое значение, работает тоже корректно
var b = this.get("UsrTextValue");
// По идее, должно возвращать значение из справочника, выбранное для записи раздела.
// Но по факту выдает undefined.
var c = this.get("UsrYesNo.Name");

Что я делаю не так?

Нравится

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

Генин Юрий пишет:

var c = this.get("UsrYesNo").Name;

Да, верно. Мы берём поле и читаем его атрибуты. 

Указать эту колонку в attributes

attributes: {
     "UsrYesNo": {
          "dataValueType": Terrasoft.DataValueType.LOOKUP,
          "lookupListConfig": {
               "columns": ["Name"]
            }
      }
 }

Или в данном случае достаточно взять this.get("UsrYesNo").displayValue

Владимир Соколов,

Вариант с this.get("UsrYesNo").displayValue сработал, спасибо. Но добавление атрибута (в схему страницы редактирования) ничего не поменяло:  this.get("UsrYesNo.Name") все равно возвращает undefined. 

Владимир Соколов,

А вот так, кстати, сработало:

attributes: {
     "UsrYesNo": {          
          lookupListConfig: {
               columns: ["Name"]
            }
      }
 }

и

var c = this.get("UsrYesNo").Name;

Интересно, почему...

Генин Юрий пишет:

var c = this.get("UsrYesNo").Name;

Да, верно. Мы берём поле и читаем его атрибуты. 

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

Добрый день. Прошу помощи - третий день мучаюсь с этой задачкой. Есть страница редактирования. В ней есть деталь, отображающая (только чтение) записи из того же реестра. Отбор записей в деталь должен проводиться по ряду условий, связанных с полями основной записи на странице редактирования. Мысль в том, чтобы по этим условиям отобрать через EntitySchemaQuery несколько Id и назначить их в фильтр детали через createColumnInFilterWithParameters.



Проблема в том, что результаты EntitySchemaQuery.getEntityCollection отрабатываются в callback-функции, и происходит это в большинстве случаев позже, чем завершается работа функции filterMethod детали, в которой делается вызов getEntityCollection. Фильтр получается пустым.



Ниже проблемный код:

// функция назначена как "filterMethod" детали
applyFilter: function() {
    //
    var vFGroup = Terrasoft.createFilterGroup();
    vFGroup.logicalOperation = Terrasoft.LogicalOperatorType.AND;
 
    //
 
    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "Tenants"
    });
 
    esq.addColumn("Id");
    esq.addColumn("ReportMonth");
    esq.addColumn("Area");
 
    var vArea = this.get("Area");
 
    // фильтры запроса - должна совпадать дата, и площадь быть в +-20%                    
    esq.filters.add("ReportMonthFilter", 
        esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
            "ReportMonth", this.get("ReportMonth")));
    esq.filters.add("AreaFilter", 
        esq.createColumnBetweenFilterWithParameters("Area", 
            vArea * 0.8, vArea * 1.2));
 
    // до этого места все работает корректно 
    // теперь запускаем запрос и получаем данные
     // насколько я понимаю, архитектурно система распараллеливает задачи,
    // т.е. function(result) и следующая инструкция после getEntityCollection()
    // начинают отрабатываться одновременно
    esq.getEntityCollection(function (result) {
        if (result.success) {
 
            // добавляем фильтр как UID по списку
            // здесь так можно, больших выборок не предполагается
            var vSelected = [];                        
            result.collection.each(function (item) {
                vSelected.push(item.get("Id"));
            });
 
            var vIdF = Terrasoft.createColumnInFilterWithParameters("Id", vSelected);
 
            // нужно как-то гарантировать, чтобы эта операция всегда выполнялась раньше, чем 
            // return vFGroup; в конце функции. Иначе в фильтры попадает пустой список, и фильтр
            // не работает. 
            vFGroup.add("vIdF", vIdF);
        }
    }, this);
 
    // Интересно, что при первом открытии детали после обновления 
    // страницы операция return vFGroup; 
    // выполняется корректно, т.е. после vFGroup.add("vIdF", vIdF);. 
    //Если дальше закрыть страницу и через реестр
    // открыть другую запись - уже не работает.
 
    // Также интересно, что если вбить вот сюда:
    // window.alert("!");
    // то пауза будет достаточна для формирования vFGroup 
    // независимо от того, в первый раз я открываю
    // запись или нет
 
    return vFGroup;
},

 

Нравится

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

Согласен с Александр Зверев

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

Главное не забыть что во фьюхе должны быть также служебные поля:



DROP VIEW IF EXISTS dbo.VwCaseGroup

GO

CREATE VIEW dbo.VwCaseGroup

AS SELECT

  SAU.ContactId AS Id,

  SUR.SysRoleId,

  SUR.CreatedById,---------<

  SUR.ModifiedById,---------<

  SUR.CreatedOn,---------<

  SUR.ModifiedOn,---------<

  SUR.ProcessListeners---------<

FROM dbo.SysAdminUnit SAU

JOIN dbo.SysUserInRole SUR ON SAU.Id = SUR.SysUserId

GO

Сорри, уже сам разобрался. Надо было всего-то создать property для списка UID и перенести его подгрузку в onEntityInitialized, оставив в applyFilter только сортировку и создание итогового фильтра для детали. 

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

Юрий, вообще, такая постановка намекает, что можно в БД сделать view с нужными данными: каждому Id записи в основном разделе будет соответствовать несколько строк для отображения на детали по нужному условию.

 

Создать объект с такими же колонками, привязать к этой view и далее в разделе настроить деталь стандартными средствами без всякого кода.

Согласен с Александр Зверев

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

Главное не забыть что во фьюхе должны быть также служебные поля:



DROP VIEW IF EXISTS dbo.VwCaseGroup

GO

CREATE VIEW dbo.VwCaseGroup

AS SELECT

  SAU.ContactId AS Id,

  SUR.SysRoleId,

  SUR.CreatedById,---------<

  SUR.ModifiedById,---------<

  SUR.CreatedOn,---------<

  SUR.ModifiedOn,---------<

  SUR.ProcessListeners---------<

FROM dbo.SysAdminUnit SAU

JOIN dbo.SysUserInRole SUR ON SAU.Id = SUR.SysUserId

GO

Генин Юрий,

На всякий случай, для будущих читателей этого треда: вариант с EntitySchemaQuery плох тем, что при больших выборках не успевает отработать до открытия пользователем вкладки с деталью, что приводит к визуальному отсутствию фильтрации. Схема с VIEW этого недочета лишена.

 

 

 

 

 

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

Добрый день.

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

 

[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 и др.

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