Технические вопросы
7.x

Добрый день, возникла проблема, если заходить просто в раздел Лиды то кнопка отображается нормально, но если перейти в карточку Лида по связи, например из Активности - кнопка пропадает, как это исправить и почему вообще кнопка пропадает?

Версия 7.5.0.1328

Нравится

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

Олег, попробуйте отладить метод getIsQualificationStageActive в LeadSectionV2 чтобы понять в чем причина.

хм а при чем тут LeadSection если открывается через связь LeadPage?

p.s. прошелся дебагером по LeadPage, нашел там метод processStatusColumn который вроде должен отвечать за логику показа кнопки "Квалифицировать/Дисквалифицировать", но не понял суть, во время исполнения есть строка this.set("IsQualifyVisible", isCheckedEnabled); и туда передается true, но кнопка все равно не отображается

В LeadPage тоже есть метод getIsQualificationStageActive

Тобишь, в diff'e смотрите где определена кнопка:

{
					"operation": "insert",
					"parentName": "LeftContainer",
					"propertyName": "items",
					"name": "QualificationProcessButton",
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"caption": {"bindTo": "getQualificationProcessButtonCaption"},
						"markerValue": {"bindTo": "getQualificationProcessButtonCaption"},
						"classes": {"textClass": "actions-button-margin-right"},
						"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.RIGHT,
						"imageConfig": resources.localizableImages.QualificationProcessButtonImage,
						"click": {"bindTo": "continueQualify"},
						"layout": {"column": 6, "row": 0, "colSpan": 2},
						"visible": {"bindTo": "getIsQualificationStageActive"}
					}
				}

смотрим свойство visible и связанный с ним атрибут (метод).
В нашем случае тут метод - ставим в него дебагер, воспроизводим проблему и смотрим что не так.

хорошо, открыл я просто карточку лида, прошел с дебаггером, для нового Лида метод getIsQualificationStageActive возвращает false, но в методе processStatusColumn в переменные

this.set("isCheckedEnabled", isCheckedEnabled);
this.set("IsQualifyVisible", isCheckedEnabled);

передается true и далее выполняется метод processOperationColumn который устанавливает

this.set("IsQualifyEnabled", !this.isAddMode());

конкретно в моем случае это тоже true. Кнопка отображается.
Далее открываю Лида из Активности, с брейкпоинтами на тех же методах, приходят те же значения, но кнопка не отображается

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

Олег, добрый день!

Действительно, данная ошибка с кнопкой присутствовала в версии приложения 7.5.0.1328.
Данная ситуация была исправлена и протестирована на версиях 7.6.

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

Имеется в виду вот этот Feed

Нравится

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

Добрый день!

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

Показать все комментарии
процесс блокировка транзакция
Технические вопросы
7.x

Окружение: bpmonline 7.2

Опишу вкратце задумку:
1. На странице пользователь меняет какие-то поля у объекта жмет кнопку сохранения (это сейчас уже работает).
2. На изменение статуса (было Новое, стало Изменено) создан бизнес-процесс, в котором реализована логика обработки объекта при изменении (это сейчас уже работает).
3. Теперь требуется вызвать внешнюю процедуру (связь баз по linked server), которая в свою очередь должна получить данные по объекту и не только.

И вот как раз с третьим пунктом возникла проблема - внешняя процедура отваливается по таймауту. В ходе разбора этой проблемы, удалось выяснить следующее (поправьте если не прав):
1. бизнес-процесс вызывается в том же потоке, что и сохранение объекта
2. при этом все это происходит в одной транзакции
3. вызывая внешнюю процедуру, которая обращается в тем же данным, получаем неявную блокировку данных. Т.е. при выполнении запросов с одной базы к другой открывается своя транзакция, которая блокируется уже открытой транзакции.

Проблема "решается" если вызов вызвать в отдельном потоке (реализация через Task) - тогда транзакции закрываются в основном потоке и не мешают выполнению запроса. Или принудительно закрыть транзакцию. Но это на мой взгляд не верное решение данной проблемы. Так как отрабатывает бизнес-процесс-2 по изменению другого поля, которое изменяется в "вызове" и в результате бизнес-процесс-2 не запускается.

