Каким образом заполняется поле справочника на странице редактирования объекта
На клиенте получил экземпляр обекта поля справочника поменял ему id и name, но значения не сохраняются, и значения возвращается прежднее

Нравится

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

Здравствуйте, для изменения записи в бд, необходимо использовать Terrasoft.UpdateQuery, множество примеров можете найти в конфигурации, к примеру метод updateContactCareer в AccountPageV2 в пакете UIv2

var update = Ext.create("Terrasoft.UpdateQuery", {
							rootSchemaName: "ContactCareer"
						});
						var filters = update.filters;
						var contactIdFilter = update.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
								"Contact", data.contactId);
						var isCurrentFilter = update.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
								"Current", true);
						var isPrimaryFilter = update.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
								"Primary", true);
						filters.add("contactIdFilter", contactIdFilter);
						filters.add("isCurrentFilter", isCurrentFilter);
						filters.add("isPrimaryFilter", isPrimaryFilter);
						if (data.hasOwnProperty("isPrimary")) {
							update.setParameterValue("Primary", data.isPrimary, Terrasoft.DataValueType.BOOLEAN);
						}
						if (data.hasOwnProperty("isCurrent")) {
							update.setParameterValue("Current", data.isPrimary, Terrasoft.DataValueType.BOOLEAN);
						}
						if (data.hasOwnProperty("dueDate")) {
							update.setParameterValue("DueDate", data.dueDate, Terrasoft.DataValueType.DATE);
						}
						update.execute(function(result) {
							callback.call(this, result);
						}, this);

а также на комьюнити, к примеру тут:
http://www.community.terrasoft.ru/forum/topic/24995#comment-66505

Не совсем то,
Например у Контрагента есть поле Город, который является справочником
Пользователь отредактировал какое-то поле по которому я определил, что город указаный в форме не соответсвует городу контрагента в жизни
Мне нужно изменить значения поля Город в текущей странице редактирования
Редактирование значения в БД не подходит т.к. пользователь может отменить все изменения, и информация в таком случае должна остаться нетронутой

"Хусаинов Булат" написал:Мне нужно изменить значения поля Город в текущей странице редактирования

Т.е вам нужно просто установить значение для переменной? В таком случае:

var myCityObj = {
     value: ...,//сюда ид города из базы
     displayValue: ...//сюда название города
};
this.set("City", myCityObj);

Работает, если поле "Город" - лукапное(справочное). Для строк, Guid-ов, дат и т.п просто this.set("Parameter", value)

Булат,

попробуйте реализовать с помощью бизнес-правил: https://academy.terrasoft.ru/documents/technic-sdk/7-9/biznes-pravila-i…

присоединяюсь к Даниле
Вставлю лишь свои 5-ть копеек, что лучше бы пойти в отладчик установить в справочное поле значение, а потом получить его в отладчике, таким образом вы получите представление полной структуры объекта, для сохранения в БД не играет роли никакие поля кроме "value" (иногда "id")
но остальные значения могут быть задействованы в побочной логике, как это часто бывает с displayValue
так же зачастую можно встретить и другие поля/значения
вот пример того как выглядят объекты в типовых Активностях, для полей "Состояние" и "Результат"

обратите внимание что для объекта поля "Состояние" есть еще отдельное свойство "Finish" от его значения может зависеть какая либо логика на странице, например сокрытие/демонстрация полей или запуск каких-либо БП.
Так что устанавливая значение в справочное поле самостоятельно, желательно воспроизводить структуру объекта целиком, и разбираться с дополнительными свойствами - зачем они нужны и как их воспроизвести.
вот...

PS: (на всякий случай объясню)
если Вы хотите поработать с контекстом карточки из отладчика, не расставляя точек останова по ходу инициализации, например повызывать методы на исполнение, "пощупать" значения аттрибутов и полей, то вам необходимо предварительно "обернуть" контекст.
Для этого подойдет универсальный метод "onEntityInitialized", где вы сможете транслировать ссылку на текущий контекст в свойство глобального объекта, н/п document.ActivityPageScope

		methods: 
