Добрый день. Есть созданый нами сервис (по образцу базового ReportService), который возвращает по записи детали объекта pdf-файл. На десктопной версии креатио работа с ним настроена, возникли сложности с реализацией аналогичного в мобильном приложении.

По подробностям: на десктопе сервис на странице записи детали по нажатию кнопки получает значение поля и в ответ открывает файл на новой странице. Как именно что-то подобное сделать для записей детали на мобильном приложении? Есть ли какие-то нюансы с открытием pdf в мобильном приложении креатио?

Нравится

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

Добрый день!

 

Позвольте привести пример скачивания и автоматического открытия файла с использованием базового FileService/GetFile (сервис и метод, которые триггерятся если в декстопной версии из детали с файлами выгрузить какой-либо файл) в мобильном приложении. Для этого:

1) Была создана кастомная кнопка в действиях на странице контакта в мобильном приложении

2) Был создан обработчик для нажатия на эту кнопку

Как это было достигнуто:

1) В конфигурации создать модуль UsrMyAction с кодом

Ext.define("Terrasoft.MyAction", {
	extend: "Terrasoft.ActionBase",
	config: {
		useMask: false,
		title: "MyActionTitle",
		iconCls: Terrasoft.ActionIcons.Copy
	},
 
	execute: function(record) {
		this.callParent(arguments);
		var config = {
			url: 'https://1168222internal-demo.creatio.com/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4/3bbbd5a8-8f8d-4570-8526-0488eb37da28',
			success: function(fullPath, relativePath) {
				Terrasoft.FileIntent.open({
					path: relativePath
				});
			}, 
			name: "Test_" + new Date().toDateString() + ".png"
		};
 
		Terrasoft.RequestManager.issueRequest({
					requestFn: Terrasoft.FileTransfer.download,
					requestFnConfig: config,
					responseToStatusCodeFn: Terrasoft.FileTransfer.getStatusCodeFromException,
					loginFailure: function(exception) {
						Ext.callback(config.failure, config.scope, [exception]);
					},
					suppressRequestEvents: config.suppressRequestEvents,
					scope: Terrasoft.FileTransfer
				});
		this.executionEnd(true);
	}
 
});

 

В нем создать локал.строку с кодом MyActionTitle и каким-то значением для этой локал.строки (например "Call custom service").

2) В конфигурации создать модуль UsrMobileContactModuleConfig с кодом

Terrasoft.sdk.Actions.add("Contact", {
    name: "myAction",
    actionClassName: "Terrasoft.MyAction"
});



3) В манифесте мобильного приложения добавить:

"CustomSchemas": [

"UsrMyAction"

],

...

