Добрый день!

В 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();
Показать все комментарии

Здравствуйте, коллеги! Вопрос такой. Как добавить колонку "Должность" в окне выбора контакта в Задаче? Какой порядок действий?

Нравится

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

Надо открыть в TSAdmin сервис ds_Contact, полю JobID поставить галку "Поле для отображения" и сохранить.

Спасибо, Александр! Получилось!:smile:

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

Восстановил из *.bak-файла базу данных. Развернул на другой машине - все работает, кроме разделов Контакты и Контрагенты. При попытке сохранить dataset вылетает обшибка 'list index out of bounds (0)'

Продукт Terrasoft Sales, версия 3.4.0.53
База данных бекапилась на MS SQL 2005. Восстанавливали и на 2005 и на 2008 - результат одинаковый.
Все остальное работает. Ошибка выскакивает в момент сохранения в скрипте:

function SaveChanges(BaseDBEdit, Window) {
        var AddNewRecordOnPage = (BaseDBEdit.Dataset.State == dstInsert);
        Window.Attributes('IsAppend') = (BaseDBEdit.Dataset.State == dstInsert);
        Window.Attributes('RecordID') = BaseDBEdit.RecordID;
        var PostResult = BaseDBEdit.Dataset.Post();
        Window.Attributes('AddNewRecordOnPage') =
                (AddNewRecordOnPage && PostResult > 0);
        var Result = ((PostResult == 1) || (BaseDBEdit.RecordAlreadySaved));
        return Result;
}

на строке var PostResult = BaseDBEdit.Dataset.Post();выкидывает сразу в исключение
catch (e) {
                System.MessageDialog(e.message, mdtError, mdbOK, 0);
                Result = false;
        }

        return Result;

функции SaveChangesWithCheck(Window, BaseDBEdit, DoNotSendNotify).
Каким образом это можно исправить?

Нравится

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

Проблему решил сам, хватило лишь выполнить запрос

sp_change_users_login 'auto_fix', 'fkeys'

возможно кому-то поможет

Либо может еще отработать скрипт:
sp_change_users_login 'Update_one', 'fkeys', 'fkeys'

Арсений Белецкий
Техническая поддержка Terrasoft

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

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

Возникла следующая ошибка при сохранении записи в разделе "Контакты". причем как при редактировании/создании новой, так и просто после открытия карточки и нажатия кнопки "ок". "An inussicient number of arguments were supplied for the procedure or function dbo.fn_ContactLDS"
Вот скриншот:

судя из сообщения (некорректное количество аргументов передано в функцию или процедуру fn_ContactLDS), я думала, что закралась ошибка в эту функцию на уровне SQL-- но количество параметров совпадает, сравнивала с такой же функцией на другой базе 3,4 -- все такое же (разве что -- количество полей, так как в эту базу раньше вносились пользовательские поля).

кеш чистился, обновлялись бинарники с версии 3,4,0,50 до 3,4,0,113 -- не помогло (выскакивает и там, и там).

у всех пользователей (у админа тоже).

в последние 3-4 месяца доработки не делались.

версия ТС -- 3.4.0.50 СРМ
MS SQL 2005

что это может быть?

Нравится

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

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

Не подскажете, как выяснить эти поля (если ошибка, конечно, в этом). Потому что я посчитала поля в таблице тбл_Контакт -- и в ТС, и в скьюеле, и в этой функции их 48, то есть одинаковое количество...

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

"Ольга Прилипко" написал: К тому же поля добавлялись средствами Террасофта, а не Скьюеля

Проблема ещё в том, что при удалении из ТС в БД они не удаляются.
Если количество одинаковое, можно просто сравнить попарно скрипт таблицы по Ctrl+P в TSAdmin и реальный скрипт создания таблицы, который показывает MS SQL Studio. Для этого можно отсортировать в двух колонках по алфавиту в Excel или специальную программу для merge.

Спасибо, буду пробовать.

"Зверев Александр" написал:Проблема ещё в том, что при удалении из ТС в БД они не удаляются.

Если все правильно настроено и таблица валидная, поля нормально удаляются.

Нужно также обратить внимание на то, что в этих хранимых нет BLOB-полей, т.е. если в вашей таблице в конфигурации есть поля Description, Photo их не будет в ХП. Таким образом полей в ХП должно быть на 2 меньше.

"Лучкив Александр" написал:Нужно также обратить внимание на то, что в этих хранимых нет BLOB-полей, т.е. если в вашей таблице в конфигурации есть поля Description, Photo их не будет в ХП. Таким образом полей в ХП должно быть на 2 меньше.

Да, так и есть. нет поля "описание" и "фото". все остальное -- одинаковое. Типы полей тоже идентичны.

Кажется, я уже решила проблему. Сначала решила отключить поиск дублей при сохранении записи контакта: Файл -- Настройки -- Правила поиска дублей -- Контакт -- сняты все галочки в колонке "при сохранении записи" (до этого они стояли везде, кроме поля "ФИО"). Проверила -- ошибка не выскакивала. Потом -- а вдруг? -- снова зашла в эти настройки и вернула все, как было. Перезапустила ТС. Потестила. Ошибки больше нет... Возможно, эти действия и исправили проблему (перезаписалась эта функция).

Всем спасибо за помощь.

Хорошо, что само починилось.
Интересно было бы сравнить старую и новую fn_ContactLDS. Наверняка всё же там было отличие в наборе полей.

"Зверев Александр" написал:Интересно было бы сравнить старую и новую fn_ContactLDS

да, мне и самой уже интересно.. но я не сохранила(

остался только открытым вопрос -- что привело к этой ошибке? Хотя, наверное, я сама на него и ответила -- какой-то сбой, что-то не так перезаписалось... а при обновлении настроек все стало на места.

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