...
			"onEntityInitialized": function() {
				this.callParent(arguments);
				document.ActivityPageScope = this;
			},
...

Ваши пять копеек, Илья, оказались золотыми. Ни как не мог понять как обратиться к контексту страницы и прощупать состояние его объектов. Интересно, существует ли способ обращения к странице напрямую не передавая его в document?

Стандартно для обмена сообщениями между разными страницами используется «песочница». То, что выше описал Илья, относится только к отладке в браузере.

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

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

Версия 7.10.

Ситуация такая: сделал свой контрол в соответствии с инструкцией из комментариев отсюда: https://community.terrasoft.ru/forum/topic/25285#comment-67717

Контрол похож на то, что описано там, разница в том, что добавляет не div, а элемент canvas с определённым id в DOM на страницу контакта. Пробуем для решения определённой задачи (образец подписи клиента, получается через canvas и сохраняется в отдельную колонку в формате base64).

Далее в onEntityInitialized ContactPageV2 делаю следующее:

onEntityInitialized: function() {
                                this.callParent(arguments);                    
                                var canvas = document.getElementById("UsrTestUsrSignControl-usr-my-control");
                        var context = canvas.getContext("2d");

//Дальнейшие действия
},

UsrTestUsrSignControl-usr-my-control - id элемента canvas.

Обнаружил, что в некоторых случаях на стадии getContext вываливается ошибка - скрипт не находит элемента по id. При это именно взятие по id необходимо для работы с канвасом, а работа внутри ContactPageV2 - чтобы сохранить результат в колонку контакта.

Вопрос - можно ли как-нибудь отследить загрузку контрола на страницу? Может быть, внутри самого контрола? Попробовал добавить document.getElementById внутрь init - то же самое.

Нравится

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

Обнаружил, что элемент доступен внутри события initDomEvents

Соответственно, вопрос меняется на "как передать данные в ContactPage".

Может быть, через sandbox?

Загрузка всех элементов на страницу "asynchronous as fuck", как говорится. В onEntityInitialized доступна модель страницы, но не факт, что элементы погрузились. Можно попробовать вставить функцию, реагирующую на рендер контрола:

"values": {
	....
	"afterrender": {bindTo: "onControlRendered"}
}

Данила, а точно есть такое - afterrender? Может быть onRender?

Попробовал - вообще функция не вызывается. Добавляю в values при подключении контрола.

Здравствуйте,
Можете подписатся в init-е на событие добавления в dom вашего элемента, подробнее:
https://toster.ru/q/18926
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_even…

"Смородинов Денис" написал:Данила, а точно есть такое - afterrender?

У Terrasoft.Label есть. Вообще должно событие быть, если контрол наследуется от Terrasoft.Component.
Судя по NUI Docs

{
		"operation": "insert",
		"name": "UsrTest",
		"values": {
			"layout": {
				"colSpan": 12,
				"rowSpan": 1,
				"column": 0,
				"row": 0,
				"layoutName": "GeneralInfoTabGridLayout97349c91",
			},
			"onAfterRender": {
				"bindTo": "onCanvasRendered"
			},
			"generator": "UsrSignControlGenerator.generateUsrSignControl",
			"visible": true
		},
		"parentName": "GeneralInfoTabGridLayout97349c91",
		"propertyName": "items",
		"index": 0
	},

И в методах:

onCanvasRendered: function(){
				console.log("rendered");
				var canvas = document.getElementById("UsrTestUsrSignControl-usr-my-control");
				console.log(canvas);
			},

Так не работает, даже просто "rendered" не выводит. afterrender вместо onAfterRender - тоже.

Контрол сам точно по той схеме, т.е. наследуется от компонента.

"Смородинов Денис" написал:Соответственно, вопрос меняется на "как передать данные в ContactPage".

Может быть, через sandbox?

Возможно, этот путь будет проще?

"Смородинов Денис" написал:Возможно, этот путь будет проще?

Думаю нет)

Получилось вот так (подправил генератор из вашей ссылки в посте):

