Представим, что есть некий ftp.

Так же в некой карточке есть Iframe в котором отображается данный ftp.

Так вот вопрос, есть предположения каким обраом осуществить загрузку файла на ftp по клику на кнопку?

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

Так что коллеги, прошу Вашей мудрой помощи и идей.

Нравится

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

"и файл выбирается" — это onFileUpload срабатывает или у вас есть стрим с файлом в своём сервисе? 

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

Срабатывает onFileSelect и конец. Набор свойств внутри этого метода довольно скудный. 

Тоже думал по такому принципу отправлять, но нет, стрима нет пока что.

Кисловский Михаил Андреевич,

Где-то тут недавно я писал целый меморандум, о том как загрузить любой файл в свой сервис. Спасибо ребятам из терика, которые сломали  .../track секцию в профиле пользователя на форуме и сейчас свою историю найти нереально. как найду - скину ссылку.

Варфоломеев Данила пишет:

как найду - скину ссылку.

Буду признателен.

P.s. Не в первый раз) 

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

На странице редактирования записи раздела A есть деталь Samples.

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

Добавлено строковое виртуальное поле [Sample ID] (скрин во вложении). Пользователь бипирует образец с нужным штрихкодом, который вносится в это поле, потом нажимает кнопку [Find sample] и выполняется некоторая функциональность по обработке образца с таким номером, если он найден на данной детали.

Проблема заключается в том, что иногда на детали очень много образцов и нужная запись не всегда находится 'на глазах' у пользователя. Если пользователь будет вручную её искать, то на это будет уходить много времени.

Решением такой проблемы может быть, например, чтобы при нажатии на кнопку [Find sample] накладывался фильтр по полю Sample детали.

При этом важно, чтобы фильтр тоже отображался визуально, аналогично тому, если бы пользователь установил его вручную!

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

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

Возможно, есть другие варианты решения этой задачи: чтобы изменяемая запись была перед глазами пользователя? Кто-то имел опыт разработки такой функциональности или, возможно, видит другие пути решения?

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

Нравится

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

1) В tools детали кладёте textEdit и кнопку. По желанию можно залепить всё это стилями для красоты.

2) По нажатию на кнопку делается reloadGridData()

3) В initQueryFilters считываете значение из поля, если есть пользователь ввел хоть что-то, в esq добавляете свой фильтр (допустим как я делал: по названию, тип сравнения CONTAINS)

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

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

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

К примеру. Есть карточка Заказа, на которой есть поле Контрагент. И есть справочное поле Договор. Открываем поле Договор. Не находим требуемого договора и жмем Добавить прямо в модальном окне - открывается карточка добавления Договора. Необходимо, чтобы поле Контрагент в добавляемом договоре было заполнено также как и в карточке Заказа

Нравится

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

Если открытие прошло по цепочке то прошлая схема должна еще быть в памяти, можете организовать их общение через песочницу, подробнее про песочницу тут:

https://community.terrasoft.ru/questions/est-li-manual-po-ispolzovaniu-…

Андрей, удалось вам реализовать ваш кейс?  у нас такая же проблема с передачей идентификатора начального объекта.

Добрый день.

Извиняюсь, что поздно, но лучше поздно чем никогда. Вот пример. Есть карточка обращения и в ней справочное поле Продажа (NrbOpportunity). В продаже есть поле Продукт (NrbProduct), которое должно автоматически заполниться значением из обращения, из которого создаем продажу (поле NrbProductBase в обращении). В карточке обращения (CasePage) достаточно переопределить два метода.

			openLookup: function(config, callback, scope) {
				/// <summary>overridden. Базовый метод, который срабатывает при открытии модального окна справочника.</summary>
				if (config && config.columnName === "NrbOpportunity") {
					config.valuePairs = this.getNrbValuePairs();
				}
				this.callParent(arguments);
			},
 
			getNrbValuePairs: function() {
				/// <summary>Инициализирует значения для карточки продажи при ее добавлении из карточки обращения.</summary>
				var valuePairs = [];
				var product = this.get("NrbProductBase") && this.get("NrbProductBase").value;
				if (product) {
					valuePairs.push(
							{
								name: "NrbProduct",
								value: product
							});
				}
				return valuePairs;
			},

 

Андрей, Спасибище!!!

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

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

При разработке бизнес-процесса необходимо установить значение логического параметра.

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

Установил с помощью контексно меню дизайнера. Но при сохранении выдает ошибку.

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

Эти ошибки не дают возможности скомпилировать конфигурацию.

Подскажите, что сделать?

Нравится

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

а если через "формулу" задать true/false заработает?

Здравствуйте, Данила. Собственно, true и false установил, конфигурация скомпилировалась. Заработало) Но осадочек остался) Спасибо за оперативную помощь. 

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

Как обновить деталь reloadDetail?

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

