...и что делать, если вы его уже удалили.

В интерфейсе системы BPMonline 5.X есть иконка с конвертом, которая, согласно инструкции:

Цитата:
отображает количество непрочитанных e-mail сообщений текущего
пользователя. Нажмите на кнопку, чтобы перейти к просмотру сообщений.

Суть её работы довольно проста: при нажатии открывается первое рабочее место, в разных продуктах называемое по-разному (на рисунке — "Продажи"), а в нём раздел "Активности" с фильтром по типу "e-mail".

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

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

Даже если опомниться и создать заново место или раздел в месте, это не поможет, ведь Id записей теперь другие.

Отсюда простой вывод: не стоит удалять первое рабочее место. Если надо, его можно переименовать. Также раздел активностей в нём обязателен.

Если всё уже поломано, исправить ситуацию возможно. Открываем бизнес-процесс страницы MainPage, в обработчике события "Страница загружена" скрипте "Обработать Завершение Загрузки Страницы" (PageLoadCompleteScriptTask) в строке 124 находим следующий код:

string script = string.Format("{0}.on('settingstoolclick', function() {{\nthis.callPageMethod('ThrowEvent', {{signalName: 'SettingsChanged'}});\n}}, {0});", Page.MultiLevelTabs.ClientID);
script += string.Format("{0}.on('helptoolclick', function() {{\nthis.callPageMethod('ThrowEvent', {{signalName: 'HelpCalled'}});\n}}, {0});", Page.MultiLevelTabs.ClientID);
script += string.Format("{0}.on('click', function(el) {{\nlocation.replace('ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&ActiveTabId=PageContainer_5ca0dabc8c894e1a9bb536407e1c4ef2_055063c98180e011afbc00155d04320c_830581929880e011afbc00155d04320c&action=selectemailfolder')}}, this)", Page.UnreadEmailCountButton.ClientID);

Тут конструкция 5ca0dabc8c894e1a9bb536407e1c4ef2_055063c98180e011afbc00155d04320c_830581929880e011afbc00155d04320c — идентификаторы записей в таблицах
  • SysModuleFolder — рабочие места
  • SysModule — разделы
  • SysModuleInSysModuleFolder — рабочие места в разделах (развязка)

SELECT * FROM SysModule
SELECT * FROM SysModuleFolder
SELECT * FROM SysModuleInSysModuleFolder

Находим новое рабочее место, ставшее первым, записываем его Id маленькими буквами и без дефисов. Второй Id остаётся прежним, это раздел "Активности". Третий идентификатор находится в таблице развязки как Id записи, связывающей первый со вторым.

Заменяем в коде два идентификатора, публикуем страницу и получаем работающую кнопку.

Нравится

Поделиться

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

Спасибо Саше за статью, пригодилось!

PageContainer_5ca0dabc8c894e1a9bb536407e1c4ef2_055063c98180e011afbc00155d04320c_830581929880e011afbc00155d04320c&action=selectemailfolder

А яку роль виконує [selectemailfolder] в кінці конструкції?