"Models": {

...

"Contact": {

...

"PagesExtensions": [

"UsrMobileContactModuleConfig"

]

Пример манифеста из демо сайта для тестов, где тестировалась логика – файл MobileApplicationManifestDefaultWorkplace.txt ниже:

{
	"CustomSchemas": [
        "UsrMyAction"
    ],
	"SyncOptions": {
		"SysSettingsImportConfig": [
			"DefaultMessageLanguage"
		],
		"ModelDataImportConfig": [
			{
				"Name": "Contact",
				"SyncColumns": []
			},
			{
				"Name": "SysLanguage",
				"SyncColumns": []
			},
			{
				"Name": "ContactFile",
				"SyncColumns": [
					"Contact",
					"CreatedOn",
					"CreatedBy",
					"Name",
					"Data",
					"Type",
					"Size"
				]
			},
			{
				"Name": "FileGroup",
				"SyncColumns": []
			},
			{
				"Name": "ContactCommunication",
				"SyncColumns": [
					"CommunicationType",
					"Number",
					"Contact"
				]
			},
			{
				"Name": "CommunicationType",
				"SyncColumns": []
			},
			{
				"Name": "ContactAddress",
				"SyncColumns": [
					"AddressType",
					"Country",
					"Region",
					"City",
					"Address",
					"Zip",
					"Contact"
				]
			},
			{
				"Name": "AddressType",
				"SyncColumns": []
			},
			{
				"Name": "Country",
				"SyncColumns": []
			},
			{
				"Name": "Region",
				"SyncColumns": []
			},
			{
				"Name": "City",
				"SyncColumns": []
			},
			{
				"Name": "ContactAnniversary",
				"SyncColumns": [
					"Date",
					"AnniversaryType",
					"Contact"
				]
			},
			{
				"Name": "AnniversaryType",
				"SyncColumns": []
			},
			{
				"Name": "FileType",
				"SyncColumns": []
			},
			{
				"Name": "SocialMessage",
				"SyncColumns": [
					"EntityId"
				]
			}
		]
	},
 
	"Modules": {},
	"Models": {
		"ContactFile": {
			"RequiredModels": [
				"ContactFile",
				"FileGroup",
				"SocialMessage"
			],
			"ModelExtensions": [],
			"PagesExtensions": [
				"UsrMobileContactFileActionsSettingsDefaultWorkplace",
				"UsrMobileContactFileGridPageSettingsDefaultWorkplace",
				"UsrMobileContactFileRecordPageSettingsDefaultWorkplace"
			]
		},
		"SocialMessage": {
			"RequiredModels": [],
			"ModelExtensions": [],
			"PagesExtensions": []
		},
		"Contact": {
			"RequiredModels": [
				"Contact",
				"SysLanguage",
				"ContactFile",
				"FileGroup",
				"ContactCommunication",
				"CommunicationType",
				"ContactAddress",
				"AddressType",
				"Country",
				"Region",
				"City",
				"ContactAnniversary",
				"AnniversaryType",
				"FileType"
			],
			"ModelExtensions": [],
			"PagesExtensions": [
				"UsrMobileContactModuleConfig"
			]
		}
	},
	"ModuleGroups": {
		"main": {}
	},
	"UseUTC": true
}



4) Обязательно выполнить рисайкл пула приложения (не перезапуск сайта в IIS, а именно рисайкл пула).

Сама логика скачивания файла и его открытие реализована в модуле UsrMyAction:

var config = {

url: 'https://1168222internal-demo.creatio.com/0/rest/FileService/GetFile/e9e…

success: function(fullPath, relativePath) {

Terrasoft.FileIntent.open({

path: relativePath

});

},

name: "Test_" + new Date().toDateString() + ".png"

};

Terrasoft.RequestManager.issueRequest({

requestFn: Terrasoft.FileTransfer.download,

requestFnConfig: config,

responseToStatusCodeFn: Terrasoft.FileTransfer.getStatusCodeFromException,

loginFailure: function(exception) {

Ext.callback(config.failure, config.scope, [exception]);

},

suppressRequestEvents: config.suppressRequestEvents,

scope: Terrasoft.FileTransfer

});

Какие здесь ключевые моменты:

1) https://1168222internal-demo.creatio.com/0/rest/FileService/GetFile/e9e… получить файл (кстати, здесь можно немного заменить код на следующий:

var config = {

url: Terrasoft.CurrentUserInfo.serverUrl + '0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4/3bbbd5a8-8f8d-4570-8526-0488

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

2) "Test_" + new Date().toDateString() + ".png" - это название файла, который будет подгружен и автоматически открыт. Здесь важно еще контролировать расширение скачиваемого файла, но если в 100% случаев будет скачиваться PDF, то можно здесь просто захардкодировать расширение .pdf.

3) За подгрузку файла отвечает метод Terrasoft.RequestManager.issueRequest, в который мы передаем в config ссылку откуда нам нужно получить файл и что делать в случае успешного выполнения метода issueRequest (здесь можно добавить и failure обработчик).

4) На success п.3 запускается метод Terrasoft.FileIntent.open который и отвечает за автоматическое открытие файла.

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

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

Что нужно заменить:

1) Кастомную кнопку с действием я добавлял на карточку контакта. Вы же можете ее добавить в карту детали с файлами (подход тот же, только вместо Contact – название объекта детали). Ну или можете динамически вычитывать записи из детали и выбирать подходящую.

2) Продумать как реализовать названия файлов (опять же, можно считывать оригинальный файл из детали, брать его название и вставлять в параметр name).

Результат (тестировал и на iOS физическом девайсе и в эмуляторе в Android studio):

1) Сама кнопка:

 

2) Нажатие на кнопку:

 

Далее файл можно сохранить:

 

 

потестируйте и продолжайте кастомизировать под Ваш сервис.

 

 

Показать все комментарии
обновление
Sales_Creatio
конфигурация
сервис
выгрузка
7.16

Добрый день, занимаюсь обновлением creatio sales c 7.16 на 7.18,

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

Файл downloader.json настроил следующим образом:

{

    "WebRootDirectory": "C:\inetpub\wwwroot\Sales",

    "WorkDirectory": "C:\copy",

    "Site": "название из IIS",

    "Product": "SalesEnterprise",

    "DbEngineType": "PostgreSQL",

    "VersionBuild": "7.16.1.2135",

    "SkipBinary": "true",

    "ConnectionString": "Server=1.2.3.4;Port=5432;Database=crm;User ID=postgres;password=12345;Timeout=500;CommandTimeout=400;MaxPoolSize=1024;",

    "CurrentSchemaName": "public"

}

Часть данных в конфиге и логах обезличил.

Папка с UpdateService находится в корне диска с дистрибутивом на сервере.

Вот лог ошибок:

ConvertFrom-Json : Нераспознанная escape-последовательность. (29): {

        "WebRootDirectory": "C:\inetpub\wwwroot\Sales",

        "WorkDirectory": "C:\copy",

        "Site": "название из IIS",

        "Product": "SalesEnterprise",

        "DbEngineType": "PostgreSQL",

        "VersionBuild": "7.16.1.2135",

        "SkipBinary": "true",

        "ConnectionString": "Server=1.2.3.4;Port=5432;Database=crm;User ID=postgres;password=12345;Timeout=50

0;Comm

andTimeout=400;MaxPoolSize=1024;",

        "CurrentSchemaName": "public"

}

C:\UpdaterService\Downloader.ps1:407 знак:23

+     $config = $content | ConvertFrom-Json

+                          ~~~~~~~~~~~~~~~~

    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException

    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

Add-Member : Не удается привязать аргумент к параметру "InputObject", так как он имеет значение NULL.

C:\UpdaterService\Downloader.ps1:463 знак:18

+         $environment | Add-Member "Locale" "ENU" -Force

+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidData: (:) [Add-Member], ParameterBindingValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.AddMemberCo

   mmand

Add-Member : Не удается привязать аргумент к параметру "InputObject", так как он имеет значение NULL.

C:\UpdaterService\Downloader.ps1:466 знак:18

+         $environment | Add-Member "SkipVersions" @() -Force

+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidData: (:) [Add-Member], ParameterBindingValidationException

    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.AddMemberCo

   mmand

Нравится

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

Добрый день.

 

Попробуйте указать информацию по путям к директориям через 2 слеша - у Вас через 1.

 

Также рекомендую прочитать ещё раз внимательно иструкцию по обновлению на Академии.

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

В противном случае для настройки выгрузки Вы можете использовать упрощенный вид файла json:

{
"WebRootDirectory": "c:\\inetpub\\wwwroot\\delivery",
"WorkDirectory": "c:\\temp\\delivery",
"Site": "имя вашего сайта в IIS",
"Product": "Studio",
"VersionBuild": "7.14.1.935"
}

Так как такой вид содержит меньше параметров, вероятность допустить ошибку при указании параметров меньше.

 

Добрый день.

 

Попробуйте указать информацию по путям к директориям через 2 слеша - у Вас через 1.

 