Можете ли вы подсказать, что можно в данном случае сделать? Может быть можно вызвать бизнес-процесс на изменения поля уже после закрытия транзакции основной, в рамках которой и изменяется объект.

поменял тему для привлечения внимания

Нравится

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

Еще момент, если реализовывать через Task, т.е. в отдельном потоке, то периодически возникает ошибка:

 file: http://****/0/core/4ec8ac09273bab8d86ca61871b5b3a39/combined/all-combined.js
 line: 460
 message: Uncaught The transaction operation cannot be performed because there are pending requests working on this transaction. 

Что, как я понимаю, указывает на проблему с транзакциями/соединениями. Их кол-во не совпадает с тем, что должно быть. Хотя я явно транзакции не открываю и не коммичу.

А что если часть логики с вызовом сторонней процедуры вынести в AFTER UPDATE/INSERT trigger?

IF UPDATE(StatusID)
BEGIN
  exec stor.proc
END

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

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

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

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

Процессы-подписчики действительно вызываются в том же потоке. Для создания нового потока используйте элемент "Таймер". Поставьте минимальное значение (1 секунда). Запуск элементов, следующих после таймера, будет осуществлятся уже в новом потоке.

Спасибо, за ответ. Попробую сделать через таймер.

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

Показать все комментарии
Кастомизированное поле
планирование
Технические вопросы
7.x

Добрый день! В планировании производится расчет Плана, Факта и Потенциала, стоит задача значения Факта заменить на кастомизированное поле из продаж. Как это можно сделать? И какой пакет за это отвечает?

Нравится

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

Игорь, здравствуйте!

Вычисления – в пакете CoreForecast.

Значение нужно вычислять в хранимке tsp_RecalculateForecastFact, в блоке

SET @SQLText = N'
SELECT
(SELECT SUM(ISNULL(fiv.[Value], 0))
FROM [ForecastItemValue] fiv
WHERE fiv.[ForecastItemId] = @P5
AND fiv.[PeriodId] = @P6
AND fiv.[ForecastIndicatorId] = @P7
) PlanAmount,
(SELECT SUM(ISNULL(o.[Amount], 0))
FROM [Opportunity] o
WHERE o.[StageId] = @P1
AND o.[DueDate] >= @P2
AND o.[DueDate] < @P3
AND o.' + @ColumnName + N' = @P4
) FactAmount,
(SELECT SUM(ISNULL(o.[Amount], 0) * ISNULL(o.[Probability], 0) / 100)
FROM [Opportunity] o
INNER JOIN [OpportunityStage] os ON os.[Id] = o.[StageId]
WHERE os.[End] = 0
AND o.[DueDate] >= @P2
AND o.[DueDate] < @P3
AND o.' + @ColumnName + N' = @P4
) PotentialAmount'

Заголовок индикатора нужно менять в таблице ForecastIndicator. Изменять нужно только Name, поле Code не трогать.

Спасибо!

"Арменчу Артём Александрович" написал:

Заголовок индикатора нужно менять в таблице ForecastIndicator. Изменять нужно только Name, поле Code не трогать.


Спасибо! А если нет доступа к таблицам?
можно сделать так?

(SELECT SUM(ISNULL(fiv.[Value], 0))
FROM [ForecastItemValue] fiv
WHERE fiv.[ForecastItemId] = @P5
AND fiv.[PeriodId] = @P6
AND fiv.[ForecastIndicatorId] = @P7
) PlanAmount,
(SELECT SUM(ISNULL(o.[UsrMarginAmount], 0))
FROM [Opportunity] o
WHERE o.[StageId] = @P1
AND o.[DueDate] >= @P2
AND o.[DueDate] < @P3
AND o.' + @ColumnName + N' = @P4
) FactAmount,
(SELECT SUM(ISNULL(o.[UsrMarginAmount], 0) * ISNULL(o.[Probability], 0) / 100)
FROM [Opportunity] o
INNER JOIN [OpportunityStage] os ON os.[Id] = o.[StageId]
WHERE os.[End] = 0
AND o.[DueDate] >= @P2
AND o.[DueDate] < @P3
AND o.' + @ColumnName + N' = @P4
) PotentialAmount'