generateTmMyControl: function(config) {
	debugger;
        var TmMyControl = {
                className: "Terrasoft.TmMyControl",
                id: config.name + "TmMyControl",
                selectors: {wrapEl: "#" + config.name + "TmMyControl"},
                layout: config.layout || {},
                afterrender: {bindTo: config.onAfterRender}, //добавил чисто на всякий случай
                afterrerender: {bindTo: config.onAfterRender} //контрол почему-то ререндерится, у меня на тестовой системе срабатывает именно это событие
        };
        if (!Ext.isEmpty(config.wrapClassName)) {
                TmMyControl.classes = {
                        wrapClassName: config.wrapClassName
                };
        }
        return TmMyControl;
},

Данила, спасибо, работает!

То есть получается, методы нужно добавлять в генератор.

"Варфоломеев Данила" написал:

Получилось вот так (подправил генератор из вашей ссылки в посте)

Привет. Есть ли идеи вот насчет чего?:

{
	"operation": "insert",
	"name": "Containment",
	"values": {
		"itemType": 2,
		"markerValue": "added-detail",
		"afterrender": {
			"bindTo": "getEnableDetails"
		},
		"afterrerender": {
			"bindTo": "getEnableDetails"
		}
	},
	"parentName": "QuickAnalysisTabContainer",
	"propertyName": "items",
	"index": 6
}

Соответственно, сам метод, который вешается на послерендер допустим что-то выводит в консоль.
На детали очень странное поведение.

Как только открываю табу, на которой должна быть деталь - моментально идет вызов метода и вывод в консоль. При этом сама деталь не грузится и запросы никакие никуда не идут на получение детали и её данных. Это оочень странно. И в DOM-е ни одного упоминания об этой детали. Т.е. грубо говоря вообще никакого рендера не произошло. Деталь не появляется на карточке. Никак.

ЧЯДНТ?

"Темченко Кирилл Александрович" написал:Деталь не появляется на карточке.

Смотрим стандартный генератор детали:

generateDetail: function(config) {
	var detailContainerId = this.getControlId(config, "Terrasoft.Container");
	var result = this.getDefaultContainerConfig(detailContainerId, config);
	result.tag = {
		detailName: config.name,
		containerId: detailContainerId
	};
	result.markerValue = config.name + "DetailContainer";
	result.afterrender = {
		bindTo: this.defaultLoadDetailMethodName
	};
	result.afterrerender = {
		bindTo: this.defaultLoadDetailMethodName
	};
	Ext.apply(result, this.getConfigWithoutServiceProperties(config, []));
	this.applyControlConfig(result, config);
	return result;
},

Видно, что на afterrender и afterrerender вешается метод loadDetail. (this.defaultLoadDetailMethodName = "loadDetail"). Далее ваши конфиг из диффа перетирает рендеры - this.applyControlConfig(result, config)

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

п.с. это всё в теории, времи тестить совсем нет)

"Варфоломеев Данила" написал:

п.с. это всё в теории, времи тестить совсем нет)

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

спасибо за помощь.

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

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

Как можно на детали с реестром добавить кликабельную картинку, которая подгружается по внешнему URL(хранящемся в поле объекта детали), при клике на которую, она бы загружается в полном размере?

Версия sales enterprise 7.9.1.3284

Нравится

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

Здравствуйте, таких базовых средств в bpm'online нет, но, обладая навыками разработчика вы можете попробовать сделать это самостоятельно.
Вот это может вам пригодится как пример:
https://www.w3schools.com/howto/howto_css_modal_images.asp
И если вы захотите сделать это как собственный контрол, то, вот эта инструкция так же будет полезной: svoy_kontrol__generator__diff.doc

Крапивницкий Николай,

Добрый день! Получилось реализовать задачу? 

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