В коде ActivitiesModulePage:

		public virtual bool ScriptTask2Execute(ProcessExecutingContext context) {
			var action = Page.Request.QueryString["action"];
if (!String.IsNullOrEmpty(action) && action.ToLower().Equals("selectemailfolder")) {
	(Page.BaseFolder.FindPageControlByName("TreeGrid") as TreeGrid).SelectNode("181f9d34-5dee-e011-a86b-00155d04c01d");
	(Page.BaseFolder.FindPageControlByName("DataSource") as DataSource).SetActiveRow(new Guid("181F9D34-5DEE-E011-A86B-00155D04C01D"));
	FolderId = new Guid("181F9D34-5DEE-E011-A86B-00155D04C01D");
	Page.ThrowEvent("FolderActiveRowChanged");	
}

Розбираю код:
5c8a4dec940949a69f4c75f624129142_055063c98180e011afbc00155d04320c_4facc3ee337049eab7b517de822e30c2

5C8A4DEC-9409-49A6-9F4C-75F624129142 - Письменные обращения

055063C9-8180-E011-AFBC-00155D04320C - Активности

4FACC3EE-3370-49EA-B7B5-17DE822E30C2 - пов'язує між собоюі
5C8A4DEC-9409-49A6-9F4C-75F624129142 - Письменные обращения
EC8425F0-A89F-4BE7-9792-75DDC41B6671 - Активности

Подивився, що
055063C9-8180-E011-AFBC-00155D04320C - Активности
має зв'язок з
D9327740-B874-4D02-93FD-D58DCD4B9345 - Сервис
74635219-5C62-4547-B869-C49FD83EED99 - Работа с запросами

ЗАПИТАННЯ:
а чому для розділів [Сервис] та [Работа с запросами] зафіксовано активність
055063C9-8180-E011-AFBC-00155D04320C

а для розділу [Письменные обращения]
зафіксовано активність
EC8425F0-A89F-4BE7-9792-75DDC41B6671

Це так і має бути, чи має місце якась плутанина ?

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

ідентичні

Сравните другие поля. Если всё совпадает, то может быть, что вторую запись создали случайно. Можете для теста всюду указать первую, проверить, не будет ли проблем.
В других базах вижу только 055063C9-8180-E011-AFBC-00155D04320C.

Замінив прив'язку в
4FACC3EE-3370-49EA-B7B5-17DE822E30C2
EC8425F0-A89F-4BE7-9792-75DDC41B6671 => 055063C9-8180-E011-AFBC-00155D04320C

Нічого не поламалось

В темі приведено код обробника для [Page.UnreadEmailCountButton].

Я так розумію, що раз мені треба попасти на звернення, то потрібно створити код обробника натиснення кнопки, яку я створив: [Page.NewServiceRequestLinkedButton].

Для цього потрібно

1) в ідентифікаторі провести заміну:
055063C9-8180-E011-AFBC-00155D04320C (Активности)
=>
58B3DD29-54E0-4B2E-97B1-DF8DF09EF2EC (Обращения)

2) замінити запис прив'язки
4FACC3EE-3370-49EA-B7B5-17DE822E30C2
=>
0DB7A74E-D18C-4CA3-A68E-56FD7FC761C9

3) добавити код обробника натиснення кнопки з новим кодом операції - [selectNewServiceRequestLinkedfolder].

script += string.Format("{0}.on('click', function(el) {{\nlocation.replace('ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&ActiveTabId=PageContainer_5c8a4dec940949a69f4c75f624129142_58b3dd2954e04b2e97b1df8df09ef2ec_0db7a74ed18c4ca3a68e56fd7fc761c9&action=selectNewServiceRequestLinkedfolder')}}, this)", Page.NewServiceRequestLinkedButton.ClientID);

4) в [IncidentsModulePageEventsProcess] вклинитися в обробку повідомлення [PageLoadComplete]

var action = Page.Request.QueryString["action"];
if (!String.IsNullOrEmpty(action) && action.ToLower().Equals("selectNewServiceRequestLinkedfolder")) {
	(Page.BaseFolder.FindPageControlByName("TreeGrid") as TreeGrid).SelectNode("AD9E0A8F-A97C-42EB-8D23-0264F3A51171");
	(Page.BaseFolder.FindPageControlByName("DataSource") as DataSource).SetActiveRow(new Guid("AD9E0A8F-A97C-42EB-8D23-0264F3A51171"));
	FolderId = new Guid("AD9E0A8F-A97C-42EB-8D23-0264F3A51171");
	Page.ThrowEvent("FolderActiveRowChanged");	
}
// AD9E0A8F-A97C-42EB-8D23-0264F3A51171 - потрібний фільтр

Для остальных напомню, что начало обсуждения и зачем нужна эта кнопка — тут.:wink:

Все працює.

Ще одне запитаня: а що це за ідентифікатор 5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a ?

SysSchemaId MainPage.

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

Добрый день!

Возникла проблема: письма, входящие в Outlook, попадают автоматически в Terrasoft в раздел "E-mail", но отправленные письма из Outlook не попадают автоматически в Terrasoft.
Интеграция Outlook и Terrasoft, разумеется, включена. В настройках пользователях выбраны все галочки, кроме двух: Игнорировать адрес получателя, Игнорировать адрес отправителя.
В чем проблема? Что нужно проверить?

Нравится

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

Добрый день, Людмила!

Проверьте, есть ли письма в папке "Все сообщения". Они могут просто не попасть в папку "Отправленные".
Также в Outlook можете попробовать воспользоваться кнопкой "Автопривязка Terrasoft", предварительно выделив одно или несколько писем, которые необходимо привязать.

Добрый день!

