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

Вопрос касательно адаптивности.

На экранах с небольшим разрешением (к примеру, ноутбуках) при уменьшении размера окна браузера происходит нагромождение элементов друг на друга.

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

Заранее, спасибо!Изображение удалено.

Нравится

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

Здравствуйте, Эрнст

 

Обращаю Ваше внимание на то, что в документации по ссылке https://academy.terrasoft.ru/documents/service-enterprise/7-10/sistemny… сказано о минимальных системных требованиях к клиентскому ПК, а именно о "Минимальное разрешение монитора" - которое должно быть не менее 1280х768.

Если разрешение меньше то скорее всего проблема именно в этом.

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

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

Есть два разных поля с типом RICH_TEXT. Как сделать так, чтобы для каждого такого поля с типом RICH_TEXT можно было добавлять разные картинки?

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

 

Я смотрел, как это сделано в конфигурации, попробовал примерно также сделать. Безуспешно.  Свой код привёл ниже.

 

				{
					"operation": "insert",
					"name": "Symptomsddab7c67-d9b3-4aa3-a2f4-4cf714d60ddb",
					"values": {
						"layout": {
							"colSpan": 24,
							"rowSpan": 2,
							"column": 0,
							"row": 0,
							"layoutName": "ProcessingTabGridLayout3f0ff617"
						},
						"labelConfig": {
							"visible": false
						},
						"bindTo": "Symptoms",
						"controlConfig": {
							"imageLoaded": {
								"bindTo": "insertImagesToNotes"
							},
							"images": {
								"bindTo": "SymptomsImagesCollection"
							}
						},
						"tag": "SymptomsImagesCollection",
						"enabled": true,
						"contentType": 4
					},
					"parentName": "ProcessingTabGridLayout3f0ff617",
					"propertyName": "items",
					"index": 0
				},
 
				{
					"operation": "insert",
					"name": "Solution859e56f7-deb4-4281-bb1e-fd0fddd5aeb3",
					"values": {
						"layout": {
							"colSpan": 24,
							"rowSpan": 2,
							"column": 0,
							"row": 0,
							"layoutName": "ProcessingTabGridLayout476a2a18"
						},
						"labelConfig": {
							"visible": false
						},
						"bindTo": "Solution",
						"controlConfig": {
							"imageLoaded": {
								"bindTo": "insertImagesToNotes"
							},
							"images": {
								"bindTo": "SolutionImagesCollection"
							}
						},
						"tag": "SolutionImagesCollection",
						"enabled": true,
						"contentType": 4
					},
					"parentName": "ProcessingTabGridLayout476a2a18",
					"propertyName": "items",
					"index": 0
				},
 
 
 
 
 
 
 
 
				insertImagesToNotes: function(files, tag) {
					this.Terrasoft.each(files, function(file) {
						this.addImageToNotes(file, tag);
					}, this);
				},
				addImageToNotes: function(file, tag) {
					FileAPI.readAsDataURL(file, function(tag, event) {
						if (event.type !== "load") {
							return;
						}
 
						var imagesCollection = this.get(tag);
						var image = this.getNotesImagesCollectionItem(event.target.name, event.result);
						imagesCollection.addItem(image);
					}.bind(this, tag));
				},
				initImagesCollections: function() {
					this.set("SymptomsImagesCollection", this.Ext.create("Terrasoft.BaseViewModelCollection"));
					this.set("SolutionImagesCollection", this.Ext.create("Terrasoft.BaseViewModelCollection"));

 

Нравится

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

Кирилл, добрый день. К сожалению, корректная работа двух и более полей с типом RICH_TEXT на одной карточки поддерживается только с версии 7.11.1. Рекомендуем обновить ваше приложение.

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

Итак попытка добавить данную деталь в раздел Активности не увенчалась полным успехом.

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

Так же автоматом создало 3 схемы и замещающий манифест в текущем пакете.

При попытке добавить файл мы наблюдаем следующее, возможность добавить файл полностью отсутствует!!!

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

Хотелось бы спросить чего по настоящему недостает в автосгенерированном мастером коде, для отображения списка вариантов по клику на + в детали файлов.

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

Вобщем коллеги, обращаюсь за помощью к вам.

Думаю не мне одному интересно как с этим справиться.

Нравится

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

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

Данная деталь является специфической, так как добавление и хранение данных отличается от других деталей. Поэтому нужно на уровне кода добавлять данную деталь. Инструкция давненько лежит на SDK и которая не раз была направлена пользователям системы - https://academy.terrasoft.ru/documents/technic-sdk/7-11/mobilnoe-priloz…

Цитата на Академии:

"Деталь "Файлы и ссылки" доступна во всех разделах bpm'online (см. "Файлы и примечания") и в разделе [Продажи] ([Opportunities]) мобильного приложения" - это ответ на Ваш вопрос по поводу раздела "Продажи".

Удалите через мастер эту деталь и выполните согласно инструкции:

- До 7.11.2 - https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-deta…

- 7.11.2 и выше - https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-deta…

Примечение. Манифест проще всего создать через мастер (создается автоматически при сохранении текущих настроек).

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

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

 

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

 

Добрый день! 

В версии bpm'online 7.11.3 добавлена возможность добавить деталь "Файлы и ссылки" в любой раздел мобильного приложения (если для аналогичного раздела деталь существует в основном интерфейсе) через мастер мобильного приложения.

Для этого требуется зайти в мастер мобильного приложения – выбрать раздел – выбрать настройку страницы - добавить встроенную деталь, которая будет ссылаться на соответствующий объект – сохранить настройку - выполнить синхронизацию мобильного приложения.

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

На данный момент шаблон письма в элементе БП Send email можно только выбрать из списка. А как задать его через параметр? 

Нравится

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

ну по факту по моему это ID-шник из справочника шаблонов.

Севостьянов Илья Сергеевич пишет:

А почему тогда не сделали стандартно, как в других элементах БП: выбор из справочника или параметр?

 

Владимир, здравствуйте!

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

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

Логвин Андрей Витальевич пишет:

Вы можете добавить элемент чтения данных из шаблон email сообщения, после чего передать прочитаное тело письма в тело письма в режиме Произвольное письмо.

Воспользовался в этот раз вашим советом. Да, прочитать тело письма из шаблона можно, но как при этом подставить все нужные значения по макросам, которые в шаблоне прописаны?

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



И письмо приходит в таком виде:

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

 

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

Столкнулись с проблемой правильного хранения файлов в bpm. Например в контрагенте в файлах и примечаниях хранится очень много документов, но нет возможности распределить их по папкам (выводятся списком). Есть ли такая возможность создания папок и подпапок в файлах и примечаниях?

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

Нравится

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

1) Нет. И прилепить туда папки очень сложно, но можно попробовать доработать деталь, навесив функционал тегов(как в контрагентах). В итоге файлы помечаем тегами и сортируем как надо

