Добрый день. Есть созданый нами сервис (по образцу базового 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) Нажатие на кнопку:

 

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

 

 

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

 

 

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

Добрый день, занимаюсь обновлением 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 необходим доступ в интернет, при его отсутствии статус сервиса на 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, поясните пожалуйста 

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

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

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

Нравится

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

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

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

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

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

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

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

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

Всем привет. 

Продукт 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 необходимо в справочнике "Состояние обращений", например, на состоянии "В работе", как указанно у Вас на скриншоте удалить с детали все "последующие состояния" и добавить по каждое состояние и обязательно по одному! При этом, первым сверху будет отображаться первое добавленное состояние и так по убыванию.

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

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

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

Нравится

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

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

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

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

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

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

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

(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 начал работать без ошибок

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

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