И ещё уточнение, я же не могу править пакет CoreForecast. поэтому просто создаю tsp_RecalculateForecastFact в Custom?

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

Для этого необходимо перейти в конфигурацию, выбрать пакет Custom и перейдя на вкладку "SQL-сценарии" добавить нужный скрипт. Далее для него выполнить действие «Установить выбранные элементы» в меню «SQL скрипт».
Но настоятельно рекомендуем перед применением скриптов выполнять бэкап.

По сути вопроса: да, хранимку Вы можете поправить так, как написали. Только следует скопировать полный текст оригинальной хранимки, внести свои изменения и выполнить действие установки.

По индикатору планирования: нужно создать в пакете Custom скрипт:

UPDATE ForecastIndicator
SET Name = <Новое название индикатора в одинарных кавычках>
WHERE Code = 'Fact'

и его также установить.

"Арменчу Артём Александрович" написал:По индикатору планирования: нужно создать в пакете Custom скрипт:

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

Показать все комментарии
Технические вопросы
7.x

решил по примеру http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/DefaultValu...
создать подобное в карточке Лида , создал замещающий клиентский модуль, в исходный код внес:

define('LeadPage', [],
        function() {
                return {
                        entitySchemaName: "Lead",
                        methods: {
                                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.setPhoneBegin();
                                },
                                setPhoneBegin: function() {
                                        if (!this.get("BusinesPhone") && this.isNewMode()) {
                                                this.set("BusinesPhone", "380");
                                        }
                                }
                        }
                };
        });

теперь карточка Лида не открывается. что сделал не так?
Версия 7.2.0.1604

Нравится

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

В версии 7.2 структура страниц была немного иной.
Поэтому такой же подход как для 7.6 в данном случае не подойдет.

а где почитать, посмотреть примеры по 7,2?

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

Пример для версии 7.2

define("CasePage",
	["ext-base", "terrasoft", "sandbox", "Case", "CasePageStructure", "CasePageResources", "ConfigurationEnums",
		"BankConfigurationConstants", "BaseFiltersGenerateModule", "BankUtilities"],
	function(Ext, Terrasoft, sandbox, Case, structure, resources, ConfigurationEnums, BankConfigurationConstants,
		BaseFiltersGenerateModule, BankUtilities) {
		structure.userCode = function() {
 
			var init = this.methods.init;
			this.methods.init = function() {
				if (this.action === ConfigurationEnums.CardState.Copy) {
					this.set("Solution", "");
				}
				init.apply(this);
				this.onTypeChange(true);
			};
 
		};
 
		return structure;
	});

Здравствуйте.
У меня вопрос по карточке Лида.
Создал там несколько текстовых полей и все работало и я туда не заходил недели три.
А тут решил зайти и не получилось. В консоли получил ошибку

Что я могу тут поделать? Я так понимаю какаято проблема с полем Spent что я добавил, но не пойку как это устранить.
Вот новые значения в базе данных

Буду благодарен за помощь.

Я понял в чем проблема - я случайно удалил из конфигурации замещающий обьект Лида. Ех. Все по новой.

Добрый день!

В первую очередь рекомендуется выполнить компиляцию.
В случае, если ошибка будет воспроизводиться, попбробуйте закомментировать в схеме добавление этого поля для проверки, действительно ли проблема в нем.
Более четкие рекомендации мы можем предоставить только при наличии кода схемы LeadPageV2.

Показать все комментарии
Технические вопросы
7.x

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

Нравится

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

Тимур, здравствуйте.

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

Валидацию телефонных номеров, при внесении заполнении пользователем карточки либо детали можно прописать на сохранение карточки:
Перед сохранением считать требуемое значение поля и проверить, соответствует ли запись правилам маршрутизации (например 10 цифр, первая 9)
Пример реализации Вы можете посмотреть в следующих скриптах:

