Добрый день!

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

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

Вот пример сортировки которая должна сбрасываться при обновлении страницы:

MyFunc: function() {
	return {
              "ModifiedOn": {path: "ModifiedOn", 
                  orderPosition: 0, 
                  orderDirection: Terrasoft.OrderDirection.DESC 
              }
	};
}

Нравится

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

Это сохраняется не в кеше, а в профиле пользователя.
Сохраняет метод setColumnsProfile в GridUtilitiesV2:
 

setColumnsProfile: function(viewColumnsSettingsProfile, notSaveToProfile) {
			const profile = this.get("Profile");
			if (notSaveToProfile !== true) {
				const gridName = this.getDataGridName();
				if (profile[gridName]) {
					const profileKey = profile[gridName].key;
					Terrasoft.utils.saveUserProfile(profileKey, viewColumnsSettingsProfile, false);
				}
			}
			this.set("Profile", viewColumnsSettingsProfile);
		},

Нужно просто на схеме раздела заместить данный метод, чтобы он ничего не делал:

setColumnsProfile: Terrasoft.emptyFn

 

Это сохраняется не в кеше, а в профиле пользователя.
Сохраняет метод setColumnsProfile в GridUtilitiesV2:
 

setColumnsProfile: function(viewColumnsSettingsProfile, notSaveToProfile) {
			const profile = this.get("Profile");
			if (notSaveToProfile !== true) {
				const gridName = this.getDataGridName();
				if (profile[gridName]) {
					const profileKey = profile[gridName].key;
					Terrasoft.utils.saveUserProfile(profileKey, viewColumnsSettingsProfile, false);
				}
			}
			this.set("Profile", viewColumnsSettingsProfile);
		},

Нужно просто на схеме раздела заместить данный метод, чтобы он ничего не делал:

setColumnsProfile: Terrasoft.emptyFn

 

Владислав Литвинчук,

Благодарю Владислав, да, это то что нужно. Переопределил метод без логики сохранения и всё заработало. Спасибо ещё раз!

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

Добрый день, какое свойство отвечает за сохранение с игнорированием обязательных полей на js
я знаю что есть такое на c# entity.save(false)
Мне надо нечто подобное

Нравится

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

Попробуйте 

this.save({isSilent: true});

 

