Вопрос

Доброго дня. 

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

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

Однако, если у Контрагентов один Ответственный - это ведущий менеджер, то у Контактов пользователь 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

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

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

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

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 комментария

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

Функциональность создания новой записи из справочника реализована в LookupQuickAddMixin.

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

За эту функциональность отвечает фича UseSilentCreation.

"Demchenko Olha" написал:

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

Функциональность создания новой записи из справочника реализована в LookupQuickAddMixin.

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

За эту функциональность отвечает фича UseSilentCreation.

Ольга, спасибо!

Я, как раз перед Вашим ответом нашел нужный модуль LookupQuickAddMixin :smile:
Заместил его, и добавил необходимое условие, чтобы срабатывал метод openPageForNewEntity.
Все работает корректно!

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

Здравствуйте! Подскажите, пожалуйста, как добавить JS событие при сохранении контрагента/контакта?
Вот кусок кода на странцие:

methods: {
fir: function()
{
if (this.get("UsrKey").checked)
{
this.set("UsrLoyaltyOfContact", "Лояльно");
}
else
{
this.set("UsrLoyaltyOfContact", "Не определено");
}
}

}

UsrKey - Boolen Checkbox, UsrLoyaltyOfContact - Справочник.

Не могу разобраться, куда подвесить событие?

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

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

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

Что-то похожее ранее обсуждалось здесь.

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

                        // Переопределение базового метода Terrasoft.BasePageV2.OnSaved.
			// Выполняет постобработку сохранения записи
			onSaved: function(response, config) {
				// Вызов родительской реализации.
				this.callParent(arguments);
                                //Вызов Вашего метода
                                fir();
			}
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

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

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

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

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

Добрый день, Николай! По структуре данных всё осталось как и раньше: в объекте находятся оба поля: и Контрагент, и Контакт. А вот на странице используется специальный контрол. Вся логика прописана в схеме страницы. Можете взять за пример счет или заказ и скопировать в любую нужную вам сущность.

Юлия, спасибо! Буду пробовать.

Николай, необходимо сделать следующее:
- Добавить аттрибут Client с колонками Contact, Account (можно посмотреть в InvoicePageV2)
- В diff добавить поле Клиент и скрыть поля Account и Contact
- Настроить правила фильтрации (несколько полей в договорах вроде по Account фильтруются)

Еще раз спасибо за информацию - все получилось.
Но, столкнулся с одним нюансом. При выборе в поле Client записи из таблицы Contact, у которой в свою очередь проинициализировано поле Account, происходит заполнение поля Account в договоре, но согласно нашей бизнес-логике, такого не должно происходить.
Как я понимаю, это "дело рук" одного из унаследованных бизнес-правил. В связи с этим вопрос - как правильно отключать унаследованные бизнес-правила?
Пока вышел из ситуации переопределением данного бизнес-правила:

"Contact": {
  "FiltrationContactByAccount": {
    "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
    "autocomplete": false,
    "autoClean": false,
    "baseAttributePatch": "Account",
    "comparisonType": this.Terrasoft.ComparisonType.EQUAL,
    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
    "attribute": "Account"
  }
}

Здравствуйте, Николай!

Вам необходимо заместить базовое правило его переопределением.

Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:

message: Cannot read property 'split' of undefined 
 date: Tue Dec 15 2015 23:53:11 GMT+1000 (VLAT)
 moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage
 moduleName: LookupPage

Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?

Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:

message: Cannot read property 'split' of undefined 
 date: Tue Dec 15 2015 23:53:11 GMT+1000 (VLAT)
 moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage
 moduleName: LookupPage

Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?

Проверил данный способ как на Документах, так и на Договорах. Опишу по пунктам действия:

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

2. Убедился что в объекте есть колонки как "Контакт" так и "Контрагент".

3. Добавил зависимость на бизнес правила:

define('ContractPageV2', ['ContractPageV2Resources', 'GeneralDetails', "BusinessRuleModule"],
function(resources, GeneralDetails, BusinessRuleModule) {

4. Добавил атрибут:

attributes: {
   "Client": {
	"caption": "TestClient",
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": false
   }
},

5. Вывел поле на форму:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"parentName": "Header",
		"propertyName": "items",
		"name": "Client",
		"values": {
			"layout": {"column": 0, "row": 3, "colSpan": 12},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		}
	}
]/**SCHEMA_DIFF*/,

6. Добавил правило:

rules: {
	"Contact": {
		"FiltrationContactByAccount": {
			"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
			"autocomplete": false,
			"autoClean": false,
			"baseAttributePatch": "Account",
			"comparisonType": this.Terrasoft.ComparisonType.EQUAL,
			"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
			"attribute": "Account"
		}
	}
},

7. В расчет не беру того факта что поле "Контрагент" по умолчанию обязательное к заполнению в договоре, но отключить это условие, не должно составить проблем, если то позволяет ваша бизнес логика.

Как итог, все работает:

Возможно причина ошибки в дополнительных действиях. Логика же добавления мультиполя верна.
Версия: 7.7.0.2161
Полный код схемы: https://jsfiddle.net/4x35pknd/