BasecCommunicationDetail:

this.addColumnValidator("Number", newItem.validateField, newItem);
columnName – имя колонки
validatorFn – функция валидации
newItem - само новое создаваемое entity

addColumnValidator: function(columnName, validatorFn, sender) {
var columnValidationConfig = sender.validationConfig[columnName] ||
(sender.validationConfig[columnName] = []);
columnValidationConfig.push(validatorFn);
}

В BaseCommunicationViewModel
function validatorFn(emailAddress) {
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; - Тут написать свой regex для телефонного адреса.
return emailPattern.test(emailAddress);
}

а можно поподробней, где и что прописать?
потому, что BasecCommunicationDetail не нашел в конфигурации

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

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

Тимур, как вы могли заметить - тема создана по конфигурации bpm'online 7.2 подозреваю, что указанный скрипт Вы не можете найти по причине того что у Вашей компании установлена версия Terrasoft 3.x.
Рекомендации по реализации на версии 3.х - во вложении

Николай, спасибо.
но меня интересует именно bpmonline 7.2

можно ли использовать такой метод?:

this.methods.save = function(isValid) {
	if (!Ext.isBoolean(isValid)) {
		isValid = true;
	}
	if (isValid) {
		var BusinesPhone = this.get('BusinesPhone');
		if (!Ext.isEmpty(BusinesPhone)) {
			BusinesPhone = BusinesPhone.trim();
			this.set('BusinesPhone', BusinesPhone);
			if (!new RegExp("^380[0-9]{9}$").test(BusinesPhone)) {
				this.showInformationDialog(resources.localizableStrings.PhoneMustFormat);
				isValid = false;
			}
		}
	}
	return isValid;
};

Тимур, да, такой метод в 7.2 можно использовать для валидации перед сохранением. Похожая логика используется при сохранении карточки счета.

Можно также вынести валидацию в отдельный метод и просто вызывать его в методе this.methods.save, а лучше в методе this.methods.validate, как в детали CommunicationDetail (она точно есть в версии 7.2).

Пример, который привёл Николай, больше подходит для версий 7.3 и выше.

на страницах с методом this.methods.validate все получается
а вот на детали окно предупреждения выскакивает, но номер сохраняеться

Тимур, уточните, пожалуйста, какой результат при этом возвращает метод validate? Если деталь не должна сохраняться, метод должен возвращать false. В базовой версии при этом не происходит сохранение карточки, которая содержит деталь, а визуально карточка остаётся в режиме редактирования, и при нажатии "Отмена" данные детали "Средства связи" не будут сохранены.

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

Тимур, Вы правы. Происходит сохранение основной схемы, поэтому страница редактирования закрывается, но при этом значения детали "Средства связи" не сохраняются.

Для того, чтобы страница не закрывалась, можно переопределить обработчик onSaved страницы редактирования ContactPage следующим образом:

this.methods.onSaved = function() {
	var saveDetailResponse = sandbox.publish("SaveDetails",
		null, ["ViewModule_CardModule_Contact_detail_communications"]);
	if (saveDetailResponse && saveDetailResponse.cancel) {
		return;
	}
	this.callParent(arguments);
}

Для AccountPage можно создать аналогичный обработчик, заменив Contact на Account в идентификаторе модуля.

добавил ваш код
ничего не поменялось

Вы пробовали включать отладчик? Какое значение переменной saveDetailResponse после публикации сообщения "SaveDetails"?

Если валидация детали реализована правильно, при попытке сохранения карточки с некорректным значением на детали "Средства связи" эта переменная должна содержать объект {cancel: true}.

saveDetailResponse - null

Значит, данные на детали корректны либо так считает метод валидации. Необходимо установить breakpoint в методе валидации и проверить его работу.

у меня создан замещающий клиентский модуль на CommunicationDetail
и в случае не соответствия телефона или email то showInformationDialog выскакивает с предупреждением.