Александр Тыра
не подходит(

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

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

Когда нажимаю кнопку сохранить страница редактирования детали закрывается
Как я понял из постов в академии мне надо переопределеить метод onSilentSaved я пробовал несколько примеров, но пока не один не дал должного результата

Нравится

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

            save: function(config) {
                config = config || {};
                config.isSilent = true;
                this.callParent([config]);
            }

            save: function(config) {
                config = config || {};
                config.isSilent = true;
                this.callParent([config]);
            }

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

Добрый день!

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

Нравится

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

Конечно можно вам нужно переопределить механизм доступа для нужного протокола (ftp http nfs и тд) и дать права на чтение/запись, собственно ничего особо сложного нет.

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

Конечно можно вам нужно переопределить механизм доступа для нужного протокола (ftp http nfs и тд) и дать права на чтение/запись, собственно ничего особо сложного нет.

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

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

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

Возможно, подойдёт функциональность одного из этих решений. 

 Спасибо за информацию. Расширения посмотрел, но хотелось бы обойтись "малой кровью" без существенных трат. Возможно вы знаете, можно ли создать раздел в CRM, который будет связан с хранилищем, например FTP-сервер? Как это сделать? И самое главное, каким образом туда скопировать или переместить всю необходимую информацию из вложений? 

Очевидно, возможно, раз по ссылкам подобное уже сделали. Первая реализует выгрузку, третья — работу с хранилищем по FTP. Цены там указаны, одна стоит $150 в год, вторая — $43 в год на пользователя или $64 единоразово.

Доброго дня.

Из расширений маркетплейс наиболее приглянулся по функционалу пакет от SamaraSoft (https://marketplace.terrasoft.ru/app/external-file-storage-bpmonline?_g…) - у них и с файловой системой есть работа, и с ФТП и google.disk  - пока тестируем, нашел им парочку недочетов/глюков, продолжаю тестировать дальше:) из минусов - нельзя выносить свои колонки, только преднастроенные (имя, версия, картинка хранилища).
Еще небольшой минус - массовой выгрузки в "Файловую систему" нет, но это легко лечится:) и платеж тоже только разовый...

Владислав, спасибо за оценку. Благодаря вам наш продукт становится лучше!

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

Коллеги, приветствую.

Столкнулись с неожиданной проблемой при сохранении объекта в любом из пакетов: "Ошибка сохранения: Измерения массива превысили поддерживаемый диапазон.".

Никто не сталкивался? Также не понятно, где в логах найти подробную информацию об этой ошибке.

Нравится

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

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

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

Алла Савельева,

Алла, здравствуйте. На IIS сервере памяти хватает, тем не менее ошибка есть.

Arthur Matyukov,

А на сервере базы данных память проверяли?

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

Часто возникает задача загрузки данных определенной структуры в таблицы bpm'online.Решить эту задачу можно с помощью функциональности импорта из MS Excel, однако, в системе нет возможности настроить этот импорт единоразово и предоставить пользователям нужный доступ . Возможность сохранения настроек импорта в определенном разделе решила бы эту проблему. Сейчас, к сожалению, приходится извращаться

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

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

Я передал Ваше пожелание аналитикам продукта.
Они рассмотрят возможность его реализации в одной из последующих версий программного продукта.

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

Здравствуйте!
Стоит задача сохранить карточку детали без выхода из неё. Также обязательным условием является выполнение событий обработки обновления записи, описанной в объекте. (Событие SxMyObjUpdating)

this.save(), this.saveEntity(function () {}); - Событие Udpating отрабатывает, но сразу закрывается карточка

this.saveEntity() - В Событие Updating не попадает + результат:

 Uncaught TypeError: Cannot read property 'call' of undefined
core.js:466 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://pashchenko:7400/0/core/5bd338b22650c32496b5ec4322b7b2eb/combined/... line: 618
 message: Uncaught TypeError: Cannot read property 'call' of undefined
 date: Mon Feb 02 2015 18:19:25 GMT+0300 (Саудовское время (зима))

Как можно решить данную проблему?

Нравится

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

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

Здравствуйте, Александр!
Чтобы понимать, что происходит при вызове методов всегда смотрите исходники. Например, метод save() определен в "BasePageV2", выглядит следующим образом:

save: function(config) {
		this.showBodyMask();
		Terrasoft.chain(
			this.saveCheckCanEditRight,
			this.saveAsyncValidate,
			this.saveEntityInChain,
			function(next) {
				this.saveDetails(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function() {
				this.onSaved(this.cardSaveResponse, config);
				this.cardSaveResponse = null;
				delete this.cardSaveResponse;
			},
			this);
	},

Здесь нет переходов в другие разделы, значит нужно смотреть в методы, вызываемые внутри save(). Смотрим метод onSaved() и видим, что карточку можно сохранит в "тихом" режиме, тогда она закрываться не будет и не будет публиковаться сообщение "UpdateDetail", если в объекте config свойство isSilent имеет значение true:

				onSaved: function(response, config) {
					this.hideBodyMask();
					if (!this.get("NextPrcElReady")) {
						this.set("NextPrcElReady", response.nextPrcElReady);
					}
					if (config && config.isSilent) {
						this.onSilentSaved(response, config);
					} else {
........

А config, соответсвенно, берется из save(config).
Итого, нужно сохранять запись следующим образом:

this.save({isSilent:true});

Андрей, спасибо за подсказку.
Действительно так работает. Я так тоже пробовал, но оказалось, что из-за открытого дебаггера не скрывалась кнопка "Сохранить", что ввело в заблуждение.

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

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

Нравится

2 комментария
          var cardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
          var isNewRecord = (cardState.state === ConfigurationEnums.CardStateV2.ADD ||
                        cardState.state === ConfigurationEnums.CardStateV2.COPY);

или

var isNewRecord = this.cardAction === 'add' || this.cardAction === 'copy';

Спасибо, работает.

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

Здравствуйте.
У меня два вопроса.
1. Где можно посмотреть внятную помощь по вопросу Сериализации/десериализации данных в террасофте? На форуме не нашел. В файле с SDK - только пара слов: "Serialize/deserialize() - метод сохранения/восстановления объекта". А как пользоваться - не описано.

2. Как следствие, у меня возникает ошибка при попытке десериализации:

var XMLStorage = GetNewXMLStorage();
XMLStorage.InitRootNode('FiltersBuilderRootNode');
fbcFilters.FiltersBuilder.RootItems.Serialize(XMLStorage.RootNode);
FilterText = XMLStorage.Text; // тут все нормально

// теперь десериализуем. Пишем всё тоже, что и выше только теперь:
// А вот тут вдруг ни с того ни с сего ошибка "parse Error!":
XMLStorage.Text = FilterText;

Почему? Как это исправить?

Нравится

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

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

Хороший пример реализации хранения данных в профиле можно посмотреть в скрипте wnd_PlanningViewPeriodTreeScript в функциях SavePeriodTreeToProfile() и LoadPeriodTreeFromProfile().

Спасибо, Дмитрий, но у меня, к сожалению, такого скрипта нету. Версия софта - 3.2.0.87

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

Скопирую сюда:

function SavePeriodTreeToProfile() {
	if (!PlanningViewPeriodTree.Planning) {
		return;
	}
 
	var XMLStorage = GetNewXMLStorage();
	var Node;
	var Today = new Date;
	var Data;
 
	XMLStorage.Clear();
	XMLStorage.InitRootNode('PeriodTree');
	Node = XMLStorage.RootNode;
	Node.SetAttributeAsInt('BeginYear', PlanningViewPeriodTree.BeginYear, 
		Today.getFullYear());
	Node.SetAttributeAsInt('EndYear', PlanningViewPeriodTree.EndYear, 
		Today.getFullYear());
	Node.SetAttributeAsStr('Period', PlanningViewPeriodTree.Planning.Period, 
		'');
	Node.SetAttributeAsBool('IsRefreshManually', cbRefreshManually.IsChecked, 
		false);
 
	Data = DatasetToMime(dlData.Dataset);
	Node.SetAttributeAsStr('Dataset', Data, '');
 
	var Key = PlanningViewPeriodTree.Planning.ID;
	Key = '_PeriodTree_' + Key.replace(/[{}-]/g, '');
	Services.SaveItemProfileStorage(Self.USI, Key, XMLStorage);
}
function LoadPeriodTreeFromProfile() {
	if (!PlanningViewPeriodTree.Planning) {
		return false;
	}
 
	var XMLStorage;
	var Node;
	var Today = new Date;
	var Data;
 
	var Key = PlanningViewPeriodTree.Planning.ID;
	Key = '_PeriodTree_' + Key.replace(/[{}-]/g, '');
	XMLStorage = Services.GetItemProfileStorage(Self.USI, Key);
	if (!XMLStorage) {
		return false;
	}
	XMLStorage.InitRootNode('PeriodTree');
	Node = XMLStorage.RootNode;
	PlanningViewPeriodTree.BeginYear = Node.GetAttributeAsInt('BeginYear', 
		Today.getYear());
	PlanningViewPeriodTree.EndYear = Node.GetAttributeAsInt('EndYear', 
		Today.getYear());
	edtFromYear.Value = PlanningViewPeriodTree.BeginYear;
	edtToYear.Value = PlanningViewPeriodTree.EndYear;
	cbRefreshManually.IsChecked = Node.GetAttributeAsBool('IsRefreshManually', 
		false);
 
	var Period = Node.GetAttributeAsStr('Period', '');
	if (IsEmptyGUID(Period) || 
		(Period != PlanningViewPeriodTree.Planning.Period)) {
		return false;
	}
	Data = Node.GetAttributeAsStr('Dataset', '');
	if (Data == '') {
		return false;
	}
 
	var Dataset = dlData.Dataset;
	if (!MimeToDataset(Dataset, Data)) {
		return false;
	}
	Dataset.Attributes('Filled') = true;
	ExpandTree();
	return true;
}

Спасибо ещё раз. Посмотрел. Не всё, конечно, понятно, но разобрался с тем, что хотел :)

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

Подскажите как доработать приведенный ниже пример, из темы https://community.terrasoft.ua/forum/topic/3864:

Например, чтобы задачу по БП мог выполнить ответсвенный, можете добавить следующую проверку (на кнопку ОК):
if (WorkflowItemID != null)
     {
     if (Connector.CurrentUser.ContactID != OwnerID)
          {
                ShowInformationDialog('Вы не можете изменить состояние задачи!');
          return;
    }
     }

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

Нравится

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

Можно сделать поле объекта TaskEdit, на OnPrepare в него записывать false, а на DataChange - true. А при сохранении карточки проверять это поле. Если false - ничего не менялось, проверку не делаем.

Благодарю Александр!
Ваш совет опробовал, все работает. Но хотелось бы все таки другого результата:
В данной ситуации получается, если пользователь сделал изменения (н/п: пользователь не заметил что не он ответственный) и вернул все обратно, то система не дает сохранить задачу, т.к. произведены изменения и системе все равно что по факту изменений в данных не произошло.
Подскажите как избежать такую ситуацию?

В таком случае стоит на OnPrepare сохранить старые значения полей карточки в поля объекта, а в обработчике OK сравнить каждое поле объекта с карточкой. Для оптимизации полную проверку полей можно делать только в тех случаях, если на DataChange установили значение true.

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