Также рекомендую прочитать ещё раз внимательно иструкцию по обновлению на Академии.

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

В противном случае для настройки выгрузки Вы можете использовать упрощенный вид файла json:

{
"WebRootDirectory": "c:\\inetpub\\wwwroot\\delivery",
"WorkDirectory": "c:\\temp\\delivery",
"Site": "имя вашего сайта в IIS",
"Product": "Studio",
"VersionBuild": "7.14.1.935"
}

Так как такой вид содержит меньше параметров, вероятность допустить ошибку при указании параметров меньше.

 

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

Добрый день!

Вы не могли бы помочь в следующем вопросе:

Компания Roistat (сквозная аналитика) которая занимается настройкой интеграции с CRM, столкнулась с проблемой загрузки полей.

По рекомендации Ваших сотрудников в моем обявлении https://community.terrasoft.ua/questions/element-orderstatuscollection-ne-nayden я перенаправила ответ сотрудникам Roistat.

Roistat выполнили запрос /0/ServiceModel/EntityDataService.svc/$metadata и убедились, что сейчас нужного элемента нет. Полный запрос /0/ServiceModel/EntityDataService.svc/$metadata можно выполнить из браузера(если авторизован в CRM): https://betapro.bpmonline.com/0/ServiceModel/EntityDataService.svc/$metadata В ответе все "части" CRM, но среди них нет поля OrderStatusCollection.

 

Этот статус необходимо получить компании Roistat, чтобы подтягивать/отображать данные у себя в аналитике. Связь состоит в том, что все входящие заявки получает Roistat, далее отправляет заявки в CRM, а CRM отдает статус по той или иной заявке. Ранее интеграция работала и все статусы отображались. Сейчас Roistat не может найти вообще "статусов" (OrderStatusCollection).

 

Подскажите, как сотрудникам Roistat провести компиляцию?

И почему ранее статусы Roistat получали, а сейчас нет?

Буду благодарна если Вы поможете в этом вопросе.

Нравится

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

Дело в том, что на сайте нет объекта OrderStatus, поэтому запрос получения OrderStatusCollection завершается с ошибкой. Необходимо обратиться к разработчику интеграции и выяснить, насколько критична потребность в объекте OrderStatus, возможно интеграцию стоит модифицировать для работы с другими объектами.

Дело в том, что на сайте нет объекта OrderStatus, поэтому запрос получения OrderStatusCollection завершается с ошибкой. Необходимо обратиться к разработчику интеграции и выяснить, насколько критична потребность в объекте OrderStatus, возможно интеграцию стоит модифицировать для работы с другими объектами.

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

Доброе утро! 



Подскажите пожалуйста, сейчас при запросе статусов https://betapro.bpmonline.com/0/ServiceModel/EntityDataService.svc/OrderStatusCollection В ответ получаем ошибку с описанием "Элемент OrderStatusCollection не найден.

 

С чем это может быть связано? 

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

Нравится

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

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

 

Просьба ознакомится с описанием интеграции по ODATA.

Рекомендую провести полную компиляцию и после повторить попытку. Так же найдите объект "OrderStatus" в метаданных по ссылке "/0/ServiceModel/EntityDataService.svc/$metadata"

Zarichnyi Anton,  здравствуйте! 

Благодарю за ответ!

 

Выполнили запрос  /0/ServiceModel/EntityDataService.svc/$metadata и убедились, что сейчас нужного элемента нет. Полный запрос /0/ServiceModel/EntityDataService.svc/$metadata можно выполнить из браузера (если авторизован в CRM): https://betapro.bpmonline.com/0/ServiceModel/EntityDataService.svc/$metadata В ответе будут все "части" CRM, и необходимо удостовериться, что среди них будет OrderStatusCollection. Но сейчас это их нет. Не работает загрузка статусов.

 

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