structure.userCode = function() {
	this.methods.validate = function() {
		var Number = this.get('Number');
		var communicationType = this.get('CommunicationType');
		switch (communicationType.value.toLowerCase()) {
			case (ConfigurationConstants.CommunicationType.Email.toLowerCase()):
				if (!Ext.isEmpty(Number)) {
					Number = Number.trim();
					this.set('Number', Number);
					if (!new RegExp("^([a-z0-9_\\.-]+)@([a-z0-9_\\.-]+)\\.([a-z\\.]{2,6})$").test(Number)) {
						this.showInformationDialog(resources.localizableStrings.EmailMustFormat);
						return false;
					}
				}
				return true;
			case ('6a3fb10c-67cc-df11-9b2a-001d60e938c6'):
			case ('2b387201-67cc-df11-9b2a-001d60e938c6'):
				if (!Ext.isEmpty(Number)) {
					Number = Number.trim();
					this.set('Number', Number);
					if (Number.substr(0, 2) === '38' && Number.length === 2) {
						this.set('Number', null);
					} else
					if (!new RegExp("^380[0-9]{9}$").test(Number)) {
						this.showInformationDialog(resources.localizableStrings.PhoneMustFormat);
						return false;
					}
				}
				return true;
			default:
			return true;
		}
	};
	};
	return structure;
});

а точно надо использовать sandbox.publish ?

С помощью sandbox.publish публикуется сообщение, на которое подписан модуль базовой детали. По этому сообщению он пытается сохранить деталь, вызывая метод валидации для каждого её элемента. Если валидация не прошла, модуль возвращает объект с одним свойством cancel, равным true.

Если в Вашем случае возвращается неопределённое значение при корректной реализации метода валидации - возможно, в Вашем случае id детали не равен "ViewModule_CardModule_Contact_detail_communications" (я проверял на базовой версии). В этом случае необходимо указать корректный id.

огромное спасибо.
у меня id: "ViewModule_CardModule_detail_communications"

Показать все комментарии
SVN
Технические вопросы
7.x

На bpm'online 7.5 подключили SVN (иначе было никак не создать новый пакет). И стали замечать странные вещи - вдруг оказывается, что пропадают последние изменения.
И при этом Modified On поле на базе разработке у некоторых(!) схем пакета явно более старое, чем уже на сайте клиента.

Поддержка сказала, что что-то с SVN, наверное.
Подскажите, может ли SVN как-то самостоятельно восстанавливать какие-то схемы? И как заблокировать ему эту возможность?

Нравится

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

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

Прошу уточнить следующее:
1. Почему без SVN не создать новый пакет?
2. После чего пропадают изменения? После выполнения какого-то действия, или после прохождения определённого периода времени?

1. При добавлении пакета было обязательное поле Version Control System Repository
2. Не удалось отследить. Причём, последний раз новые схемы полностью исчезли - пришлось их восстанаваливать по файлам

Владимир, SVN самостоятельно не может восстанавливать схемы.
Это либо паранормальное явление, либо кто-то всё же удаляет измения. Попробуйте на сутки ограничить доступ, чтобы к хранилищу могли подключиться только Вы. И проверить, будет ли наблюдаться описанная ситуация.

Показать все комментарии
OData
Технические вопросы
7.x

Добрый день. Скачал триал версию BPMonline. Хочу немного разобраться в структуре.