2) Правильно. Письмо - это активность, активность - объект в системе, под каждый большой объект есть таблица [Название_объекта]File. И если надо перекинуть файл из письма в заказ, надо по сути перекопировать запись из ActivityFile в OrderFile, чего стандартными средствами не сделаешь.

Варфоломеев Данила,

 Благодарю за ответы. Данила, идея с тегами хорошая, но не совсем понятно как ее можно реализовать. Быть может Вы реализовывали теги в файлах и можете подсказать, как их подцепить в деталь?

Чакур Александр Леонидович,

Не реализовывал. Вроде как надо добавить таблицу AccountFileTag (к примеру, для файлов в контрагентах), а далее смотреть в конфигурации как  в эту таблицу заносятся записи и по ней фильтруется реестр. Плюс надо будет кнопку с тэгом добавить в tools детали. Ну и ещё наверное кучу всего... Я бы покопался, да времени нет)

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

Как программно задать необходимое значение в поле справочника(список).

Например, при количестве продаж больше 10 нужно устновить значение в поле справочника Приоритет активности - Высокий.

Я так предполагаю необходимо иметь дело с GUID, но код типа

this.set("MyFieldDictionary", "{GUID}") приводит к результату отображения в html undefined.

Нравится

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

Вам нужно использовать метод loadLookupDisplayValue, например:

 

this.loadLookupDisplayValue("Type", constants.ContractType.Standard);

 

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

Вы получите объект... вот именно объект аналогичной структуры туда и надо сетапить.

как правило требуется объект минимум с 2-мя полями

{
   displayValue: "Текст который будет демонстрировать в поле",
   value: "уникальный идентификатор значения"
}

 