Связь состоит в том, что все входящие заявки получает Roistat, далее отправляет заявки в CRM, а CRM отдает статус по той или иной заявке. Ранее все так и работало. Сейчас Roistat не может найти вообще "статусов" (OrderStatusCollection).

 

Подскажите, как сотрудникам Roistat провести компиляцию?

И почему ранее статусы Roistat получали, а сейчас нет?

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

Анастасия,

 

Вам нужно в метаданных искать не "OrderStatusCollection", а "OrderStatus", так как "Collection" - это требование ODATA3. Компиляцию должны провести Вы из конфигурации своей системы. Причин, почему так получилось, много и без детального анализа я ответить на Ваш вопрос не смогу. 

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

Коллеги, замечено что для сервиса Exchange Listener необходим доступ в интернет, при его отсутствии статус сервиса на kubernetes становится ImagePullBackOff , как можно обойти эту проблему  использую exchangelistener-0.8.15

Нравится

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

Игорь Юрьевич, здравствуйте! 

 

Если я правильно понял, то вы имеете ввиду, что перезапускаете сервис, но из-за ограничения интернета, сервис падает в состояние ImagePullBackOff. 

 

Для решения проблемы вам необходимо обновить сервис на более новый. 

 

Начиная с версии 0.8.22 pullPolicy для образов изменена на IfNotPresent, и если образ будет закеширован во всех нодах kubernetes перезапуск\масштабирование\разворачивание сервиса не будет требовать доступа к docker hub. Если образа нет, то необходимо открыть доступ или перенести образ вручную на каждую ноду kubernetes.

 

Актуальная версия сервиса - 0.8.39.

Скачать можно на Академии - https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…

 

Хорошего дня!

Вильшанский Дмитрий

использовал 0.8.15

что понимается под  => если образ будет закеширован во всех нодах kubernetes, поясните пожалуйста 

Показать все комментарии
Можно
ли
заменить_к
сервис
карт
системе
на
гугл
например?
7.16
Studio_Creatio_enterprise_edition

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

Собственно вопрос можно ли стандратную карту в Creatio заменить на другую, гугл карты, например?

Нравится

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

Да, есть дополнения для карт Google и Yandex. Сами они бесплатны, но требуют указания ключа, предоставляемого картами, которые взимают плату за своё использование.

Собственно, поэтому в «коробке» с Google Maps переключились на OSM.

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

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

А где в Creatio можно сменить на Google карту отображение в адресе (на детале) и в активностях при включенном модуле Field Sales, где мы планируем визиты? Можно ли вообще там подменить карту, в сис настройках каких-то?

Нужно ставить дополнение. Специально для Field Sales есть ещё одно с Yandex, других разработчиков. Как именно настраивать, лучше спросить у их авторов.

Показать все комментарии
конфигурация
Конфигурационная единица
сервис
настройка
7.13_()
service_enterprise

Всем привет. 

Продукт bpmn SDE 7.13.2.934

Подскажите, пожалуйста, каким образом реализовать выбор Сервиса в зависимости ото выбранной КЕ. 

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

Нравится

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

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

Зверев Александр, есть ли примеры настройки подобного(фильтрация) БП ?  

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

scr_section_wizard_rules_designer_action.png

В целом, вопрос решён, важна была подсказка о том, что для решения кейса стоит использовать бизнес-правило в разделе "Обращения". 

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

После этого сравнивать два поля. Выглядит это примерно следующим образом: 

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

Коллеги, спасибо за помощь. 

 

Показать все комментарии
Обращения
сервис
Консультанту

Коллеги, добрый день!
Хочу упорядочить состояния обращений на кнопке https://yadi.sk/i/gHMZhZ-f3GwETh, чтобы первым было состояние "Взять в работу". Как я поняла, все настраивается в справочнике Состояния обращений. Состояние "Отклонено по SLA" является конечным, последующие стадии не указываются. Для состояния "В работе" указаны последующие стадии https://yadi.sk/i/vTu9Wxf23GwHSs Результата нет.
Как правильно выполнить сортировку данной кнопки?