Причину ошибки удалось установить совместными усилиями с техподдержкой.
Дело оказалось в том, что пакете SalesContracts переопределен метод loadVocabulary, из-за этой подмены, карточка не открывалась. Нужно было вернуть методу исходный вид из карточки BasePageV2 и проблема ушла.
На всякий случай, вдруг кому-то еще пригодится, вот этот фрагмент кода:

methods: {
  loadVocabulary: function(args, columnName) {
    var multiLookupColumns = this.getMultiLookupColumns(columnName);
    var config = (Ext.isEmpty(multiLookupColumns))
      ? this.getLookupPageConfig(args, columnName)
	: this.getMultiLookupPageConfig(args, columnName);
    this.openLookup(config, this.onLookupResult, this);
  }
}
Войдите или зарегистрируйтесь, чтобы комментировать

Добрый день,
в документации об очередях сказано:

"В параметрах очереди нужно выбрать объект, на основании которого она будет формироваться.
Например, для настройки параметров обработки обращений, в поле [Тип очереди] необходимо
выбрать “Обращение”, а для обработки неподтвержденных контактов — “Контакт”. В поле
[Процесс] указывается бизнес-процесс, который запускается в момент, когда оператор берет в
работу тот или иной элемент очереди."

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

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

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

Добрый день, Маргарита!

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

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

а какие Процессы подключаются к таким очередям?

они есть в базовом пакете, или их нужно создавать самостоятельно?

Маргарита, Все зависит от Ваших целей.

В коробочной версии продукта bpm'online ITIL transitions предусмотрен процесс обработки обращений из очереди.

Вы можете самостоятельно настроить процесс для приглашения участников мероприятия. К примеру, такой процесс может включать вопрос пользователю "планирует ли клиент участвовать в мероприятии?" с вариантами ответа "Да", "Нет", "Еще не определился, перезвонить позже" и с соответствующими действиями при выборе каждого из ответов.

Спасибо, Елена

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

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

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

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

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

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

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

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

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

"Alina_Velichko" написал:

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

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

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

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

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

Подскажите, как при создании контакта в детали "контакты" контрагента автоматически переносить информацию (город, адрес, осн телефон (раб))

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

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

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

Илья, для решения задачи Вам необходимо на PageLoadComplete прописать логику:
- проверить, что создается новая запись и заполнено поле [Контрагент].
- если условие выполняется, фильтровать объект "Контрагент" по полю [Контрагент], считывать значение нужных полей объекта, затем записывать их в поля карточки контакта.

Пример кода Вы можете посмотреть в этом посте

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

Всем добрый день! Появился такой вопрос. Есть 2 аналогично реализованных функционала контрагент -> Деталь "История" и контакт -> Деталь "История". Но работают они по разному, скажу больше деталь контакта не работает. По логике не должны отображаться кнопки добавить, копировать, изменить и удалить, так как данные в sql запросе просто вытягиваются из всех возможных мест (задачи, воздействия и т.д.), но на деле кнопки подтягиваются, но при нажатии на "добавить" вылетает не обработанное исключение. Причём всё это отлично работает с контрагентами. Может кто сталкивался с данной проблемой. Буду рад любой помощи.
Заранее спасибо!!

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

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

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

Неплохо было бы указать точную версию террасофта.
Не знаю помогла ли вам на этот момент техподдержка, но так как окно унаследовано от стандартного грида, то в нем есть кнопки. Чтобы эти кнопки не отображались, окну надо присвоить свойство
HideButtonsFrame (его можно присвоить на onPrepare самого грида или на RefreshDetails воркспейса контактов)

SetAttribute(Window, 'HideButtonsFrame', true);

Тогда кнопки отображаться не будут.

Но вон у вас на втором скрине дебаггер вылез. Открыли visual studio и она покажет в какой строчке именно ошибка, а там может быть все что угодно и надо уже смотреть, так что если это не поможет и сами не разберетесь, тогда к техпому.

"Сазанов Александр Владимирович" написал:

Неплохо было бы указать точную версию террасофта.
Не знаю помогла ли вам на этот момент техподдержка, но так как окно унаследовано от стандартного грида, то в нем есть кнопки. Чтобы эти кнопки не отображались, окну надо присвоить свойство
HideButtonsFrame (его можно присвоить на onPrepare самого грида или на RefreshDetails воркспейса контактов)

SetAttribute(Window, 'HideButtonsFrame', true);
Тогда кнопки отображаться не будут.

Но вон у вас на втором скрине дебаггер вылез. Открыли visual studio и она покажет в какой строчке именно ошибка, а там может быть все что угодно и надо уже смотреть, так что если это не поможет и сами не разберетесь, тогда к техпому.

3.4.1.145 - версия Террасофта.
По поводу кнопок: не понятно как должно быть точно, ведь в детали контрагента кнопок нет, а ошибка валится при нажатии на кнопку, хотя к кнопке даже edit window не привязан

Кнопок быть не должно и логики, соответственно, на них никакой нет.

В базовой версии упомянутый Александром параметр передается реестру детали в методе RefreshContactHistoryDetail():