Севостьянов Илья Сергеевич,

 Если поступить таким образом, атрибут типа справочник получит реальное значение из справочника со всеми подключаемыми полями или только только две строки в качестве значения?



Т.е. например:

this.set("Country", {value: "a570b005-e8bb-df11-b00f-001d60e938c6", displayValue: "РОССИЯ"});

У атрибута Country добавлены дополнительные поля из таблицы Country, например ["Capital"].



Если вызвать this.get("Country).Capital, будет ли получено значение "Москва"?

Если так не получится, можно получить Id страны, а затем отдельным запросом к таблице стран получить значение интересующего поля в этой записи. Как работать с ESQ из JS-кода, есть в этой и соседних статьях.

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

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

Нравится

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

Здравствуйте, Олег!

На данный момент базовая логика приложения не позволяет изменять формат отображения значений в некоторых типах графиков.

 

Мы передали данное пожелание команде разработки, для анализа возможности внедрения функционала в будущих версиях системы.

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

Коллеги, нужна помощь.

В inputBox пытаюсь вывести колонку DateTime.

Сам вывод получился как то вот так:

Terrasoft.utils.inputBox("Make task value", function(result, arg) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		alert(result);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		name: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "77px"
			},
			isRequired: true
		},
		startDate: {
			dataValueType: Terrasoft.DataValueType.DATE_TIME,
			caption: "Start date",
			customConfig: {
				className: "Terrasoft.Container",
				value: {"bindTo" : "startDate"},
				items: [
					{
						className: "Terrasoft.DateEdit",
						id: "newStartDateEdit",
						width: "50%"
					},
					{
						className: "Terrasoft.TimeEdit",
						id: "newStartTimeEdit",
						width: "50%"
					}
				]
		}
	}
}

Выглядит это дело вот так:

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

 

При клике на кнопку Next закрывается форма и консоль в red-style с содержимым:

Uncaught TypeError: b[c].control.getValue is not a function

    at i.updateCustomControl (all-combined.js:formatted:79169)

    at i.onStateChanged (all-combined.js:formatted:78983)

    at i.fire (all-combined.js:formatted:6223)

    at i.continueFireEvent (all-combined.js:formatted:7144)

    at i.fireEventArgs (all-combined.js:formatted:7129)

    at i.fireEvent (all-combined.js:formatted:7120)

    at i. (all-combined.js:formatted:79078)

    at i.fire (all-combined.js:formatted:6223)

    at i.continueFireEvent (all-combined.js:formatted:7144)

    at i.fireEventArgs (all-combined.js:formatted:7129)

 

Кто сталкивался или кто знает как решить этот вопрос?

Нравится

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

потестил, он пытается взять value контейнера (этого сделать конечно же нельзя). А по другому никак, ибо Date_Time - это по сути контейнер из 2х других контролов. Можно попробовать раздробить

startDate: {
	caption: "Start date",
	dataValueType: Terrasoft.DataValueType.DATE_TIME,
	value: {"bindTo" : "startDate"},
	customConfig: {
		className: "Terrasoft.DateEdit"
	}
},
startTime: {
	caption: "Strat time",
	dataValueType: Terrasoft.DataValueType.DATE_TIME,
	value: {"bindTo" : "startDate"},
	customConfig: {
		className: "Terrasoft.TimeEdit"
	}
}

 

Пробовали, className: "Terrasoft.TimeEdit" напрочь отказывается показывать. В консоли сообщение о том что присутствует недопустимое значение.

В любом случае логика контролов с типами DATE_TIME и TIME фейлятся в inputBox, похоже это деффект платформы:



DATE_TIME

TIME

Господа, не знаю, что у вас там не работает... У меня завелось вот так:

Terrasoft.utils.inputBox("Make task value", function(result, args) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		//alert(result);
		debugger;
		console.log(args);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		kappa: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "80px"
			},
			value: "",
			isRequired: true
		},
		startDate: {
			caption: "Start date",
			dataValueType: Terrasoft.DataValueType.DATE,
			value: new Date(),
			customConfig: {
				className: "Terrasoft.DateEdit"
			}
		},
		endDate: {
			caption: "Start time",
			dataValueType: Terrasoft.DataValueType.TIME,
			value: new Date(),
			customConfig: {
				className: "Terrasoft.TimeEdit"
			}
		}
});

Правды выглядит это всё сомнительно

И значения придётся вытаскивать из args, которые приходят из модуля в коллбеке.

 