Все папки просмотрели - нигде нет писем.
Я знаю про функцию автопривязки, но цель как раз заключается в том, чтобы не нужно было переходить из одной программы в другую, искать письма и т.д. Нужно, чтобы была возможность работать только в Terrasoft.
Не знаю, имеет ли это значение, но используем IMAP. Вся почта хранится на сервере.

Добрый день, Людмила!

"Алексеева Людмила" написал:Не знаю, имеет ли это значение, но используем IMAP. Вся почта хранится на сервере.

Это имеет огромное значение :smile:

Если почта храниться на серврере, то она не попадает в папку Отправленные - основной папки Outlook. все эти письма у вас отображаются в папке Отправленные Вашего почтового сервера, а Terrasoft не понимает ее, поэтому письма и не привязываются.

В настройках учетной записи, настройте хранение отправленных писем в Outlook, это позволит автоматически привязывать отправленные письма.

Покажу на примере Outlook 2010:


Спасибо за подсказку! Действительно, причина была в этом. Но возник вопрос: дело в том, что входящая почта у нас хранится только на сервере (проверяла - в папках Outlook писем входящих писем нет), но привязывается она, тем не менее, без проблем. Почему такое правило, о котором вы писали выше, не распространяется на входящую почту? Может быть, и с отправленной почтой можно сделать также?

Затрудняюсь объяснить данный феномен.
Скорее всего, папка Входящие имеет не такие настройки, как папки отправленные и Удаленные.

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

Всем привет!

В ходе настройке интеграции у одного клиента, выявили, что необходимо проверять еще одну настройку (актуально для Office 2007):
[Сохранять копии сообщений в папке Отправленные]

В ходе настройки как для Outlook 2007, так и для Outlook 2010 ситуация такова - в каждом случае нужно ставить Опции:

1. Сохранять отправленные элементы в папке "Отправленные"
2. Сохранять копии сообщений в папке "Отправленные"

Тогда в этом случае отправленные сообщения появятся как на сервере IMAP почтовой записи, так и в Отправленные "Личная папки" самого Outlook, на которую настроена логика взаимодействия Terrasoft. А значит и попадут в TS

А далее есть один нюанс в зависимости от того на каком почтовой службе сделан почтовый ящик:
1. Gmail: тут вопросов не возникло (по крайней мере у меня)
2. Yandex: вот тут не все гладко. В инструкциях самого Яндекса по настройке Outlook указано, что необходимо явно указывать в какой папке (screenshot yandex_send.PNG). И тут начинается казус: в этом случае правило самого Outlook "Сохранять копии сообщений в папке "Отправленные" не работает. А если не следовать инструкции Яндекса и ставить "Сохранять отправленные элементы в папке "Отправленные", тогда они сохраняются в Отправленные "Личная папки" самого Outlook, но не появляются в Отправленные на IMAP сервере Яндекса

Олег, приветствую!

Правильно ли я понимаю, что при подобной настройке:

Не работает настройка:

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

Добрый день!

Очень беспокоит вопрос появления напоминаний о создании новых E-mail сообщений по инциденту. Не знаю в какой момент, но у ответственного пользователя по инциденту появляются напоминания о том, что у инцидента появилось новое E-mail сообщение. Посмотрев деталь E-mail в инцидентах я действительно нашел там новые сообщения. Никто их туда специально не привязывал. Значит, получается, что при разборе почты каким-то образом это сообщение автоматически привязалось к инциденту. Я догадываюсь, что автоматическая привязка происходит по теме сообщения и номеру инцидента. Но это не совсем корректно, т.к. к инциденту номер 200 привязываются сообщения с темой "АКЦИЯ! Рекламный авиатур в Черногорию 200 евро!".

Как настроить корректную работу данного функционала или отключить его вообще?

Нравится

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

"Ozzy" написал:Значит, получается, что при разборе почты каким-то образом это сообщение автоматически привязалось к инциденту. Я догадываюсь, что автоматическая привязка происходит по теме сообщения и номеру инцидента.

Да, так и есть. В скрипте scr_MailLinks это делают функции FindIncidentNumber и GetIncidentDataBySubject:

function FindIncidentNumber(Str) {
	var Mask = GetSystemParameterValueEx('IncidentMask', false);
	var NumList = Str.match(/(\d+)/g);
	if (!NumList) {
		return;
	}
	for (var i = 0; i < NumList.length; i++) {
		var Num = Mask.replace(/\%1/g, NumList[i]);
		var SafeNum = '(^|:|#|№|-|\\s+)' + NormalizeForRegex(Num) + '(\\s|\\.|$)';
		if (Str.match(new RegExp(SafeNum, 'ig'))) {
			return Num;
		}
	}
}
 
function GetIncidentDataBySubject(Subject) {
	if (!System.GetHasLicense('Incidents')) {
		return false;
	}
 
	var IncidentNumber = FindIncidentNumber(Subject);
	if (!IncidentNumber) {
	    return null;
	}
    var SelectQuery = GetSingleItemByCode('sq_GetIncidentDataByNumber',
		'MailLinks');
    SelectQuery.Parameters('IncidentNumber').Value = IncidentNumber;
    var Dataset = SelectQuery.Open();
    try {
	    if (IsDatasetEmpty(Dataset)) {
	        return null;
	    }
	    return LoadRecord(Dataset);
	} finally {
		Dataset.Close();
	}
}

Если эта логика вообще не нужна, то можно во второй функции в начале вписать return null; .

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

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