В схеме детали на эту кнопку я сделал ссылку в свойстве visible и он успешно работает. Но деталь загружается на страницу 1 раз при входе. Нужно обновлять деталь и видимость ее кнопок после изменения поля прямо внутри страницы.

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

this.reloadDetail("MyDetailName");

Она вызывается, но вызывает ошибку - entitySchemaInfo is undefined

Как обновить деталь вместе с контролами и их видимостью?

Нравится

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

Откуда взялась reloadDetail и как её применить?

Сделай перестрел событий по sandbox. По клику на + посылай message в карточку, карточка как только получает эту мессагу посылает в ответ сообщение со значением вашего поля. Деталь принимает это сообщение и обрабатывает его и так далее и тому подобное.

Это сделать проще ну или можно покопаться  в кишках:

Кисловский Михаил Андреевич,

значение поля я и так получаю внутри детали. просто запросом к entity, но я не могу после этого сообщить детали, чтобы она полностью перегрузилась, чтобы изменилась видимость кнопки +. при нажатии + вызывается метод, ну да. 

Если вам нужна видимость то она, на мой взгляд, решится только this.reloadEntity самой карточки.

При попытке реализовать данный метод ничего не вышло. У Terrasoft нету entitySchemaInfo вобще и по исходникам примеров вызова данного метода не наблюдается.

 

Кисловский Михаил Андреевич,

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

Данько Дмитрий Леонидович пишет:

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

 Почему баг? Остатки старой реализации, либо узкоприменимый для особых нужд метод. 

Это нормально.

Кисловский Михаил Андреевич,

понял спасибо. а как лучше применить 

this.reloadEntity на странице раздела там где находится деталь, если да, то с какими параметрами?

Данько Дмитрий Леонидович,

Специально для тебя и для тех кто будет потом искать по этой теме. В кишках исходников нашёл this.updateDetail.

Пример использования:

this.details - полный массив деталей на какой либо карточке,

this.updateDetail({"detail": "Название детали из этого массива"}); - для перезагрузки

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

)))) спасибо за помощь. но это не то. .updateDetail перегружает ТОЛЬКО грид, ТОЛЬКО данные. он как раз у меня работает. нужен именно reloadDetail, который перегружает контрол целиком вместе с кнопками и гридом. в этом фишка

Данько Дмитрий Леонидович,

Кисловский Михаил Андреевич,

Чисто на уровне теории:

1) Замещаем BaseDetailV2

define("BaseDetailV2", ["terrasoft"],
	function(Terrasoft) {
		return {
			messages: {
				"ReloadDetail": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE
				}
			},
			methods: {
				subscribeSandboxEvents: function() {
					this.sandbox.subscribe("ReloadDetail", function(config) {
						this.init(function() {}, this);
					}, this, [this.sandbox.id]);
				}
			}
		};
	}
);

2) Замещаем BasePageV2, добавить этот кусок

messages: {
	"ReloadDetail": {
		mode: Terrasoft.MessageMode.PTP,
		direction: Terrasoft.MessageDirectionType.PUBLISH
	}
},
methods: {
        reloadDetail: function(detailName) {
		var args = {}; //тут можно что-нибудь кинуть в деталь
		Terrasoft.each(this.details, function(detailInfo) {
			if (detailInfo.detailName === detailName) {
				this.sandbox.publish("ReloadDetail", args, [this.getDetailId('ContactCommunication')]);
			}
		}, this);
	},
}

Ну и если теперь кинуть что-то типа this.reloadDetail('ContactCommunication');

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

я не нашел подписку на событие 

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

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

Вопрос: кто- нибудь решал подобную проблему? Можно ли сделать визульное/звуковое уведомление при работе в браузере, например Google Chrom?

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

Нравится

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

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

Данный функционал уже реализован в системе, более подробно Вы можете ознакомиться в статье Академии: https://academy.terrasoft.ru/documents/sales-enterprise/7-11/kak-obraba…

Спасибо! А есть возможность включать/ отключать звук этих уведомлений?

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

Уведомления приходят без звука. 

Новак Руслан пишет:

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

Уведомления приходят без звука. 

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

Никита, эти уведомления — функция браузера. Вы можете или поставить плагин для звуков при любых уведомлениях (не только от Creatio) или воспроизводить звук кодом самостоятельно, как описано тут:

function playSound(url) {
  const audio = new Audio(url);
  audio.play();
}

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

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

Здравствуйте, нужно подписаться на сообщение pushHistoryState в схеме секции. Вопрос, как это сделать? Существуют ли какие нибудь методы для обработки параметров, передаваемых в этом сообщении?

Нравится

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

Вот здесь расширяли и дополняли своей логикой возврат в карточку:

https://community.terrasoft.ru/questions/sobytie-obrabotcik-vozvrasenia…

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

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

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

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

