Добрый день! Пытался обновить версию OData по инструкции:

https://academy.terrasoft.ru/documents/technic-sdk/7-16/integraciya-s-creatio-po-protokolu-odata-4?_ga=2.183260710.1232967641.1598249864-1095365786.1598249864

 

Добавил в Web.Config, который находится в корневой папке в блок 

строку:

Сохранил файл конфигурации.

Следующий запрос через Postman для проверки возвращает статус 404: 

http://myapp/0/odata/Employee?$filter=FullJobTitle eq 'Developer' and Account/Name ne 'Our company'

 

В то же время запрос для версии OData 3 возвращает статус 200:

http://myapp/0/ServiceModel/EntityDataService.svc/EmployeeCollection?$f… eq 'Developer' and Account/Name ne 'Our company'

 

Полная компиляция, очистка редис и перезапуск приложения в IIS не помогло.

Версия продукта 7.15.0.634

Нравится

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

Доброго дня, коллеги!

 

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

 

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

 

Заранее благодарю!

Нравится

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

Здравствуйте, Михаил!

 

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

Команда разработки ответственная за этот функционал в курсе существования этой проблемы и будет работать над внедрением ее решения в будущих релизах Creatio.

 

Вы можете вывести данный справочник как раздел. Тогда задача будет решена.

 

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

Здравствуйте, Михаил!

 

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

Команда разработки ответственная за этот функционал в курсе существования этой проблемы и будет работать над внедрением ее решения в будущих релизах Creatio.

 

Вы можете вывести данный справочник как раздел. Тогда задача будет решена.

 

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

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

Доброго времени суток. 

Установил приложение из маркетплейса Multiple choice field setup for Creatio

https://marketplace.terrasoft.ru/app/multiple-choice-field-setup-creatio

Поле было установлено по инструкции и проблем не было. В данный момент поле переместилось во вкладку и при смене вкладок отображение сбрасывается.

Инициализация миксина во время смены таба ничего не дала.

Как при смене таба подгружать отображение значений данного поля ?

Нравится

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

Добрый день, Дмитрий,

 

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

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

 sales creatio enterprise edition cloud 7.16.2.1600

Поле отображено в группе полей во вкладке JobTabContainer

{
                "operation": "insert",
                "name": "CallTabGroupFunctionalPractice",
                "values": {
                    "itemType": 15,
                    "markerValue": "added-group",
                    "items": []
                },
                "parentName": "JobTabContainer",
                "propertyName": "items",
                "index": 1
            },
            {
                "operation": "insert",
                "name": "FunctionalPracticeTabs",
                "values": {
                    "itemType": 0,
                    "items": []
                },
                "parentName": "CallTabGroupFunctionalPractice",
                "propertyName": "items",
                "index": 0
            },
Само поле
{
            "operation": "insert",
            "parentName": "FunctionalPracticeTabs",
            "propertyName": "items",
            "name": "ContactAndFunctionalPractice",
            "values": {
                        "className": "Terrasoft.MultiChoiceCombobox",
                        "bindTo": "ContactAndFunctionalPractice",
                        "dataValueType": Terrasoft.DataValueType.ENUM,
                        "layout": {
                            "colSpan": 18,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 1
                        },
                        "labelConfig": {
                        "caption":{
                            "bindTo": "Resources.Strings.FunctionalPracticeCaption"
                        }
                    }
                }
            },



Кейс:

1)В случае если parentName не Header.



- Заходим страницу редактирования ->переключаем таб-> Ранее установленные значения не отобразились (Хотя в атрибуте они есть)

- Переключаем табы->Ранее установленные значения не отобразились (Хотя в атрибуте они есть)



2)В случае если parentName = Header и так же есть такое же поле на тот же атрибут но с другим названием.



пример:

{
            "operation": "insert",
            "parentName": "FunctionalPracticeTabs",
            "propertyName": "items",
            "name": "ContactAndFunctionalPractice",
            "values": {
                        "className": "Terrasoft.MultiChoiceCombobox",
                        "bindTo": "ContactAndFunctionalPractice",
                        "dataValueType": Terrasoft.DataValueType.ENUM,
                        "layout": {
                            "colSpan": 18,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 1
                        },
                        "labelConfig": {
                        "caption":{
                            "bindTo": "Resources.Strings.FunctionalPracticeCaption"
                        }
                    }
                }
            },
            {
            "operation": "insert",
            "parentName": "Header",
            "propertyName": "items",
            "name": "ContactAndFunctionalPracticeHeader",
            "values": {
                        "visible": {
                            "bindTo": "HidingAdditionalColumn"
                        },
                        "className": "Terrasoft.MultiChoiceCombobox",
                        "bindTo": "ContactAndFunctionalPractice",
                        "dataValueType": Terrasoft.DataValueType.ENUM,
                        "layout": {"column": 0, "row": 5},
                        "labelConfig": {
                            "caption":{
                                "bindTo": "Resources.Strings.FunctionalPracticeCaption"
                            }
                    }
                }





-- Заходим страницу редактирования ->Ранее установленные значения отобразились->Переключаем на нужную вкладку ->в ней так же Ранее установленные значения  отобразились ->переключаем  на любую вкладку и возвращаемся обратно ->Ранее установленные значения на вкладке не отобразились (А в поле на Header они остались)



На добавление, удаление итд отображение и функционал работает штатно

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

В случае если поле одно и 

parentName = Header  то весь функционал работает корректно, но заказчика это не устроит.



Все это происходит на замещающей ContactPageV2

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

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

Удалось воспроизвести ?

Добрый день, Дмитрий,

 

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

Добрый день, Дмитрий,

 

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

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

 

https://yadi.sk/d/GMI8yJxthi2XbA

Дмитрий, спасибо!

 

Передала схему ответственной команде.

Дмитрий, добрый день!

 

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

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

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

 

Такой вопрос: Я создаю несколько справочников, они должны хранить в своих полях id других справочников. Как мне реализовать эту связь в "Управление конфигурацией"? И как мне правильно их связать?

Нравится

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

Добрый день! Пример данной реализации можете посмотреть, например, в объекте LeadProduct.

Справочник основан на объекте. Чтобы добавить в него связь с другими справочниками (=объектами) найдите объект справочника и добавьте туда поле с типом "Справочник" и укажите название справочника, связь с которым необходимо добавить, при необходимости выполнив замещение объекта в пользовательском пакете (подробнее читайте в академии)

Добрый день! Пример данной реализации можете посмотреть, например, в объекте LeadProduct.

Справочник основан на объекте. Чтобы добавить в него связь с другими справочниками (=объектами) найдите объект справочника и добавьте туда поле с типом "Справочник" и укажите название справочника, связь с которым необходимо добавить, при необходимости выполнив замещение объекта в пользовательском пакете (подробнее читайте в академии)

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

Добрый день

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

настроить работу оператора в режиме автонабора

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

Это возможно ли сделать в рамках продуктов срм террасофт?

если да то что для этого нужно и как максимально быстро это можно реализовать? 



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

Нравится

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

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

 

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

 

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

 

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

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

Добрый день!

Делаю иерархическую деталь. Не работает отображение записей в детали. 

*Запрос отправляется.

*Ответ приходит.

*В объекте, по которому делается деталь, "Родитель иерархии" указан.

 

Код детали: 

define("NorbitContactProductDetail", ["ConfigurationGrid", "ConfigurationGridGenerator",
	 "ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "NorbitContactProduct",
		messages: {},
		mixins: {},
		attributes: {},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			/**
			 * Скрыть кнопку "Добавить".
			 */
			/*{
				"operation": "remove",
				"name": "AddRecordButton"
			},*/
 
			/**
			 * Подключение иерархии детали.
			 */
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"visible": true,
					"type": "listed",
					"hierarchical": true,
					"hierarchicalColumnName": "NorbitParentContactProduct",
					"useLevelRendering": true
				}
			},
		]/**SCHEMA_DIFF*/,
		methods: {
 
			addGridDataColumns: function (esq) {
			   this.callParent(arguments);
				if (!esq.columns.contains("Name")) {
					esq.addColumn("Name");
				}
				if (!esq.columns.contains("NorbitCount")) {
					esq.addColumn("NorbitCount");
				}
				if (!esq.columns.contains("NorbitParentContactProduct")) {
					esq.addColumn("NorbitParentContactProduct");
				}
			},
 
 
			/**
			 * Скрыть пункт меню "Копировать".
			 */
			getCopyRecordMenuItem: Terrasoft.emptyFn,
 
			/**
			 * Скрыть пункт меню "Изменить".
			 */
			getEditRecordMenuItem: Terrasoft.emptyFn,
 
			/**
			 * Скрыть пункт меню "Удалить".
			 */
			getDeleteRecordMenuItem: Terrasoft.emptyFn,
		}
	};
});

 