Александр, воспользовался Вашим советом и отключил функционал полностью в функции GetIncidentDataBySubject. Но в результате по-прежнему появляются напоминания о привязанных письмах к инцидентам ((( Может еще где-то отключить надо?

Странно. То есть напоминания по новым письмам, пришедшим после изменения кода и перезапуска Аутлука?

Ну да. Изменения внес еще 20 августа, старые напоминания удалил. Но они продолжают появляться до сих пор. Тоже грешил на то, что не перезапустили программы, но уже столько времени прошло...

Ozzy, закомментируйте в function SaveMailItem(MailItem, Options) сервиса scr_MSOutlookLibrary строку:

Incident = GetIncidentDataBySubject(MailItem.Subject);

Спасибо, Наталья! Попробую закрыть таким образом. На самом деле такая функция реализуется в пяти разных скриптах. Не хотелось бы закрыть что-нибудь лишнее.

Если функция GetIncidentDataBySubject уже отключена изнутри, какой смысл отключать все её вызовы? Надо смотреть, может, похожая логика сделана ещё где-то отдельно.

Я же говорю, похожая функция реализована в 5 разных скриптах. Её реализация есть в scr_MailLinks, который Вы указали, а есть и в scr_MSOutlookLibrary, который указала Наталья. Необходимо найти правильный и заблокировать вызов.

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

Пытаюсь действовать по этому блогу
https://community.terrasoft.ru/blogs/9079
Но почти на первом же шаге ошибка. Когда вставляем первый скрипт

var defValuesId = Guid.NewGuid();
var defValues = new Dictionary string, object>();
defValues.Add("Contact", Page.ContactEdit.Value.ToString());
defValues.Add("Account", Page.AccountEdit.Value.ToString());
defValues.Add("Title", Page.TitleEdit.Value.ToString());
var IncidentId = Guid.NewGuid();

UserConnection.UserContext.Add(defValuesId.ToString(), defValues);
var parameters =  
      new Dictionarystring, string> {
            {"createWithUId", IncidentId.ToString()},
                        {"entitySchemaUId", "C449D832-A4CC-4B01-B9D5-8A12C42A9F89"},
                        {"defValuesId", defValuesId.ToString()}
      };
OpenTaskEditPage.OpenerInstanceId = InstanceUId;
OpenTaskEditPage.UseCurrentActivePage = true;
OpenTaskEditPage.PageUId = new Guid("F2BF397B-8FA3-48BA-B691-57360871967A");
OpenTaskEditPage.PageParameters = parameters ;
OpenTaskEditPage.CloseMessage = "IncidentEditPageClosed";

Выдает ошибки:

И во-вторых, где взять ид, которые есть в скрипте
"entitySchemaUId", "C449D832-A4CC-4B01-B9D5-8A12C42A9F89"}
OpenTaskEditPage.PageUId = new Guid("F2BF397B-8FA3-48BA-B691-57360871967A");

Нравится

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

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

По поводу ошибки "Имя OpenTaskEditPage отсутсвует в текущем контексте", в блоге указано (пункт 3), что после создания действия процесса "Открыть страницу", ему следует присвоить наименование. Вы либо не добавили UserTask, либо не так назвали.
А по поводу "UserContext" - какая у Вас версия, не 5.2 случаем?

PS:
ID в принципе вы можете не менять, т.к. это стандартные схемы(окна) и ID У Вас совпадут. А вообще, посмотреть их можно либо запросом в БД, либо в адресной строке, при открытии того или иного окна, указывается также и его идентификатор.

Да, действительно, я слишком поспешил, но по-моему там немного порядок нарушен.
Что касается версии, то 5.4.0.591
После всего остались две ошибки: "UserContext" и еще во втором скрипте (после сигнала IncidentEditPageClosed)

TargetScemaQuery.Filters.Add(TargetScemaQuery.CreateFilterWithParameters(
        FilterComparisonType.Equal, 
        "Id", 
        IncidentId));

используется IncidentId, но в скрипте он до этого не объявлен.

Александр, есть там объявление (в первом листинге):

var IncidentId = Guid.NewGuid();

По поводу UserContext - он был в 5.2. В 5.4 теперь это SessionData. Т.е. по сути Вам нужно заменить

UserConnection.UserContext.Add(defValuesId.ToString(), defValues);

на

UserConnection.SessionData.[defValuesId.ToString()] = defValues;

Если там потом этот ключ где считывается, то код следующий:

var test = Page.UserConnection.SessionData[defValuesId.ToString()];

C "UserContext", т.е. с SessionData получилось.
На счет IncidentId. Она объявлена в первом скрипте, но второй скрипт идет как отдельная функция, т.е. она не видит что происходит в первом скрипте, соответственно не видит объявление IncidentId.
Или я что-то не понимаю? Как можно передать переменную из одного скрипта в другой?

Добрый день.

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

Логика следующая:

(сигнал нажатия на кнопку) -> (скрипт подготовки действия процесса "открыть карточку") -> (действие процесса открыть карточку) -> (сигнал закрытия карточки инцидента) -> (скрипт генерации номера инцидента).

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

myParam =  IncidentId;

А в последнем скрипте, вместо IncidentId использовать параметр.

Параметр нужно создать с типом Guid.

Спасибо. Теперь подберусь немного к сути задачи. Мне надо создать именно инцидент (поставил id инцидента и его карточки, все нормально открывается). Что надо сделать, чтобы после нажатия на кнопку "Ок" у инцидента, т.е. инцидент создан в карточке e-mail он добавился в поле инцидент?

Александр, необходимо добавить сроку кода в элементе (скрипт генерации номера инцидента), т.е. в последний скриптовый элемент в рамках добавленной вами логики:

Page.DataSource.ActiveRow.SetColumnValue("IncidentId", myParam);

где myParam - параметр, в котором хранится Id созданного инцидента.

По сути эта строчка должна добавлять инцидент к письму

Page.IncidentEdit.SetValueAndText(incidentCollection[0].GetTypedColumnValue<Guid>(primaryColumn.Name), incidentCollection[0].GetTypedColumnValue<string>("Number"));

Но скрипт выполняется сразу после открытия окна инцидента, а т.к. запись еще не внесена он не видит эту строку, соответственно ничего не добавляет. Как подождать закрытия окна инцидента?

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

Нужно ждать сигнал, в данном случае IncidentEditPageClosed. Посмотрите, в блоге данный промежуточный обрабатывающий сигнал присутствует.

Да. вы права, человеческий фактор невнимательность, вместо обрабатывающего сигнала поставил генерирующий.

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

В Террасофт реализован очень удобный механизм привязки и хранения e-mail сообщений - есть в базе такой адрес - подтягивается, отсутствует - не подтягивается. Но не дай Бог вам поставить галочки "игнорировать адрес отправителя\получателя" в настройках пользователя или добавить адрес рабочего мейла в карточку контакта пользователя, а потом проинтегрировать все письма в автоматическом режиме...
В нашей компании объем и количество внутренней почты такие же, а то и больше, чем почты внешней.
И периодически то настройки у кого-нибудь слетят, то новый офис-менеджер добавит всем пользователям их рабочие е-мейлы.... В результате база разом увеличивается на всю внутренную переписку пользователя (с вложениями!).
И хотя подчистить не так и сложно (отправитель like %@your_domain.zone AND получатель like %@your_domain.zone), но, во-первых, за этим надо следить, а во-вторых, бывают сложные случаи, когда письмо отправляется (или получается) не только кому-то внутри, но и одновременно наружу:
send to vasya@company.ru, client@somewhere.com
Такие письма приходится искать вручную... Или сделать вид, что их и не было, что не очень хорошо ))