Была экспортирована в файловую систему схема пользовательского действия (базовая) под названием Отправить e-mail.
Были произведены замены Uid'ов и импортирована удачна обратно.
Далее его начали использовать в БП для отправки сообщений, дабы эти сообщения не только на ящик удачно приходили, но и в систему и был замечен нюанс.
Суть его такова что если этот БП стартовал под именем Супервизора то вс1 было хорошо в плане отправки таких сообщений, но стоило только другому пользователю инициировать это БП так этот элемент в журнале указан как выполнен, а на самом деле всё очень плохо и ничего не произошло.

Кто с таким сталкивался и как с этим бороться?
Потому что стоковый элемент в БП "Отправить e-mail" не работает так как должен, точнее в систему сообщение приходит не в читабельном виде.

Нравится

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

Только что выяснилось если у этого действия БП установить false в параметр "Игнорировать ошибки при отправке" то вылетает такая ошибка см. приложенный файл.

Добрый день!
Ошибка связана с тем, что у инициатора процесса нет прав доступа на почтовый ящик от которого отправляется письмо.
Нужно настроить общий почтовый ящик. Во вложении файл с описанием настройки.
otpravka_email.docx

"Зарицкий Олег" написал:

Добрый день!

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

Нужно настроить общий почтовый ящик. Во вложении файл с описанием настройки.

otpravka_email.docx


Спасибо, проблема ушла)

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

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

rules: {
"Offering": {
"FiltrationAmountByProduct": {
"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
//"autocomplete": true,
"autoClean": true,
"baseAttributePatch": "Price",
"comparisonType": Terrasoft.ComparisonType.EQUAL,
"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
"attribute": "Amount"
}
}
}

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

Нравится

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

Мария,

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

Для решения проблемы попробуйте раскомментировать параметр "autocomplete" - он ведь как раз и отвечает за обратную фильтрацию.

А также ознакомьтесь со статьей на эту тему: https://academy.terrasoft.ru/documents/technic-sdk/7-9/primer-primeneni…

спасибо за помощь :smile:, по этой статье и делали, с полями, которые являются оба справочниками такое получилось, а в этом случае, если раскомментировать autocomplete в итоге вообще все поля очищаются :sad:

Попробуйте сделать по аналогии с этим примером: https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-vychi…

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

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

Подскажите, пожалуйста, как можно решить такую задачу.

Есть Активность, в которой Автор и Исполнитель отличаются. Как только Исполнитель завершает задачу Автору должно выводиться уведомление (в коммуникационной панели во вкладке уведомлений) о том, что конкретная задача завершена.

Сделал бизнес-процесс, который добавляет Уведомление по сигналу изменения состояния Активности. Само уведомление в панели появляется, но счётчик не меняется.

Попробовал создать отдельного провайдера (по аналогии с DocumentNotificationProvider и ForecastNotificationProvider), но словил ошибку 400. Подозреваю, что на один раздел может быть только один провайдер уведомлений.

Получилось отловить ошибку, которая выдаётся в консоли:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: "Значение не может быть неопределенным.

Имя параметра: type". Дополнительные сведения см. в журналах сервера. Трассировка стека исключений:
в System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
в System.Activator.CreateInstance(Type type, Object[] args)
в Terrasoft.Configuration.RemindingsHelper.GetResult(Guid sysAdminUnitId, NotificationProviderType type, DateTime date, String methodName)
в Terrasoft.Configuration.RemindingsHelper.GetCount(Guid sysAdminUnitId, NotificationProviderType type, DateTime date)
в Terrasoft.Configuration.RemindingsHelper.GetRemindersCounter(Guid sysAdminUnitId, String dueDate)
в Terrasoft.Configuration.RemindingsHelper.GetPopupConfigResponse(Guid sysAdminUnitId, String dueDate)
в SyncInvokeGetPopupConfig(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

 

Нравится

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

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

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

Так же убедитесь, что в таблице NotificationProvider существует запись для нового провайдера.

"Попробовал создать отдельного провайдера (по аналогии с DocumentNotificationProvider и ForecastNotificationProvider), но словил ошибку 400."
- Скорее всего могли быть допущены ошибки в созданном провайдере.
Но если уже есть базовый провайдер уведомлений по Активностям, то нет смысла создавать новый(только если хотите использовать другой тип уведомлений).

Илья, да, записи в Reminding добавляются корректно (и время и прочитано), все записи корректно отображаются на коммуникационной панели.

Запись для нового провайдера тоже добавлял.

Я как раз и хочу добавить провайдер уведомлений по Активностям с типом "Уведомления" (базовый работает с напоминаниями).

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

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

Так а в чем проблема была, решили?

Сомневаюсь, что логи за 2017 год сейчас сохранились.

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

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

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

Нравится

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

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

В приложении bpm’online синхронизация отправленных писем с почтовым сервером не предусмотрена. Все отправленные письма сохраняются только в приложении.

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

Возможно ли реализовать данный функционал на стороне BPM (просматривая функционал IMAP, не нашел подходящих функций)? Если да подскажите пожалуйста направления куда копать)
Или данный функционал может быть реализован только на стороне почтового сервера?

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

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