ps. 12 часов ночи, чем я, блин, занимаюсь...

Так. всё. я вконец упоролся, но таки сделал.

Хочется передать привет товарищу из террасофта, который лепит затычки в Terrasoft.utils.controls.getControlConfigByDataValueType. Там в свитчере:

    switch (a) {
    case Terrasoft.DataValueType.TEXT:
        b = {
            className: "Terrasoft.TextEdit"
        };
    //тут куча других типов
    //....
    //А для 3х оставшихся сделать поленились
    case Terrasoft.DataValueType.GUID:
    case Terrasoft.DataValueType.DATE_TIME:
    case Terrasoft.DataValueType.BLOB:
        b = null
    }

Ну и то, что в итоге получилось у меня:

Terrasoft.utils.inputBox("Make task value", function(result, args) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		//alert(result);
		debugger;
		console.log(args);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		kappa: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "80px"
			},
			value: "",
			isRequired: true
		},
		DateTimer: {
			dataValueType: Terrasoft.DataValueType.DATE_TIME,
			caption: "Start date",
			value: new Date(),
			customConfig: {
				className: "Terrasoft.Container",
				getValue: function() {
					//debugger;
					var dateValue = this.items.items[0].value;
					var timeValue = this.items.items[1].value;
					dateValue.setHours(timeValue.getHours());
					dateValue.setMinutes(timeValue.getMinutes());
					return dateValue;
				},
				items: [
					{
						className: "Terrasoft.DateEdit",
						id: "newStartDateEdit",
						value: new Date(),
						width: "50%"
					},
					{
						className: "Terrasoft.TimeEdit",
						id: "newStartTimeEdit",
						value: new Date(),
						width: "50%"
					}
				]
			}
		}
});

 

Варфоломеев Данила, отдельное вам спасибо!)

Кстати, как насчет вывода в InputBox справочных полей (Terrasoft.DataValueType.LOOKUP)

Есть идеи ?

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

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

Добрый день. Возникла необходимость запускать единоразово БП в указанное время. Задание для планировщика добавляется (появляется в бд), но не срабатывает в указанное время. В бд можно увидеть, что задание остаётся по-прежнему в режиме ожидания (устанавливал запуск через 5 минут при тесте). Ниже код, добавляющий задание для планировщика. В чём может быть проблема?

 

            
startDateTime = startDateTime.AddHours(-3);
string jobName = string.Format(jobNameTemplate, id);
 
var parameters = new Dictionary<string, object>();
parameters.Add("Id", id.ToString());
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(
     jobName, 
     jobGroupName, 
     processName, 
     userConnection.Workspace.Name, 
     userConnection.CurrentUser.Name,
     parameters);
 
string cronExpresson = string.Format("{0} {1} {2} {3} {4} ? {5} ", 
    dt.Second, dt.Minute, dt.Hour, 
    dt.Day, dt.Month, dt.Year);
 
var trigger = new CronTriggerImpl(
     jobName + "Trigger", 
     jobGroupName, 
     cronExpresson);
 
trigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;
trigger.TimeZone = TimeZoneInfo.Utc;
 
AppScheduler.Instance.ScheduleJob(job, trigger);



 

 

Нравится

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

У меня была такого рода проблема, ниже привожу ответ с поддержки:

 

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

Для того, чтобы убедится в этом достаточно создать процесс с 1 элементом таймер. Указать в таймере 10 сек. Запустить процесс. Если по истечению времени (10 сек) экземпляр процесса (в журнале процессов) по прежнему находится в состоянии “Выполняется” (не “Завершен”) – необходимо настроить удостоверение в свойствах пула.

В расширенных настройках пула в параметре Удостоверение (identity) необходимо указать пользователя, от имени которого запущен IIS

Советы по конфигурированию выявленные опытным путем:

1) Использовать отдельный пул для каждого приложения в рамках отдельного IIS сервера.

2) В настройке пула Identity задать значение LocalSystem

в правах NTFS на каталог приложения - должна присутствовать роль SYSTEM (СИСТЕМА) и иметь полынье права, рекурсивно включая все вложенные каталоги.



3) В конфигурационном файле ConnectionStrings необходимо установить авторизацию по конкретному пользователю

 (желательно создать отдельного пользователя SQL (авторизация средствами SQL-сервера, т.е. не пользователь ОС) имеющего права владельца на БД используемую приложением)