Нравится

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

Добрый день, Елена!

Для версий системы до 7.10 необходимо в справочнике "Состояние обращений", например, на состоянии "В работе", как указанно у Вас на скриншоте удалить с детали все "последующие состояния" и добавить по каждое состояние и обязательно по одному! При этом, первым сверху будет отображаться первое добавленное состояние и так по убыванию.

Показать все комментарии
Basic authentication
веб
веб-сервис
сервис
Технические вопросы
7.x

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

Я заметил, что к OData в BPM можно обращаться используя basic authentication в заголовке запроса. Как можно сделать тоже самое для своего веб-сервиса? Я попробовал сделать сам, получая заголовок запроса, вытаскивая от туда данные basic authentication и пытался через класс AuthService сделать авторизацию, но у меня не получилось, т.к. в методе Login происходила ошибка.

Нравится

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

Спасибо, помощь больше не нужна, разобрался сам. Если ,вдруг, кому нужно, то авторизовать пользователя можно вызвав метод RecreateUserConnection у класса SessionHelper и передав ему логин, пароль и др. данные.

Колебянов Виталий Романович,

то есть внутри вашего кастомного сервиса вы написали метод авторизации и при вызове этого метода происходит авторизация? система не говорит что вы не авторизованы для вызова сервиса?

Показать все комментарии
3.x
ошибка
сервис
Технические вопросы
Разработка

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

Решил проверить в админке, запускаю сервис, такая ошибка(в логе отображается):

(E)     Невозможно редактировать сервис 'Opportunities\Details\Offerings\wnd_OfferingInOpportunityDetailEdit'. Window 'wnd_OfferingInOpportunityDetailEdit'. Компонент с именем 'edtQuantity' уже существует «Call Stack»

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

Нравится

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

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

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

Укажите какой продукт используете (CRM, XRM, Sales ...), а также прикрепите файл сервиса (сервис окна и сервис скрипта) который вызывает данную проблему.

XRM, при выгрузке сервиса выбивает ошибка

(E)     Невозможно редактировать сервис 'Opportunities\Details\Offerings\wnd_OfferingInOpportunityDetailEdit'. Window 'wnd_OfferingInOpportunityDetailEdit'. Компонент с именем 'edtQuantity' уже существует «Call Stack»

Прикрепил сервисы для продукта Terrasoft XRM версии 3.4.130

Хочу обратить внимание, что окно wnd_OfferingInOpportunityDetailEdit наследуется от окна wnd_OfferingDetailEdit.

Возможно в окне wnd_OfferingInOpportunityDetailEdit был удален компонент edtQuantity, а затем добавлен, что привело к изменению ID компонента и появлению проблемы с окном редактирования.

"Терещук Павел" написал:Возможно в окне wnd_OfferingInOpportunityDetailEdit был удален компонент edtQuantity, а затем добавлен, что привело к изменению ID компонента и появлению проблемы с окном редактирования.

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

В архиве присутствует два сервиса окна, загрузите их оба.
Сначала откройте сервис окна wnd_OfferingDetailEdit, затем сервис окна wnd_OfferingInOpportunityDetailEdit

"Терещук Павел" написал:Сначала откройте сервис окна wnd_OfferingDetailEdit, затем сервис окна wnd_OfferingInOpportunityDetailEdit

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

Сохраните свои сервисы wnd_OfferingDetailEdit, src_OfferingDetailEdit. После чего загрузите мои прикрепленные сервисы. Если после этого проблема исчезнет, значить проблема находится в сервисе wnd_OfferingDetailEdit.

Может в сервисе wnd_OfferingDetailEdit изменился идентификатор компонента, и по этой причине окно сервиса _OfferingDetailEdit не открывается.

Ооо, проблема решена, изменил местоположение поля edtQuantity(переместил на старое место в блок итогов), на старое место и сервис wnd_OfferingInOpportunityDetailEdit начал работать без ошибок

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

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