Добрый день! 

Что нужно сделать на стороне сервера, чтобы отправленная из BPMOnline почта сохранялась на почтовом сервере? 

Это зависит от того, какой сервер. Смотрите документацию по нему.

Хорошо, а каком направлении смотреть? Что на сервере должно быть настроено чтобы сохранялись отправленные письма? 

Смотрите в направлении сервера и его настроек.

Пробовал использовать почтовые серверы mail.ru и yandex.ru. Ни там, ни там отправленные письма не отобразились. Ума не приложу что надо настроить? Ни когда с этим не сталкивался.

Система bpm'online работает с почтой по тем же протоколам, что и другие почтовые клиенты. Например, Windows Mail или Thunderbird. Если в них настроить подключение к тому же почтовому серверу и тоже отправленные на сервере не сохраняются, лучше спрашивать в службе поддержки самой почты.

Писал в техподдержку Яндекса с надеждой что проблема решится, но нет. Видимо задача не по зубам. Вот последний ответ от них:

Руслан, в таком случае Вы можете использовать не Яндекс, а другой почтовый сервис, который поддерживает желаемую функциональность. Или поднять у себя собственный POP3/SMTP/IMAP-сервер и настроить так, как хотите.

Добрый вечер. Подскажите, возможно вы уже решили вопрос описанный выше: "При отправке письма через BPM (интеграция с почтовым ящиком), письма сохраняются в исходящих в BPM, но в исходящих в почтовом ящике их нет."? Нужна такая функция не с Exchange или Gmail.

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

Исходящая почта из Creatio не отображается в почтовом клиенте в связи с тем, что приложение только синхронизируется с почтой на загрузку писем. Данная особенность настраивается на стороне почтового сервера. Например, при интеграции с Exchange, используется протокол EWS, который поддерживает функциональность передачи исходящих писем между клиентом и почтовым сервером. У Gmail их специалисты настроили эту возможность отдельно со своей стороны.



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

Александр, спасибо!

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

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

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

Если создать view sql (объект - представление в бд), и настроить итоги через него, это решит данный вопрос?
Есть ли другие варианты?

Нравится

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

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

Пока у меня идея такая: при инициализации секции, создавать окно с с тем ресурсом (но это не то что требуется)
Но надо, чтобы просто когда кликнули на раздел, в этой же вкладке пошла загрузка страницы (обычный клик по ссылке).

Нравится

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

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

Необходимо заместить KnowledgeBaseSectionV2:

define("KnowledgeBaseSectionV2", [], function() {
	return {
		entitySchemaName: "KnowledgeBase",
		attributes: {},
		methods: {
			init: function() {
				window.location.href = "http://bpmonline.com";
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

После нажатия на раздел будет осуществлен переход по ссылке http://bpmonline.com.

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

Добрый день
В карточке е-мейл-активности есть поле Контакт.Активность. Подскажите, пожста, как "вытащить" значение поля Е-мейл из карточки этого Контакта? Заранее спасибо

Нравится

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

Добрый день, Татьяна!

Для получения емейла можно воспользоваться механизмом esq:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/ispolzovanie-ent…
Вам необходимо выбрать Email у Contact, отфильтров по Id контакта.

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