режим "сквозной авторизации" через пользователя ОС (Integrated Security=SSPI (атрибут узла add name="db" в теге connectionStrings))

вызывает проблемы с планировщиком, лучше использовать прямую авторизацию пользователем SQL-сервера.

 

Методику проверки, Вам подсказывают верно:

необходимо создать БП в котором между точками старта и окончания необходимо разместить элемент "Таймер" (на одну или несколько секунд задержки).

после сохранения такого БП, принудительно вызвать его на исполнение, после чего в журнале БП убедиться что БП успешно выполнился, а не находится в состоянии "Выполняется" или "Ошибка"

Шарипов Ильмир Ирекович,

Проверил. Сегодня утром тестовый таймер работал. И начал срабатывать вызов моего процесса. Но спустя некоторое время всё вернулось к прежнему состоянию. Таймер тоже перестал работать. Видимо проблемы связаны с перегруженностью планировщика, хоть и задач у него немного. Пока что решилось изменением настроек Quartz в конфиге загрузчика. Первой строки изначально вообще не было, во второй значение было равным 5. 

&lt;add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="5" /&gt;
&lt;add key="quartz.scheduler.threadCount" value="10" /&gt;

 

Чтобы запустить планировщик после перезапуска вэб-приложения, нужно зайти именно на страницу логина. То есть пока кто-нибудь не зайдет на страницу логина, планировщик не запустится. Планировщик живет в верхнем квадратике. Если пользователь аутентифицирован до перезапуска вэб-приложения, то можно сразу выйти на страницы .../0/..., но это не запустит планировщик.

 

 

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

По инструкции на академии добавил правило поиска дублей в контрагенте по полю ИНН.

Правило корректно отрабатывает при глобальном поиске, но не работает при сохранении карточки контрагента. Ошибок в логе поиска нет. Буду благодарен за идеи...

Код процедуры поиска:

IF NOT OBJECT_ID('[dbo].[tsp_FindAccountDuplicateByInn]') IS NULL

BEGIN

    DROP PROCEDURE [dbo].[tsp_FindAccountDuplicateByInn];

END;

GO

CREATE PROCEDURE [dbo].[tsp_FindAccountDuplicateByInn] (

    @parsedConfig CreatingObjectInfo READONLY,

    @sysAdminUnit UNIQUEIDENTIFIER,

    @ruleId UNIQUEIDENTIFIER

)

AS

BEGIN

    DECLARE @parsedConfigRowsCount INT = (SELECT COUNT(*) FROM @parsedConfig);

    CREATE TABLE #searchAccount (

        [SxINN] INT,

        [SortDate] DATETIME

    );

    IF @parsedConfigRowsCount = 0

    BEGIN

        INSERT INTO #searchAccount ([SxInn], [SortDate])

        SELECT

            [SxInn],

            MAX([ModifiedOn])

        FROM [Account]

         GROUP BY [SxInn]

         HAVING COUNT(*) > 1;

    END;

    

     INSERT INTO [AccountDuplicateSearchResult] ([AccountId], [GroupId], [RuleId], [SysAdminUnitId])

    SELECT

         [vr].[Id],

         DENSE_RANK() OVER (ORDER BY [vr].[SortDate] DESC, [vr].[SxInn]),

         @ruleId RuleId,

         @sysAdminUnit

    FROM (

         SELECT

             [v].[Id],

             [v].[SxInn],

             [r].[SortDate]

         FROM [Account] [v], #searchAccount r

         WHERE [v].[SxInn] = [r].[SxInn]

         GROUP BY [v].[SxInn], [r].[SortDate], [v].[Id]

    ) [vr];

END;

GO

Нравится

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

Здравствуйте, Иван!

Реализовать поиск дублей при сохранении достаточно не просто. Но если вкратце:

1. Заместить метод getDataForFindDuplicatesService в DuplicatesSearchUtilitiesV2

2. Унаследоваться от класса SingleRequest из SearchDuplicatesService и добавить своё свойство.

3. Создать свой SingleRequesListener чтобы заменить вызов SingleRequest на свой класс

4. Унаследоваться от DeduplicationProcessing и изменить методы AddElementsToRow и GetPreparedXml из SearchDuplicatesService

5. В хранимкке tsp_FindDuplicate нужно изменить под себя CreatingObjectInfo

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