Например у меня задача изменить объект (какой либо справочник) из внешнего приложения. Отсюда(http://academy.terrasoft.ua/documents/docs/technic/SDK/7.4.0/WorkWithBpm...) я понял что это возможно, через HTTP.

Но непонятен URL к которому нужно отправить запрос. А конкретно, что такое "имя прилоджения"? Где его брать? Нужно ли гдето регистрировать? Может есть более подробная документация по этой теме или примеры?

http[s]://имя_сервера>/имя_приложения_bpm'online>/0/ServiceModel/EntityDataService.svc

Нравится

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

Это всего лишь адрес вашего сайта, вроде https://mycompany.bpmonline.com/0/Nui/ViewModule.aspx#SectionModuleV2/CampaignSectionV2

Имя приложения - это alias application'a вашего сайта в IIS. Обычно application именуют 0, 1, 2... и т.д.

Спасибо. С этим вроде разобрался, через URL в браузере возвращается XML.

Но проблемы с авторизацией теперь, если AJAX запрос делать

var request=newRequest();
var url="https://test.bpmonline.com/0/ServiceModel/EntityDataService.svc";
var param = JSON.stringify({
"UserName":"Иванов Иван",
"UserPassword":"ХХХХХХХХ"
});
request.onreadystatechange=function()
{
if (request.readyState==4) {
if (request.status==200) {
var answer=request.responseText;
alert(answer)
}
else alert('Ошибка '+request.status+" Попробуйте еще раз!");
}
}
request.open("POST", url, true);
request.setRequestHeader("Content-Type", "application/json");
//request.setRequestHeader("Authorization", "Basic " + Base64.encode("Иванов Иван" + ":" + "ХХХХХХХХ"));
request.send(param);

Ответ: 401Unauthorized

Как правильно через AJAX авторизацию запроса сделать? Пробовал и так, и как в коммнте в коде, и прям в URL подставлял логин и пароль.

Михаил, достал для Вас следующие примеры:

Запросы на добавление данных
Для того, чтобы добавить запись, нужно послать серверу POST запрос, указав значения колонок в теле запроса. В качестве ответа придет представление созданной Entity. Ниже создается контакт, ему проставляются значения полей Id, Name, BirthDate, Gender. Данные в обе стороны передаются в формате JSON.
Пример запроса на добавление с использованием API Sencha Touch

var serviceUrl = "http://tscoredev5:88/BPMonline540Solution/0/ServiceModel/EntityDataService.svc/";
Ext.Ajax.request({
    url: serviceUrl + 'ContactCollection',
    headers: {
        'Content-Type': 'application/json',    
        'Accept': 'application/json',
        'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
    },
    jsonData: {
        Id: 'C624E607-C6B2-4A3D-9E6D-06E17FAA35C9',
        Name: 'John Best',
        BirthDate: new Date(123321123321),
        Gender: {__metadata: { uri: serviceUrl + 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
    },
    method: 'POST'
});

Запросы на обновление данных
Для обновления данных нужно послать HTTP запрос с кастомным OData-специфическим типом операции MERGE. если послать запрос с типом операции PUT, то все колонки Entity, не указанные в запросе будут заполнены своими значениями по-умолчанию.
Пример запроса на обновление с использованием API Sencha Touch

var serviceUrl = "http://tscoredev5:88/BPMonline540Solution/0/ServiceModel/EntityDataService.svc/";
Ext.Ajax.request({
    url: serviceUrl + 'ContactCollection(guid\'5B62E943-155F-42CE-A41A-EFA650BAA0A0\')',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
    },
    jsonData: {
        Name: 'John',
        BirthDate: new Date(123321123321),
        Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
    },
    method: 'MERGE'
});

Запросы на удаление данных
Тут все просто:
Пример запроса на удаление с использованием API Sencha Touch

var serviceUrl = "http://tscoredev5:88/BPMonline540Solution/0/ServiceModel/EntityDataService.svc/";
Ext.Ajax.request({
    url: this.serviceUrl + 'ContactCollection(guid\'C624E607-C6B2-4A3D-9E6D-06E17FAA35C9\')',
    headers: {
        'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
    },
    method: 'DELETE'
});

Спасибо заа примеры. Но проблема на данный момент с авторизацией.

Перепробовал уже все что на форуме нашел

1) Тут (http://www.community.terrasoft.ru/forum/topic/10573) описана проблема один в один, но я так понял, не решилась. Имя пользователя, на всякий случай, поменял на латиницу. Права на Операцию - "Доступ к Odata" есть, а вот на доступ к Объекту я не понял, как имнно установить. Но проблема скорее всего не в них.

2) Тут (http://www.community.terrasoft.ru/forum/topic/9613) описан достутп через PHP, а заодно попробовал обратится к серверу авторизации (..ServiceModel/AuthService.svc/Login). Ответ:{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

В чем проблема, не представляю. Может еще какоето разрешение в админке требуется? Или дополнительные параметры авторизации, типа "WorkspaceName", "TimeZoneOffset", "Language"

Насчет прав доступа на объекты:
Вам нужно войти в Дизайнер системы –> Управление конфигурацией –> Конфигурация. В строке поиска ввести заголовок объекта и нажать ‘Enter’. Найти в результатах нужный объект и посмотреть его Название.
Перейти на вкладку «Администрирование: Доступ к объектам», применить фильтр по заголовку и найти нужный объект. Внизу, на вкладке «Доступ к объекту для внешних ресурсов» добавить доступ для сотрудника, под которым вы авторизируетесь.

Если нужно получить коллекцию, например Контактов, то даём права на Contact, а для обращения к коллекции добавляем слово «Collection» = «ContactCollection».

Показать все комментарии
Контрагент
ответственный
Технические вопросы
7.x

Добрый день!
Возникла такая необходимость: реализовать возможность добавления второго ответственного контрагенту. Никто не сталкивался с таким?
Sales 7.5

Нравится

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

Александр, здравствуйте!
Данное поле является системным. Потому, к сожалению, его дублирование или удаление не представляется возможным.

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

Спасибо!

Судя по всему, необходимо добавить деталь "Ответственные" (а вдруг потом будет 3 ответственных). И реализовать раздачу прав доступа в бизнес-процессе.
Но это будет совсем нестандартное решение

"Арменчу Артём Александрович" написал:

Александр, здравствуйте!

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

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

Спасибо!

С уважением, Арменчу Артём.


Добрый день!
К сожалению, задача не только в том, чтобы дать доступ к карточке контрагента кому-то еще. Поэтому только прав недостаточно.

Александр, здравствуйте!

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

Спасибо!

А в чем собственно сложность то? Сделайте новое поле, назовите Owner2 повесьте на список доступных значений фильтр типа Контакт.Контрагент = Наша компания, заполнение по умолчанию через объект. Доступ на основе поля как предлагал Владимир реализовать в БП...

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

Доброго времени суток, друзья!
Скажите , пожалуйста, существует ли возможность постить записи в Ленте объекта (например в Продаже), таким образом, что бы этот пост видели в коммуникационной панели Все сотрудники компании, или какая-то другая организационная / функциональная роль?
Всем спасибо!

Нравится

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

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

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

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

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

На вкладке Лента(страница редактирования раздела) Вы можете опубликовать сообщение, адресованное определенному пользователю.

Для решения задачи рекомендуем перейти в раздел Лента. Добавить новый канал. В свойстве канала, деталь Подписчики указать пользователей/группу пользователей согласно Вашей бизнес логике, которым будут адресованы сообщения.

Здравствуйте, Олег.
А как можно настроить систему уведомления по новому сообщению в ленте? Чтобы пользователи, которым всё это адресовано, были в курсе о добавленной записи.

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

"Вильшанский Дмитрий" написал:

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

На данный момент в ленте есть 2 канала: новости и кофейня.
На оба канала есть подписка. Однако, при добавлении записи в канал, допустим кофейня, уведомление не приходит, что появилась новая запись. Но в самом разделе ленты всё показывается.
Как можно настроить уведомление о новой записи?

Дмитрий, для того, чтобы в уведомления отображались пользователю, необходимо его упоминать сообщении (Рис . 1-3). Используйте для это «@».


Рис. 1


Рис. 2


Рис. 3

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

Дмитрий, данная реализация возможно в рамках проектной доработки. В базовой версии данного функционала нет.

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

Добрый день!

"для того, чтобы в уведомления в канале отображались пользователю, необходимо его упоминать сообщении Используйте для это «@»"

А как можно упоминать в сообщении не конкретного пользователя, а группу пользователей?
Например, у меня канал, на который подписана группа, в которой 300 человек(веб-портал) - хочется, чтобы пришло уведомление всей группе

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

Согласно базовой логикой упомянуть можно только контакта, у которого есть пользователь (Рис. 1).

Рис. 1

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

Спасибо

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