Вопрос

Добрый день!

Подскажите, пожалуйста, возможно ли внутри 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;
}

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

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

Подскажите как доработать приведенный ниже пример, из темы http://www.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.

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

Добрый день.
Возникла такая неприятность. Создаю справочники всё как описано в F.A.Q, добовляю значения в Справочник, LookUpDataControl привязываю, всё запускаю и даже работает, только не сохраняются выбираемые из созднных справочников значения. Помогите пожалуста решить проблемку. Заранее благодарю

У меня такой же вопрос

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

Недавно было подобное:
http://community.terrasoft.ua/blogs/4991
Проверьте sq_, скорее всего "потерялась" привязка поля из таблицы к колонке запроса.

Добрый день, Павел. Проверил FAQ, обнаружил неточность в документе.
В шаге 8, редактирование сервиса sq_Account, необходимо добавить две колонки - одна с Вашим полем, содержащим код элемента справочника (пример - поле CityID), вторая - с названием элемента, считанного из присоединенной таблицы (пример - в этом же запросе колонка CityName).
Далее в шаге 9, редактирование ds_Account, необходимо корректно настроить созданное поле типа "Справочник". Для этого поля значения "Колонка" и "Колонка для отображения" должны содержать различные значения (см. пример все то же поле CityID). Поле типа "Справочник" создается на основе двух _различных_ колонок, содержащих код и название записи справочника.
В общем, лучший совет - смотреть правильно работающий пример. Желаю успехов!

всё заработало!!! спасибо, большое

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