Нравится

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

Александр, смотрю в существующих схемах деталей, например, в ProjectStructureDetailV2:

"hierarchicalColumnName": "ParentId", 

Может, и у Вас надо было писать не NorbitParentContactProduct, а NorbitParentContactProductId?

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

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

 

Недавно вышло обновление к Creatio, где расширили функционал oData, а точнее добавили действие upsert, я хотел бы узнать, как правильно генерировать данный запрос?

Я работаю через postman.

 

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

Нравится

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

Михаил, для того, чтобы сделать upsert, нужно выполнить patch-запрос с указанием id в списке полей. Раньше если записи не было, возвращало ошибку, сейчас производится вставка. А если есть, то и раньше, и сейчас — изменение. Готовых именно таких примеров нет, о patch есть в справочнике по API.

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

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

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

Однако в Хронологии такой возможности нет :(

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

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

Нравится

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

Владимир, в обычных деталях, таких как «История», используют логику из BaseGridDetailV2, связанную с состоянием нажатия кнопки RelationshipButton. Если она нажата, через OR добавляется дополнительное условие фильтрации, то есть выбираются записи с детали, связанные не с текущей, а с дочерними.

/**
 * Returns filters collection.
 * @override
 * @return {Terrasoft.FilterGroup} Detail filter group.
 */
getFilters: function() {
	const detailFilters = this.get("DetailFilters");
	const masterColumnFilters = this.get("Filter");
	const serializationMasterColumnInfo = masterColumnFilters.getDefSerializationInfo();
	serializationMasterColumnInfo.serializeFilterManagerInfo = true;
	const serializationDetailInfo = detailFilters.getDefSerializationInfo();
	serializationDetailInfo.serializeFilterManagerInfo = true;
	const deserializedMasterColumnFilters = Terrasoft.deserialize(masterColumnFilters
		.serialize(serializationMasterColumnInfo));
	const deserializedDetailFilters = Terrasoft.deserialize(detailFilters.serialize(serializationDetailInfo));
	if (this.get("IsRelationshipButtonPressed")) {
		const mainFilterGroup = this.getRelationshipFilters();
		mainFilterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
		mainFilterGroup.add("masterRecordFilter", deserializedMasterColumnFilters);
		deserializedDetailFilters.add("mainFilterGroup", mainFilterGroup);
	} else {
		deserializedDetailFilters.add("masterRecordFilter", deserializedMasterColumnFilters);
	}
	return deserializedDetailFilters;
},

Сам фильтр такой:

/**
 * Returns the relationship filter.
 * @protected
 * @return {Terrasoft.FilterGroup} Relationship filter.
 */
getRelationshipFilters: function() {
	const mainFilterGroup = this.Ext.create("Terrasoft.FilterGroup");
	const relationshipFilterGroup = this.Ext.create("Terrasoft.FilterGroup");
	const masterRecordId = this.get("MasterRecordId");
	const detailColumnName = this.get("DetailColumnName");
	const relationTypePath = this.get("RelationTypePath");
	const relationshipPath = this.get("RelationshipPath");
	const relationType = this.get("RelationType");
	if (relationTypePath && relationshipPath && relationType) {
		relationshipFilterGroup.add("relationshipFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL,
			relationTypePath,
			relationType,
			Terrasoft.DataValueType.GUID));
		relationshipFilterGroup.add("relationshipTypeFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL,
			relationshipPath,
			masterRecordId,
			Terrasoft.DataValueType.GUID));
	} else {
		relationshipFilterGroup.add("relationshipFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL,
			this.getDefaultRelationshipPath(),
			masterRecordId,
			Terrasoft.DataValueType.GUID));
	}
	mainFilterGroup.add("subRelationshipFilterGroup", Terrasoft.createExistsFilter(
		detailColumnName,
		relationshipFilterGroup));
	return mainFilterGroup;
},

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

 