function RefreshContactHistoryDetail() {
	var DetailWindow = wndContactHistoryDetail.Window;
	var DetailDataset = DetailWindow.ComponentsByName('dlData').Dataset;
	if (!DetailWindow.Attributes('InitializeFlag')) {
		SetAttribute(DetailWindow, 'HideButtonsFrame', true);
		var SelectCall = DetailDataset.SelectQuery.ItemsByCode('SelectCall');
		if (!Connector.Attributes('HasCallLicense')) {
			DetailDataset.SelectQuery.Remove(SelectCall);
		}
	}
	RefreshCommonDetail(BaseWorkspace, wndContactHistoryDetail, 
		'ContactID', 'ContactID');
}

Который вызывается при фокусировке на детали История в методе RefreshDetails():

	if (pcDetails.ActivePage.Name == pgContactHistoryDetail.Name) {
		RefreshContactHistoryDetail();
	}
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Подскажите, пожалуйста, как правильно выставить права, чтобы карточку "Контакт" мог редактировать только тот человек, кто ее создал/ ответственный.

Ну и администраторы, естественно.

Спасибо!

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

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

Добрый день!

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

В этом разделе:

  1. 1. Выбираете группу Все пользователи
  2. 2. Отмечаете раздел [Контакты]
  3. 3. Указываете в детали [Доступ] группу Все пользователи - чтение

Во как это должно выглядеть:

Данная раздача прав доступа позволяет автору получить максимальные права доступа на свою запись (прописано в скриптах по умолчанию), Всем пользователям только на чтение, а Администратор и так имеет все права доступа, на него раздавать не обязательно :wink:

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

Хорошего дня!

С уважением,
Белецкий Арсений
Группа компаний Terrasoft

Добрый день!
Обошел программно, так оказалось удобнее.

Спасибо!

"Соляник Алексей" написал:Обошел программно, так оказалось удобнее

Алексей, возможно программно и удобнее в некоторых случаях, но такой подход чреват проблемами. Вы это реализовали в самой карточке? А что если у вас "Контакт" редактируется из разных мест и необязательно через карточку: кастомные запросы update, интеграции на уровне СУБД (хранимки) и т.п.? Правильно логику, которую вы описали, организовывать через существующие права на уровне СУБД, как показал Арсений. Так как это и в карточке будет работать и во всех местах где идет работа с данными Контакта.

Александр, спасибо! Я обязательно учту на будущее!

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

Здравствуйте! При внесении каких-либо изменений в контрагенте или контакте, в частности, при добавлении(изменении) комментария на детали «Описание» хотелось бы настроить автоматическое отправление ответственному за этого контрагента или контакта уведомления об этом. Уведомление желательно как внутреннее, так и внешнее - на почту. Можно ли это сделать? И какой порядок действий, если можно?

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

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

Добрый день, Александр!
Необхрдимо привязать обработчик на событие OnDatasetAfterPost невизуального элемента dlData d сервисе Common\Details\Description\wnd_Description

Для этого откройте указанный сервис, перейдите к его невизуальным элементам, сфокусируйтесь на dlData. Ниже выберите закладку "События", найдите и встаньте на OnDatasetAfterPost. Оно по умолчанию не задано. Встаньте в поле Значение события (Value) и сделайте двойной клик. В результате этого действия Вы перейдете в сервису Common\Details\Description\wnd_DescriptionScript в котором каретка курсора уже будет стоять в новом обработчикие события:

function dlDataOnDatasetAfterPost(Dataset) {
	//TODO
}

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

var ParentWindow = Self.ParentContainer.ParentWindow;
if (ExtractUSICodeEx(ParentWindow.USI) == "wnd_AccountsWorkspace") {
	//TODO
}

Получить ID Контрагента и Ответственного можно из датасета

var AccountDataset = ParentWindow.ComponentsByName('dlAccounts').Dataset;

Отправить сообщение ответсвенному можно воспользовавшись базовой функцией SendEmail(Params) из сервиса Common\Library\scr_MailUtils (не забудьте его подключить к wnd_DescriptionScript).

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

	SendEmail({Address: 'support@tscrm.com', 
		Subject: "Запрос в службу поддержки Terrasoft",
		BodyFormat: 1, Body: "Hello!"});

Создать напоминание можно следующим образом:

	var RemindingDataset = GetSingleItemByCode('ds_Reminding');
	RemindingDataset.Append();
	RemindingDataset.ValAsGUID('ID') = Connector.GenGUID();
	RemindingDataset.Values('SubjectID') = AccountDataset.ValAsGUID('ID');
	RemindingDataset.Values('SubjectTypeID') = rst_Account; // берется из Common\Dictionaries\Reminding\enm_RemindingSubjectType
	RemindingDataset.Values('Description') = 'Напоминание по Контрагенту.'
	RemindingDataset.Values('RemindTime') = new Date().getVarDate();
	RemindingDataset.Values('ContactID') =  Connector.CurrentUser.ContactID;
	RemindingDataset.Post();
	RemindingDataset.Close();
Войдите или зарегистрируйтесь, чтобы комментировать