Была попытка в обработчике onEmbeddedDetailItemApplied контроллера добавить фильтр на поле Participant.

Примерно таким кодом:

var filter,
	filterName = "OnContactTypeFilter";
	filter = Ext.create("Terrasoft.Filter", {
		name: filterName,
		modelName: "Contact",
		assocProperty: "Id",
		property: "Type",
		value: "66a90515-0026-4f43-93a5-dc3e9c18f552"
	});
 
	record.changeProperty("Participant", {
		removeFilter: filterName
	});
	if (!Ext.isEmpty(filter)) {
		record.changeProperty("Participant", {
		addFilter: filter
	});
	}

Но это не возымело эффекта.

Где же еще можно настроить данный фильтр?

Нравится

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

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

 

Судя по предоставленным данным у Вас некорректно настроена конструкция фильтра. Более правильно будет следующим образом:

filter = Ext.create("Terrasoft.Filter", {

name: filterName,

property: "Type",

value: "66a90515-0026-4f43-93a5-dc3e9c18f552"

});

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

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

Подскажите пожалуйста, как в BPM сформировать браузерные push-уведомления?

И где находиться код который формирует браузерные push-уведомления при получении сообщения в ленту?

Нравится

1 комментарий
createNotification: function(message) {
	var self = this;
	if (Notification.permission === "granted") {
		var data = JSON.parse(message.Body);
		var tag = "Message" + Terrasoft.generateGUID();
		var notifyMe = new Notification(data.nameFrom, {
			tag : tag,
			body : data.text,
			icon : this.getImg(data.img),
			data: { path: Terrasoft.workspaceBaseUrl + "/Nui/ViewModule.aspx#CardModuleV2/ContactPageV2/edit/" + data.valueFrom}
		});
		setTimeout(notifyMe.close.bind(notifyMe), 3 * 1000); ///close notification
		notifyMe.onclick = function() {
			this.close();
			//window.open(this.data.path, "_self");
			//this.close();
		};
	}
},
getImg: function(imageId) {
	return imageId ? (Terrasoft.ImageUrlBuilder.getUrl({
		source: Terrasoft.ImageSources.ENTITY_COLUMN,
		params: {
			schemaName: "SysImage",
			columnName: "Data",
			primaryColumnValue: imageId
		}
	})) : Terrasoft.ImageUrlBuilder.getUrl(this.get("Resources.Images.WhoIsDis"));
}

Где-то на хабре должна валяться целая статья про Notification, попробуйте погуглить.

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

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

core.js:321 Uncaught TypeError: Cannot read property 'css' of null

    at constructor.loadModule (core.js:321)

    at constructor.injectedSandbox.loadModule (core.js:557)

    at i.loadMyModal (ITRoute1Page.js:200)

    at i.onMyClick (ITRoute1Page.js:208)

    at i.onCardAction (SectionBundleModule.js:25266)

    at i.callModelMethod (all-combined.js:532)

    at i. (all-combined.js:527)

    at i.fire (all-combined.js:1)

    at i.continueFireEvent (all-combined.js:1)

    at i.fireEventArgs (all-combined.js:1)

loadModule @ core.js:321

injectedSandbox.loadModule @ core.js:557

loadMyModal @ ITRoute1Page.js:200

onMyClick @ ITRoute1Page.js:208

onCardAction @ SectionBundleModule.js:25266

callModelMethod @ all-combined.js:532

(anonymous) @ all-combined.js:527

fire @ all-combined.js:1

continueFireEvent @ all-combined.js:1

fireEventArgs @ all-combined.js:1

fireEvent @ all-combined.js:1

onClick @ all-combined.js:1464

(anonymous) @ VM1476:6

k @ all-combined.js:1

core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647

 file: http://localhost:82/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd…?

 line: 321

 column: 23

 message: Uncaught TypeError: Cannot read property 'css' of null 

 date: Wed Sep 06 2017 18:53:08 GMT+0300 (RTZ 2 (зима))

 stack: TypeError: Cannot read property 'css' of null

    at constructor.loadModule (http://localhost:82/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd…)

    at constructor.injectedSandbox.loadModule (http://localhost:82/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd…)

    at i.loadMyModal (http://localhost:82/0/configuration/bd4295bf69df92756a9874ef03769838ru-…)

    at i.onMyClick (http://localhost:82/0/configuration/bd4295bf69df92756a9874ef03769838ru-…)

    at i.onCardAction (http://localhost:82/0/configuration/7780bccaa707bb5d986ffb3da67b6f6b/Se…)

    at i.callModelMethod (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)

    at i. (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)

    at i.fire (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)

    at i.continueFireEvent (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)

    at i.fireEventArgs (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)

 

В чем может быть проблема?

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

Нравится

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

Здравствуйте, напишите в поддержку с предоставлением доступа к сайту, инструкцию проверили, работает.

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