Мне все это немного надоело еще на 2й раз и я, получив несколько левелапов :wink:, избавил себя от этой проблемы раз и навсегда.

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

Логика:
При автоинтеграции (но не вручную ) письма проверяются на наличие хотя бы одного из отправителя\получателей (отправитель один, получателей - сколько влезет) не из одного и того же домена. Основой для проверки служит адрес отправителя - т.к. он один.
Например:
send from petya@company.ru to vasya@company.ru, client@somewhere.com пройдет
send from petya@company.ru to vasya@company.ru, masha@company.ru не пройдет

Скрипт:
в функцию function SyncronizeMailItem(MailItem, Options) вставить после
var MessageID = MapiMessage.GetSMTPHeader('X-TS' + MessageIDUserPropertyName);

        if (CheckIsSameDomain(MapiMessage)){    // проверяем не внутренняя ли почта, если да - выход
                return;
        }

сама функция

function CheckIsSameDomain(MapiMessage) {
        var SenderAddress = MapiMessage.SenderAddress;

// избавляемся от " в адресах
        var RecipientAddress =
                MapiMessage.GetRecipientList().CommaText.substr(0, 249).replace(/"/g, '');  //";

// избавляемся от конструкций типа Имя Фамилия> в получателях - услужливый Outlook ставит это ко всем известным ему контактам
        RecipientAddress = RecipientAddress.replace(/[^>]+>,?/g, '');

// находим домен отправителя (от @ до конца строки)
        var SenderDomain = /@.+$/.exec(SenderAddress);

// находим домены получателей (регексп может быть странноватый, но работает)
        var RecipientDomainAr = RecipientAddress.match(/@\S+(?:(?:\.(?:\S{2,})){1,10})/g);
        if (!Assigned(RecipientDomainAr)) {
                return false;
        }
        for (var i = 0; i = RecipientDomainAr.length; i++) {
                if (RecipientDomainAr[i] != SenderDomain) { \\ если отличается выходим из функции
                        return false;
                }
        }
        return true;
}

ПС. И да - ущерб производительности имеет место, но не сильный

Нравится

Поделиться

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

косяк :redface:
var SenderDomain = /@.+$/.exec(SenderAddress)[0]

for (var i = 0; i <= RecipientDomainAr.length - 1; i++)

// избавляемся от " в адресах
        var RecipientAddress = 
                MapiMessage.GetRecipientList().CommaText.substr(0, 249).replace(/"/g, '');  //";
 
// избавляемся от конструкций типа <Имя Фамилия> в получателях - услужливый Outlook ставит это ко всем известным ему контактам
        RecipientAddress = RecipientAddress.replace(/<[^>]+>,?/g, '');

заменить на

var RecipientAddress = MapiMessage.GetRecipientList(true).CommaText
Показать все комментарии

Колеги, рад Вам сообщить, что темой следующего вебинара, который будет проходить в понедельник, 27 февраля, с 11:00 до 12:00, по московскому времени, будет "Интеграция BPMonline CRM с почтовыми системами, социальными сетями и LDAP. Добавление автоматизированных действий".

Наш вебинар позволит Вам, не покидая своего офиса, продолжить освоение системы BPMonline CRM, ознакомиться с возможностями по отправке/получению почтовых сообщений в BPMonline CRM, отправки рассылок, отображение месторасположения контактов и контрагентов, а также отображение маршрутов к ним, актуализации информации по клиентам с помощью социальных сетей, синхронизации учетных записей пользователей BPMonline CRM с пользователями в каталогах LDAP, добавлению автоматизированных действий. Во время вебинара Вы сможете задать вопросы тренеру Terrasoft по интересующим Вас особенностям работы с BPMonline CRM.

На вебинаре будут рассмотрены следующие вопросы:

  • Как отправлять/принимать почту в BPMonline CRM
  • Как сформировать и отправить рассылку в BPMonline CRM
  • Как отобразить месторасположение и маршрут к Вашим клиентам
  • Как настроить интеграцию с социальными сетями Facebook, LinkedIn и Twitter
  • Как синхронизировать пользователей BPMonline CRM c пользователями в каталогах LDAP
  • Как добавить в разделе автоматизированное действие

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

До встречи на вебинаре!

Также предлагаю Вам ознакомиться с записями вебинаров, посвященных эксплуатации BPMonline CRM, которые могут быть Вам полезны в начале ознакомления с системой:

Нравится

Поделиться

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

Здравствуйте,
можно ли программно присоединить к создаваемому по шаблону е-мэйлу файл, как вложение.

Е-мэйл создается с помощью стандартной ф-ии:
function SendEmailByAddress(MailUtils, TemplateFileName, Address, Subject) {
// by default 'false' means immediate message sending
// 'true' means putting message to 'Outbox' Outlook folders
var SendResult = MailUtils.SendMessage(TemplateFileName, Address,
Subject, false);
if (!SendResult) {
SendResult = false;
}
return SendResult;
}

Или может быть есть другие решения задачи?

Версия Terrasoft CRM 3.0.2.245 под Firebird.

Нравится

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

Здравствуйте Юрий,
Попробуйте воспользоватся советама в теме http://www.community.terrasoft.com.ua/forum/topic/6788

Действительно в случае с MailUtils.SendMessage(.......) получилось прикрепить вложение, добавив параметр Attachments.

Еще вопрос можно ли аналогичное действие реализовать при создании е-мэйла через MailUtils.CreateMessage(TemplateFileName, MailAddress, MailSubject).
Просто подстановка еще одного параметра Attachments не проходит, выдается ошибка (насчет, количество параметров не соответствует).

Используйте из scr_MailUtils

function CreateEmptyMessageWithAttachments(MailAddress, MailSubject, BodyFormat,
	CodePage, Importance, Attachments)

Евгений,
к сожалению в этой версии (3.0.2.245) в scr_MailUtils функции CreateEmptyMessageWithAttachments нет.
Есть только:

function CreateEmptyMessage(MailAddress, MailSubject) {
	var MailUtils = GetMailUtils();
	MailUtils.CreateEmptyMessage(MailAddress, MailSubject);
}
 
function CreateMessageFromTemplate(TemplateFileName, MailAddress, MailSubject) {
	var MailUtils = GetMailUtils();
	MailUtils.CreateMessage(TemplateFileName, MailAddress, MailSubject);
}

Вы можете выложить Текст скрипта scr_MailUtils?

Да, выкладываю.

Выложите именно текст скрипта а не сам сервис (чуть внимательнее ;))

Выкладываю, текст скрипта

Добавьте в скрипт этот код

function CreateEmptyMessageWithAttachments(MailAddress, MailSubject, BodyFormat,
	CodePage, Importance, Attachments) {
	if (!GetCanCreateMessage(true)) {
		return;
	}
	var MailUtils = GetMailUtilsWithoutMacroses();
	if (IsEmptyValue(MailAddress)) {
        MailAddress = '';
	}
   	if (IsEmptyValue(MailSubject)) {
        MailSubject = '';
	}
	if (IsEmptyValue(BodyFormat)) {
        BodyFormat = 1;
	}
   	if (IsEmptyValue(CodePage)) {
        CodePage = '';
	}
   	if (IsEmptyValue(Importance)) {
        Importance = 1;
	}
	MailUtils.CreateEmptyMessage(MailAddress, MailSubject, BodyFormat,
		CodePage, Importance, Attachments);
}

А потом попробуйте его вызвать.
50/50 что заработает т.к. непонятна версия вашей библиотеки TSOutlookLibrary

Чем всё закончилось?

На вызов:
MailUtils.CreateEmptyMessage(MailAddress, MailSubject, BodyFormat, CodePage, Importance, Attachments);
появляется ошибка:
Недопустимое число аргументов или присвоение значения свойства.

Эх....
Похоже в вашей версии этого нет.

Да, видимо так.
Похоже это добавили начиная с версий 3.0.4.

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

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

Инна Безверхняя,
II линия службы поддержки Terrasoft

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

Добрый день!
При отправке отчета по эмейлу из раздела "документы", емеил не прикрепляется в деталь "E-mail". Приходится переходить к контакту, указанному в документе, находить у него в детале "E-mail" это письмо, переходить к этому письму в раздел Email, затем там в детале "Документы" находить и прикреплять этот документ - тогда тогда письмо появится в детале e-mail раздела документа.
Проверил и на версии 3.1 и на 3.2 ни там ни там прекрепление автоматом не происходит.
Приходится делать много доп. рутинных операций вручную.
Что необходимо сделать чтобы это исправить? Заранее спасибо.

Точная версия 3.1.0.23 MSSQL 2005 WinXP SP3

Нравится

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

Serega, Вы отправляете письмо через действие "Отправить E-Mail" в окне предпросмотра отчёта (wnd_BaseFastReportPreview)? В этом действии не происходит привязки писем. То, что письмо привязывается к контакту, которому Вы отправляете письмо, скорее всего, реализовано настройками автопривязки письма в момент отправки. К остальным объектам его необходимо привязывать вручную. Например, через детали в разделе "E-Mail" или в MS Outlook с помощью кнопки "Загрузить в Terrasoft CRM".

Поскольку в упомянутых Вами версиях Terrasoft привязка писем осуществлялась исключительно средствами ядра, реализовать автоматическую привязку писем к документу вряд ли возможно. Если письмо можно однозначно идентифицировать с документом (например, в теме письма будет обязательно присутствовать фраза "Документ №345"), можно средствами СУБД создать триггер на добавление (ON INSERT) записи в таблицу tbl_MailMessage, в котором проверять наличие номера документа в теме письма и в положительном случае добавлять новую запись в tbl_DocumentMessage.

Спасибо.

Решили пойти путем создания своего действия, которое будет создавать pdf-файл по выбранному документу, отправлять его на указанный емеил и привязывать этот емеил к документу.
Вот только непонятно с чего начать. Подскажите пожалуйста как создать пдф и прикрепить его к оутлуку.
Заранее спасибо!

Если у Вас есть отчёт, в котором формируется карточка выбранного документа, у Вас есть возможность сразу отправить его по E-mail в формате pdf с помощью действия "Отправить по E-mail"->"Версия PDF". Обработка этого действия происходит в скрипте scr_BaseFastReportPreview. Посмотрите, как реализована функция SendByEmail в этом скрипте, это должно помочь в решении Вашей задачи.

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

Всем доброго времени суток!
Проблема в том, что при переходе на Деталь E-Mail у Контрагентов, всё виснет секунд на 5, при переходе от одного контрагента к другому тормозит жутко, когда активна деталь E-mail. На сервере при этом загрузка процессора на 100%. Такое поведение наблюдается у пользователей не администраторов. У админов тормозов нет.
В чем может быть проблема???
база на FirebirdCS-2.1.1.17910-0
Может есть какие-то настройки самого Firebird???

Нравится

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

А если на детали E-mail пусто, тоже при открытии ее тормозит?

 

Да, тормозит. Тормоза пропадают, если удаляю все записи в таблице tbl_MailMessageRight

Анатолий!
1. Я бы проверил наличие индексов в таблице tbl_MailMessageRight и tbl_MailMessage
2. Все таки обновил Firebird, а то у Вас устаревшая версия...

Индексы все есть.
Насколько я помню при установке даётся библиотека, которую надо подгрузить в Firebird, а она написана под Firebird 2.1

Правильно у Вас 2.1 устаревшая. Есть более новая. И попробуйте пересоздать индексы, если они есть. И кстати по каким полям есть?

У Вас 2.1.1.17910, а на оф. сайте уже давно - 2.1.3.18185

в таблице tbl_MailMessageRight общий по полям AdminUnitID и RecordID, также по полю CanRead

в таблице tbl_MailMessage по полям OwnerID, GroupID, Subject, SenderAddress, RecipientAddress, SendDate, ReceiveDate, EntryID и ParentMessageID.

Попробую обновиться.

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

Подскажите следующую тонкость:
в скрипте раздела Документы делаю отправку e-mail по шаблону с привязкой к документу.
По какому событию отследить появление этого e-mail в одноименной детали раздела Документы, либо в разделe e-mail, как отправленное?
Пробовал события AfterAppend, RefreshRecord, не отзываются.

Нравится

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

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

 

По факту появления письма должен измениться состояние документа к которому прикрепляется е-маил.

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

 

Именно, хочется понять что оно реально было отправлено.

Если речь идёт о только что добавленном письме, посмотрите функцию InsertMailItemToDatabase скрипта scr_MSOutlookLibrary. Также, думаю, будет полезна функция SaveMailItemToDatabase из того же скрипта (собственно, предыдущая вызывается из неё).

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

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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