Если Ваше предложение заинтересует разработчиков системы, они запланируют в новых версиях такую кнопку и логику. Ранее уже была похожая идея, чтобы в хронологии контрагентов показывались все звонки и письма контактов, связанных с этим контрагентом, она тоже пока не реализовывалась.

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

Если Ваше предложение заинтересует разработчиков системы, они запланируют в новых версиях такую кнопку и логику. Ранее уже была похожая идея, чтобы в хронологии контрагентов показывались все звонки и письма контактов, связанных с этим контрагентом, она тоже пока не реализовывалась.

Думаю, это очень логично, учитывая, что такую логику уже реализовали в деталях. 

Ещё вдруг не реализовали эту идею?

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

Доброго времени суток! Я пытаюсь создать процесс, как в статье. В соответствии с инструкцией был создан процесс "Add New External Contact".Изображение удалено. Были добавлены параметры "Contact Name" и "Contact Phone" Изображение удалено.("Contact Phone" имеет полностью аналогичные параметры).

Задание-сценарий "Add contact" имеет имя "ScriptTaskAddContact" и код

// Создание экземпляра схемы объекта "Контакт".
var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
// Создание экземпляра нового объекта.
var entity = schema.CreateEntity(UserConnection);
// Установка значений по умолчанию для колонок объекта.
entity.SetDefColumnValues();
// Установка значения колонки "Name" из параметра процесса.
entity.SetColumnValue("Name", ContactName);
// Установка значения колонки "Phone" из параметра процесса.
entity.SetColumnValue("Phone", ContactPhone);
// Сохранение нового контакта.
entity.Save();
 
return true;

При попытке сохранить появляется две ошибки: 

The name 'ContactName' does not exist in the current context

и 

The name 'ContactPhone' does not exist in the current context

Пробовал переименовать параметры "Contact Name" и "Contact Phone" (ничего не дало), взять в кавычки ContactName и ContactPhone (сохранение проходит успешно, но при попытке обратиться к процессу через GET-запрос не происходит ничего, запрос завершается с кодом 200)

Нравится

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

Глеб, дело не в запуске из сервиса. Сейчас к параметрам нужно обращаться через Get и Set.

string contactName = Get<string>("ContactName");

Подробнее см. в теме.

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

Доброго дня, коллеги!

 

Я столкнулся с такой проблемой, что после обновления названий лидов (переопределения UpdateLeadName()) у меня при переводе в продаже, автоматически название формируется как [Клиент] / [Количество зарегистрированных по клиенту продаж + 1].

 

Если что, название лида у меня выглядит сейчас так: [Тип потребности] / [ФИО контакта], [Дополнительное название] (кастомная строка)

 

А я хочу сделать так, чтобы при формировании названия в качестве второго параметра передавалась моя строка, а не [Количество зарегистрированных по клиенту продаж + 1], как это сделать? То есть, результат должен выглядеть так: [Клиент] / [Дополнительное название].

 

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

Нравится

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

Примерно так 

Название продажи устанавливается в процессе LeadToOpportunity780



Но вы можете сделать свой процесс, который меняет название Opportunity после его создания (чтобы не замещать стандартный процесс)

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

А можете рассказать поподробнее, как это реализовать?

Примерно так 

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