Вопрос

Доброго дня. 

Есть в системе Контрагент, и есть Контакт у этого Контрагента.

И есть ответственный, как у Контрагента, так и у Контакта.

Однако, если у Контрагентов один Ответственный - это ведущий менеджер, то у Контактов пользователь Supervisor.

Как бы привести в соответствие ответственных из Контрагента в Контакты. Не в ручную, а автоматизированно. 

 

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

Если это так, то подскажите, какая документация может помочь? 

Или если не бизнес-процессы, то что? 

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

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

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

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

update c
set OwnerId = a.OwnerId
from Contact as c
join Account as a on c.AccountId = a.Id
 
либо (в зависимости от связи)
 
update c
set OwnerId = a.OwnerId
from Contact as c
join Account as a on c.Id = a.PrimaryContactId

Но, при создании новых контрагентов или контактов владельцы все равно будут проставлены по описанной выше логике. Так что надо будет либо сделать периодический бизнес процесс по обновлению, либо процесс по сигналу создания объекта (контрагента или контакта).

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

update c
set OwnerId = a.OwnerId
from Contact as c
join Account as a on c.AccountId = a.Id
 
либо (в зависимости от связи)
 
update c
set OwnerId = a.OwnerId
from Contact as c
join Account as a on c.Id = a.PrimaryContactId

Но, при создании новых контрагентов или контактов владельцы все равно будут проставлены по описанной выше логике. Так что надо будет либо сделать периодический бизнес процесс по обновлению, либо процесс по сигналу создания объекта (контрагента или контакта).

Сидоров Александр В.,

То есть в бизнес-процесс можно зашить этот скрипт?

Bogdan Zozulya,

Да, можно. Элемент "Задание сценарий", в нем вызов CustomQuery

Можно, но не нужно. Внутри БП для этого есть более подходящие способы: элементы чтения и изменения данных или работа в скрипте с EntitySchemaQuery.

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

Зверев Александр, 

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

Bogdan Zozulya,

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

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

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

Можно сделать два отдельных механизма: один — для разового запуска в начале, другой — постоянно готовый сработать БП на событии изменения поля «Ответственный» контрагента: получаем значение поля и элементом изменения данных меняем ответственного во всех контактах, у которых указан этот контрагент.

Bogdan Zozulya,

Если возникнут дополнительные вопросы, спрашивайте - с радостью помогу.

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

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

Сидоров Александр В.,

А как разницу связей выявить? Куда мне посмотреть, чтобы определить какой из вариаций скрипта мне подходит?

В зависимости от того, как связаны интересующие контакты с контрагентом: по полю в контрагенте «Основной контакт» или наоборот, по полю в контакте «Контрагент».

Зверев Александр,

Понял, внимательно изучил, второй вариант, по полю «Контрагент» в «Контакте». Выходит второй вариант скрипта. верно?  

update c
set OwnerId = a.OwnerId
from Contact as c
join Account as a on c.Id = a.PrimaryContactId

Нет.

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

Добрый день. Нужно решение такой задачи.

"Каждый ответственный видит только своих контрагентов"

Подскажите пожалуйста как её организовать?

Фильтрами + права доступа, или бизнес процессом. Поделитесь пожалуйста опытом.

Спасибо

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

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

Здравствуйте, Григорий!

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

"своих контрагентов" - это тех, которых он создал? Или тех,  в которых он ответственный?

Первый вариант решается, как описал Андрей.
Второй вариант решается бизнес-процессом

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

Доброго времени! 

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

Задача:
1. Поставить фильтр (допустим выдало 100 записей)
2. Нажать "Выбрать все" (показано что выбрано 100)
3. Снять 1 галочку (показано что выбрано 99)
4. Нажать "Изменить ответственного"

Методы:
var selectedRows = this.getSelectedItems();
var selectedRows = this.get("SelectedRows");

Возвращают Id только отображенных записей (29)!

Как получить ожидаемые 99 Id записей?

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

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

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

Когда загружается реестр посылается один запрос (который оптимизирован и загружает не все записи, а 30 – если у вас 100000 записей то не будет накладки по производительности). Когда вы нажимаете «Выбирать все», то не произойдет загрузки всех записей(оптимизация описанная выше), а отправится отдельный запрос который просто вернет количество и обновит название кнопки (при дебаге в network это видно). Чтобы добиться требуемого результата нужно самостоятельно посылать запрос.

Тоже столкнулся с такой проблемой. Самое простое решение, которое я нашел - это использовать функцию, возвращающую запрос на получение записей для экспорта:

                    var esq = this.getExportToExcelEsq();
                    esq.rowCount = -1;
                    esq.getEntityCollection(function (response) {...}, this);

Можно посмотреть, как она работает и заменить её своей. Результатом запроса будут все выделенные записи (99 в Вашем случае).

 

Поправка: в 7.12.2 функция, возвращающая запрос, переехала, теперь так:

var esq = this.getGridDataInitializedEsq(true);
esq.rowCount = -1;

...

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

Добрый день!

 

Есть 75 Контрагентов, который нужно сменить Ответственного. Каким образом это можно сделать?

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

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

Ну, как вариант, напишите бизнес-процесс, который изменит ответственного с учетом фильтра.

Добрый день. Самый оптимальный вариант - написать UpdateQuery. Вы можете задаться вопросом, почему бы не сделать это непосредственно в базе с помощью SQL скрипта? Дело в том, что данный вариант не затронет бизнес-логику приложения, как минимум - новому Ответственному не будут выданы полные права на запись, а также не будут запущены процессы, которые начинаются на изменение Ответственного. В то время как вариант с UpdateQuery идентичен изменению Ответственного в интерфейсе приложения.

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

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

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

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

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

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

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

Terrasoft XRM 3.3.2.43

Этот же вопрос обсуждается здесь.

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

Добрый день!
Скажите, пожалуйста, где в 7.6 itil заполняется контактом текущего пользователя при создании карточки обращения поле ответственный
в 7.5. было непосредственно в объекте case, а где в 7.6?

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

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

Проставляется значение по умолчанию из системной переменной [Контакт текущего пользователя].
Пакет CaseITIL, объект Case, колонка Owner. Это и по умолчанию, и при сохранении.

это в 7.5 было так
в 7.6 по-другому
в 7.6 - только по умолчанию, и где проставляется - не могу найти

В 7.6 логика на объекте была убрана.
Сейчас логика присутствует на карточке CasePage пакета CaseService в методе setOnwer:
/**
* Устанавливает ответственного для нового обращения.
* @protected
*/
setOwner: function() {
var isPortalUser = Terrasoft.CurrentUser.userType === Terrasoft.UserType.SSP;
if (this.isNew && !isPortalUser) {
this.set("Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT);
}
}

спасибо

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

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

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

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

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

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

Спасибо!

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

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

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

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

Спасибо!

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


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

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

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

Спасибо!

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

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

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

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

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

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

Вы не уточнили продукт и используемую версию.

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

bpm'online sales enterprise версия 7.6.0.
А как создать новых пользователей системы? Нужно просто добавить контакт?
Или для этого нужна другая система?

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

"Alina_Velichko" написал:

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

Большое вам спасибо!

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

Дмитрий, подробный ответ с ссылками по данному вопросу предоставлен в посте http://www.community.terrasoft.ru/forum/topic/12590#comment-53498

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

Можно ли фильтр Ответственный из раздела Активностей (пояснение на картинке) создать в другом разделе? Как?

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

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

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

Посмотрите пример в ActivitySectionV2 пакета NUI.

Думаю, Вам необходимо добавить на страницу раздела метод initFixedFiltersConfig:

				initFixedFiltersConfig: function() {
					var fixedFilterConfig = {
						entitySchema: this.entitySchema,
						filters: [
							{
								name: "Owner",
								caption:  this.get("Resources.Strings.OwnerFilterCaption"),
								columnName: "Owner",
								defValue: this.Terrasoft.SysValue.CURRENT_USER_CONTACT,
								dataValueType: this.Terrasoft.DataValueType.LOOKUP,
								filter: BaseFiltersGenerateModule.OwnerFilter,
								appendFilter: function(filterInfo) {
									var filter;
									if (filterInfo.value && filterInfo.value.length > 0) {
										filter = Terrasoft.createColumnInFilterWithParameters(
											"[ActivityParticipant:Activity].Participant",
											filterInfo.value);
									}
									return filter;
								}
							}
						]
					};
					this.set("FixedFilterConfig", fixedFilterConfig);
				}

И вызвать его на init'е:

...
this.initFixedFiltersConfig();
...

Единственное что, в Активностях он работает по участникам, Вам же надо просто по колонке Owner в объекте Вашего раздела.

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

BPM 5.4.0
Необходимо ставить в поле "Ответственный" в карточке Задачи не только контактов с типом "Сотрудник своей организации", но и с другим типом (допустим его id записан в переменную OtherTypeId)
В карточке задачи в скрипте ChildInitAfterParentScriptExecute есть такой код (наверняка он фильтрует)

Page.OwnerEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        var employersContactTypeUId = "60733efc-f36b-1410-a883-16d83cab0980";          
        CollectionDictionarystring, object>> filters = e.Filters;
        filters.Add(new Dictionarystring, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}}});       
};

Как добавить еще один фильтр с условием ИЛИ?

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

3 комментария
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {otherTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 

Александр, думаю, вы немного ошиблись вместо FilterComparisonType.Or надо LogicalOperationStrict.Or.
Но все равно в результате этого у меня выводит пустой список.

Как часто: сам задал вопрос, сам ответил.
А все тупо:

filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId,otherTypeUId}},
});
Войдите или зарегистрируйтесь, чтобы комментировать