Идея

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

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

Обсуждение
1 комментарий

Алексей, добрый день.

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

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

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

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

Одобрена
8 комментариев

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

Я передал Ваше пожелание аналитикам продукта.
Они рассмотрят возможность его реализации в одной из последующих версий программного продукта.

Мы обязательно уведомим, когда оно будет включено в релиз.

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

Есть какие-то сдвиги по этому вопросу? Люди просят.

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

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

Скоро будем праздновать годовщину идеи

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

Добрый день, коллеги! На маркетплейсе опубликован темплейт https://marketplace.bpmonline.com/template/feed-notifications-account-r…, в котором можно посмотреть пример реализации для указанной задачи. А именно при создании контакта по контрагенту, на которого подписан пользователь, ему отображается сообщение о добавлении нового контакта в Центре уведомлений на вкладке Лента.

Федоренко Михаил Юрьевич,

уже месяц празднуем =)

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

Коллеги, добрый день.

Возникла задача: при публикации сообщения в Ленту в карточке обращения, выполнять определенные действия.

Делаю бизнес-процесс, у которого в качестве входного элемента - сигнал, который срабатывает на добавление записи в объект "Сообщение\комментарий". Далее, как я понимаю, мне надо указать Id_Схемы, в которой было опубликовано сообщение (у меня это id раздела Обращение). Указываю Id_Схемы в фильтре входного элемента. Процесс не срабатывает.
Может кто-нибудь подскажет что я делаю не так? Как отловить только нужные мне сообщения?

P.S.: если указываю этот же Id_Схемы при вставке комментария в ленту из процесса (через элемент добавления данных -> в поле Схема указываю Id_Схемы), все отлично отрабатывает

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

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

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

Нужно указывать не Id схемы, а UId.
UId можно получить следующим запросом:

select distinct UID from SysSchema
where Name = 'Case' /*Указываем название схемы*/
and ExtendParent = 0 /*Указываем, что нужна незамещенная схема*/

В разных конфигурациях Id схемы будет разным, но UId будет совпадать.

Также обращаю внимание, что если сообщение является комментарием, тогда у него будет заполнено поле ParentId, а поле EntitySchemaUId останется пустым.

"Демьяник Алексей" написал:Нужно указывать не Id схемы, а UId.

Доброе утро. Спасибо, указала UId вместо Id_Схемы и получилось отловить комментарий, который был опубликован в обращении!

Но теперь возник другой вопрос - а как мне узнать в каком именно обращении было опубликовано сообщение?
Пробовала элементом "чтение данных" прочитать сообщение в ленте и у него поле "Экземпляр объекта" и потом найти обращение, у которого Id = экземпляр_объекта (который я получила при чтении данных). Но что-то не срабатывает.

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

Скриншоты чтений данных предоставьте, пожалуйста.

"Демьяник Алексей" написал:Скриншоты чтений данных предоставьте, пожалуйста.

Добрый день. Скриншот прикрепила.

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

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

Если сообщение является комментарием, тогда необходимо дополнительно прочитать значение поля "Родительское сообщение". Сообщение является комментарием, если:

  1. У сообщения не заполнено поле "Экземпляр объекта"
  2. У сообщения заполнено поле "Родительское сообщение"

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

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

"Демьяник Алексей" написал:Также, такой процесс будет запускаться при добавлении сообщения в любом разделе системы (зависит от настроек стартового сигнала).

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

"Демьяник Алексей" написал:Такая реализация будет работать, если было добавлено обычное сообщение, которое не является комментарием другого сообщения.

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

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

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

Добрый день.
Подскажите пожалуйста, есть ли возможность отправлять сообщение из процесса объекта на клиент?
Например: перед сохранением выполнить проверку и выдать предупреждение пользователю.
Такой вариант предпочтительнее чем проверка на клиенте (с которой проблем нет), потому что записи могут добавляться тремя различными способами.
Версия BPM 7.6

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

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

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

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

:biggrin:
throw new Exception("Сообщение пользователю")

Дмитрий спасибо, то что нужно!

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

Здравствуйте, нужно отобразить сообщение с полями ввода.
Одно из полей должно быть справочником.
Каким образом можно привязать Control к объекту.
Также необходимо задать обязательность полей.
Пробовал реализовать задачу следующим образом:

inputMessage:function () {
                var callback = function(returnCode, controlData) {
                    if (returnCode === 'ok' && controlData.StartDate.value) {
                        debugger;
                        var StartDate = controlData.StartDate.value;
                    }
                };
                var config= {
                    warehouse: {
                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                        caption:'Для филиала', //resources.localizableStrings.GroupNameInputTitle,
                        entitySchemaName:'SxWarehouses',
                        ReferenceSchemaName:'SxWarehouses',
                        isRequired:true,
                        values: {
                            ReferenceSchemaName:'SxWarehouses',
                            isRequired:true,
                            entitySchemaName:'SxWarehouses'
                        }

                        //value: 0
                    },
                    StartDate: {
                        dataValueType: Terrasoft.DataValueType.DATE,
                        caption:'Дата начала', //resources.localizableStrings.GroupNameInputTitle,
                        isRequired:true
                        //value: 0
                    },
                    DueDate: {
                        dataValueType: Terrasoft.DataValueType.DATE,
                        caption:'Дата завершения', //resources.localizableStrings.GroupNameInputTitle,
                        isRequired:true
                        //value:
                    }

                };
                var caption = 'Отчет';
                //inNew ? resources.localizableStrings.NewGroupInputBoxCaption :
                //  resources.localizableStrings.ExistingGroupInputBoxCaption;
                Terrasoft.utils.inputBox(
                    caption,
                    callback,
                    ['ok', 'cancel'],
                    this,
                    config,
                    {
                        defaultButton: 0,
                        classes: {
                            coverClass: ['cover-calss1', 'cover-calss2'],
                            captionClass: ['caption-calss1', 'caption-calss2']
                        }
                    }
                );
            },

но справочник не привязан к объекту и обязательность полей не задается.
Подскажите, как можно решить данную задачу?

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

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

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

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

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

При наступлении определенного события нужно запросить у пользователя данные следующего вида

для этого вызывается метод inputMessage()
Проблема заключается в том, что поле типа lookup не привязано к объекту, следовательно страница справочника не открывается

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

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

Возможно ли как-то отловить событие клика на лукап? или как-то передать правильный конфиг для лукапа?
Если нет, то как ещё можно решить данную задачу?

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

В InputBox не получится работать с лукапом. Рекомендую Вам посмотреть, как пример, работу страницы SimpleTaskAddModule. Вызывается при работе с представлением "Расписание", в разделе "Активности".

Не очень правильный но самый простой вариант. Отловить событие нажатия на лупу и открыть нужный справочник.

$('.base-edit-right-icon-wrapper').click(function(){
	self.openLookup(configLookup, function(response) {
		// Тут записать данные выбранные из справочника в поле лукапа и в переменную.
	});
	$('.ts-modalbox').css('z-index','3000'); //эта строчка нужна чтобы окно справочника было поверх inputBox
});

А в коллбеке получать выбранное значение из переменной.

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

Добрый день!
По аналогии с Счетчиком активности, подписываюсь на сообщение от БП.
В коде страницы читаю сообщение, но функция обработки сообщения начинает вызываться циклично, в Body сообщения текст не изменяется.
В чем может быть проблема?

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

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

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

"Maxim Gritsenko" написал:

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


Хорошо. Пока, поставил "костыль": сохраняю текст сообщения (в тексте id, поэтому повторов быть не может) и если это повтор - выхожу из функции обработки.
Любом случае, спасибо за помощь и поддержку!

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

Доброго времени суток.

В BPMonline в большинства базовых карточек редактирования (соответственно и во всех наследуемых от базовой страницы редактирования) существует MessagePanel. По умолчанию в ней выводится различные сообщения-подсказки пользователю. Пример - "Поле ХХХ обязательно к заполнению".

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

string errorMessage = "Дубли не найдены!";
MessagePanel messagePanel = ControlUtilities.FindControl(
                Page.AspPage.Controls[0], "BaseMessagePanel", true) as MessagePanel;
if (messagePanel != null) {
                messagePanel.AddMessage(Warning, errorMessage, MessageType.Warning);
}

Результат:

1

Поделиться

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

Небольшое дополнение:

string warningMessageId = "SomeMessageId";
string errorMessage = "Дубли не найдены!";
MessagePanel messagePanel = ControlUtilities.FindControl(
                Page.AspPage.Controls[0], "BaseMessagePanel", true) as MessagePanel;
if (messagePanel != null) {
		messagePanel.Remove(warningMessageId);
                messagePanel.AddMessage(warningMessageId, Warning, errorMessage, MessageType.Warning);
}

Сообщения желательно создавать с идентификатором (и удалять предыдущее).

Не могли бы вы дать разъяснения по коду построчно?
Особенно интересна строка

MessagePanel messagePanel = ControlUtilities.FindControl(
                Page.AspPage.Controls[0], "BaseMessagePanel", true) as MessagePanel;

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

В этой строке мы на странице ищем контрол BaseMessagePanel.

Далее вызываем метод AddMessage, который добавляет в данный контрол сообщение.


Вы можете сделать это из объекта задание-сценарий в процессе карточки

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

См. тут на стр. 466 (467).

Спасибо! Ушел читать инструкцию внимательнее.

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

Всем привет!

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

Поскольку на комюнити по этому поводу ничего конкретно не нашел - решил поделится.

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

Есть конструкция:

#[Link;%1:;//%1:ID]#, где

  1. - Название макроса соответствующего поля
  2. - Одно из действий, которое произойдет по нажатию на ссылку, а именно
  • open - открытие карточки редактирования записи
  • goto - переход к записи в реестре
  • calltonumber - звонок по номеру средствами call-центра системы
  • - название сущности в системе (Инцидент - Incident, Задача - Task и т.д.)
  • Получается, что для решения задачки, которую я описал в начале, нам необходимо:
    Макрос #Номер# заменить на #[Link;%1:Номер;goto/Incident/%1:ID]#

    Поделиться

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

    Не могли бы описать этот механизм подробнее?

    Что значит Макрос #Номер#? Вместо чего нужно подставить номер (или ID в базе) проекта, к которому нужно перейти из письма?

    "Росинская Лена" написал:

    Не могли бы описать этот механизм подробнее?

    Что значит Макрос #Номер#? Вместо чего нужно подставить номер (или ID в базе) проекта, к которому нужно перейти из письма?

    1. Для примера: при выполнении всех задач по инциденту, необходимо оповестить ответственного, о том, что все работы выполнены. Для удобства просмотра инцидента Вы можете добавить ссылку на эту запись. (В теле письма номер инцидента будет ссылкой, кликнув на которую, программа Террасофт перейдет к записи инцидента, либо откроет её карточку)

    пример

    2. При настройке шаблонов сообщений в Террасофте Вы можете добавлять макросы из пользовательского запроса.
    пример2
    В нашем случае мы используем макрос Номер, который в тело письма вставится в формате #Номер#.
    пример3
    И для того, что бы при отправке письма номер отображаемого инцидента стал ссылкой необходимо заменить #Номер# на #[Link;%1:Номер;goto/Incident/%1:ID]#

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

    Пытаюсь просто вставить её в письмо - как ссылка не работает. Что я делаю не так? =)
    И можно ли из кода при формировании письма вместо номера подставлять эту строку (чтобы работало как ссылка)?

    Попыталась из кода отправить письмо со строкой
    #[Link;%1:Номер;goto/Opportunities/%1:{ED24FAA0-13E3-423A-BBBF-9C61B58D7FE7}]#

    Не воспринимается как ссылка.

    Елена, здесь, вероятно, дело не в том, что Вы отправляете письмо из кода. Проверьте, верно ли создан шаблон сообщения, а именно:
    - сформирован пользовательский запрос;
    - шаблон сообщения создан с использованием пользовательского запроса;
    - выполнен пункт 2 из ответа Дмитрия (http://www.community.terrasoft.ru/blogs/7544#comment-35998)

    Спасибо, но всё-таки важно то, что письмо отправляется из кода следующим образом:

    var Body = Body + FormatStr("Создал: %1\nДата создания: %2\n\nНазвание проекта: %3\nНаправление: %4\nТочка продаж: %5\nОтветственный: %6",
    Author, DateStr, GetCorrectStringForSendEmail(Title), Direct, Department, Owner);
    var Link = FormatStr("%1", OwnerID)
    Link = '#[Link;%1:Номер;goto/Opportunities/%1:'+ Link+']#';
    Body = Body+Link;

    var SQL = "EXEC msdb.dbo.sp_send_dbmail @profile_name = '%1', ";
    SQL += "@recipients = '%2', @body = '%3', @subject = '%4', @body_format = '%5'";
    var body_format = 'HTML';
    SQL = FormatStr(SQL, ProfileName, AddressStr, Body, Subject, body_format);
    Connector.DBEngine.ExecuteCustomSQL(SQL, System.EmptyValue);

    в формате html. Но текст #[Link;%1:Номер;goto/Opportunities/%1:'+ Link+']# всё так же не распознаётся как ссылка.

    Скрипты, указанные в ответе Дмитрия, не используются (это видно по отладчику).

    Елена,
    при отправке писем через dbMail, с использованием Body_Format="HTML" следует использовать следующий формат ссылки:

    <a href="terrasoft://open/Opportunities/' + CONVERT(NVARCHAR(250),@ID) + '">Перейти</a>

    где
    Open - операция открытия записи
    Goto - переход к записи в реестре

    @ID - ID Продажи (в Вашем случае).

    Это то, что надо. Спасибо!

    Вопрос в продолжение темы: можно ли настроить переход по ссылке к разделу, но так, чтобы фильтр был настроен на по ID записи, а по ContactID, к примеру?

    "Росинская Лена" написал:

    Вопрос в продолжение темы: можно ли настроить переход по ссылке к разделу, но так, чтобы фильтр был настроен на по ID записи, а по ContactID, к примеру?


    Лена, все возможно с Террасофт :smile:
    Вам необходимо будет переопределить метод: HyperlinkGotoWorkspace. То есть в существующий формат передачи ссылок добавить параметр, опредиляющий поле по которому необходимо осуществить фильтрацию.

    terrasoft://goto/wnd_ХХХWorkspace/{b365C4C25-D782-4F14-89DA-1BB5C1D993CA}/ContactID - например.

    А уже в самой функции распарсить сам параметр

    	if (Params.length < 2) {
    		return;
    	}
    	var Module = Params[0];
    	var IDValue = Params[1].replace(/%7b/g, '{').replace(/%7d/, '}');	
    // Опредиляем парамет из строки ссылки
    	var FieldName = Params[2];

    и уже соответственно обработать дальше

    Спасибо за быстрый ответ!

    И ещё один вопрос: можно ли сделать поле в датасете так, чтобы оно являлось ссылкой? Как в письме?

    То есть, к примеру, в текстовом поле написать Перейти

    так, чтобы это воспринималось как ссылка?

    "Росинская Лена" написал:

    Спасибо за быстрый ответ!

    И ещё один вопрос: можно ли сделать поле в датасете так, чтобы оно являлось ссылкой? Как в письме?

    То есть, к примеру, в текстовом поле написать Перейти

    так, чтобы это воспринималось как ссылка?


    Если речь идет о карточке, то я бы лучше сделал кнопку, при нажатии на которую, вычитывал данные из поля в котором указана сформирована ссылка, или же формировал её динамически.

    К сожалению, речь идёт именно о гриде.

    "Росинская Лена" написал:
    можно ли сделать поле в датасете так, чтобы оно являлось ссылкой? Как в письме?

    Если я верно понял, может, так?

    Добрый день, подскажите пожалуйста как правильно сформировать BodyText, чтобы письмо в формате HTML отправлялось со ссылкой?
    Я делаю так :

    BodyText = 'Здравствуйте!/nВы добавлены в команду проекта: <a href="terrasoft://goto/Project/E9A312A0-4882-40DA-8DE7-05B1D45B4449/">Валютный проект</a>./n/nЭто сообщение сгенерировано автоматически. Пожалуйста, не отвечайте на него.'

    На выходе получается следующее письмо:

    Здравствуйте!
    Вы добавлены в команду проекта: <a href="terrasoft://goto/Project/E9A312A0-4882-40DA-8DE7-05B1D45B4449/">Валютный проект</a>. 
     
    Это сообщение сгенерировано автоматически. Пожалуйста, не отвечайте на него.

    Валентин, проверьте, какой формат устанавливается?
    Сам текст Вы формируете правильно, такое ощущение, что формат сообщения текстовый.

    Вот полный вызов процедуры:

    SendEmail({Address:  TeamSelectDataset.Values('eMail'), 
    Subject: 'Вы добавлены в команду проекта!', BodyFormat: 2, 
    HTMLBody: 'Здравствуйте!/nВы <b>добавлены</b> в команду проекта: <a href="terrasoft://goto/Project/E9A312A0-4882-40DA-8DE7-05B1D45B4449/">Валютный проект</a>./n/nЭто сообщение сгенерировано автоматически. Пожалуйста, не отвечайте на него.', 
    AutoSend: true, SendImmediately: true});

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

    Валентин, в функции CreateOutlookMessage скрипта scr_OutlookUtils замените блок кода

    if (Params.HTMLBody) {
     Message.BodyFormat = 2;
     Message.Body = Params.HTMLBody;
    			}

    На:

    if (Params.HTMLBody) {
     Message.BodyFormat = 2;
     Message.HTMLBody = Params.HTMLBody;
    			}

    Спасибо! Все получилось.

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

    Всем привет!
    Данная доработка дает возможность использовать в шаблонах сообщений детали пользовательских запросов (аналогично отчету Word).

    В архиве - сервисы, которые нужно залить. Поскольку дорабатывал для 3.4.0, потому настоятельно рекомендую перед заливкой сравнить их с исходными.

    Или следуя инструкции вставить необходимый код в нужные места в тех же сервисах. (Инструкция в архиве)

    Поделиться

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

    Спасибо Дмитрий,
    Проверил на конфигурации 3.3.2.244, если подменить сервисы, все отрабатывает корректно

    Добрый день! Пробовала подменить сервисы на конфигурации 3.3.2.255, не выводит данные в таблицу

    Здравствуйте Марина,
    В ходе удаленного подключения проведенного в рамках инцидента 0100907 было показано, что на коробочной версии 3.3.2 все работает корректно. Не корректная работа в Вашем случае, связана с доработками в базовых скриптах интеграции с Outlook. Ждем от вас бэкап базы данных для решения вопроса в Вашем случае

    Проверили еще раз
    В 3.3.2 (коробка)

    function AddSection(UserReportData, ID, TablePath, ParentID, ParentFieldPath,
    	PrimaryFieldUID, Caption, MainTable) {
    	var Section = new Object();
    	Section[spnID] = ID;
    	Section[spnTablePath] = TablePath;
    	Section[spnParentID] = ParentID;
    	Section[spnParentFieldPath] = ParentFieldPath;
    	Section[spnPrimaryFieldUID] = PrimaryFieldUID;
    	Section[spnCaption] = Caption;
    	Section[spnMainTable] = MainTable;
    	var Sections = GetSections(UserReportData);
    	Sections(ID) = Section;
    	return Section;
    }

    Сервисы с вложения Дмитрия Павлова

    function AddSection(UserReportData, ID, TablePath, ParentID, ParentFieldPath,
    	PrimaryFieldUID, Caption, MainTable, Top) {
    	var Section = new Object();
    	Section[spnID] = ID;
    	Section[spnTablePath] = TablePath;
    	Section[spnParentID] = ParentID;
    	Section[spnParentFieldPath] = ParentFieldPath;
    	Section[spnPrimaryFieldUID] = PrimaryFieldUID;
    	Section[spnCaption] = Caption;
    	Section[spnMainTable] = MainTable;
    	Section[spnTop] = Top?((Top>0)?Top:-1):-1;
    	var Sections = GetSections(UserReportData);
    	Sections(ID) = Section;
    	return Section;
    }

    Необходимо все оставить как в 3.3.2

    function AddSection(UserReportData, ID, TablePath, ParentID, ParentFieldPath,
    	PrimaryFieldUID, Caption, MainTable) {
    	var Section = new Object();
    	Section[spnID] = ID;
    	Section[spnTablePath] = TablePath;
    	Section[spnParentID] = ParentID;
    	Section[spnParentFieldPath] = ParentFieldPath;
    	Section[spnPrimaryFieldUID] = PrimaryFieldUID;
    	Section[spnCaption] = Caption;
    	Section[spnMainTable] = MainTable;
    	var Sections = GetSections(UserReportData);
    	Sections(ID) = Section;
    	return Section;
    }

    т.е убрать строчку Section[spnTop] = Top?((Top>0)?Top:-1):-1; и аргумент Top с функции AddSection в скрипте scr_UserReportCommon

    Всем привет!
    Доработан механизм вставки детали в сообщение при автоматическом его отравлении.
    Для применения обновления необходимо обновить файл scr_MailUtils и scr_OutlookUtils.
    Рекомендую перед обновлением сверить Ваши файлы с исходными.

    Спасибо Дмитрий, очень пригодилась ваши доработки.
    Для того что бы использовать функциональность в 3.3.2.157 XRM
    необходимо:
    1.

    "Яворский Алексей" написал:убрать строчку Section[spnTop] = Top?((Top>0)?Top:-1):-1; и аргумент Top с функции AddSection в скрипте scr_UserReportCommon

    2. Добавить системную переменную MSOutlookMaxFileSize
    1
    3. Удалить весь код между

    /* MODULE INCIDENTS */
    ...
    /* MODULE INCIDENTS */

    если у Вас нет модуля инциденты

    Отредактированные скрипты для XRM 3.3.2 (без модуля инциденты) во вложении

    Дмитрий просьба исправить грамматическую ошибку в коде
    var Message = 'Ошыбка при обработке деталей шаблона сообщения.';
    функция ReplaceDetailTemplate скрипт scr_MailUtils.
    Еще момент, при формировании письма с окна просмотра отчетов FastReport, при нажатии Send by E-mail -> PDF version у меня вылетает эта ошибка.

    Ошибка происходит в функции ReplaceDetailTemplate на строчке

    var Sections = Params.Template.Query.Sections;

    а вызывается ф-ия тут

    function InternalSendMessage(Message, Params) {
    	ReplaceDetailTemplate(Message, Params);
    	if (Params.Template) {
    ...

    Как бы в обычном письме Params.Template не определен, т.е нужно вызывать ReplaceDetailTemplate так :

    function InternalSendMessage(Message, Params) {
    	if (Params.Template) {
    		ReplaceDetailTemplate(Message, Params);
    		var Prop = '';
    		try {
    			Prop = toJSON(Params.MessageLinks);
    		} catch (e) {
    			Prop = '';
    		}
    ...

    Исправил синтаксическую ошИбку.

    Дмитрий, спасибо. Пригодилось решение.

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

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

     

    Если Вам необходимо реализовать возможность отправки E-mail контрагенту через действие "Отправить E-mail", то Вы можете воспользоваться следующим алгоритмом (пример реализации для версии Terrasoft CRM 3.3):

     

    1. В скрипте scr_MailUtils реализовать функцию получения e-mail адреса текущего контрагента:

     

     

    function GetCurrentAccountEmailAddress(AccountDataset) {

     

             var AccountEMailAddress = '';

     

             var Email = GetEmailCommunicationTypeID();

     

             for (var i = 1; i

     

                       var CommunicationTypeName = FormatStr('Communication%1TypeID', i);

     

                       var CommunicationType = GetFieldValueFromDisabledField(AccountDataset,

     

                                CommunicationTypeName);

     

                       if (CommunicationType == Email) {

     

                                var CommunicationName = FormatStr('Communication%1', i)

     

                                AccountEMailAddress = GetFieldValueFromDisabledField(AccountDataset,

     

                                          CommunicationName);

     

                                continue;

     

                       }

     

             }

     

             var AccountName = GetFieldValueFromDisabledField(AccountDataset, 'Name');

     

             if (IsEmptyStr(AccountEMailAddress)) {

     

                       Dataset = GetAccountCommunicationDataset(Email);

     

                       ApplyDatasetFilter(Dataset, 'AccountID',

     

                                AccountDataset.Values('ID'), true);

     

                       Dataset.Open();

     

                       try {

     

                                AccountEMailAddress = Dataset.ValAsStr('Number');

     

                       } finally {

     

                                Dataset.Close();

     

                       }

     

             }

     

             if (!IsEmptyStr(AccountEMailAddress)) {

     

                       if (!IsEmptyStr(AccountName)) {

     

                                AccountEMailAddress = AccountName + '';

     

                       }

     

             } else {

     

                       AccountEMailAddress = '';

     

             }

     

             return AccountEMailAddress;

     

    }

     

     

     

    function GetAccountCommunicationDataset(EmailTypeID) {

     

             if (!Assigned(MailUtilsScript.AccountCommunicationDataset)) {

     

                       var Dataset = Services.GetNewItemByUSI('ds_AccountCommunication');

     

                       MailUtilsScript.AccountCommunicationDataset = Dataset;

     

                       ApplyDatasetFilter(Dataset, 'CommunicationTypeID', EmailTypeID, true);

     

             }

     

             return MailUtilsScript.AccountCommunicationDataset;

     

    }

     

    2. Далее в скрипте scr_AccountsWorkspace реализовать функцию отправки сообщения :

     

     

     

    function SendMailWithoutTemplate() {

     

        var Dataset = Services.GetNewItemByUSI('ds_Account');

     

             EnableDatasetFilters(Dataset, false);

     

             Dataset.FetchRecordsCount = -1;

     

             var IDs = GetArrayByCollection(BaseWorkspace.Grid.SelectedIDs);

     

        var KeyDataFieldName = Dataset.KeyDataField.Name;

     

             var AccountEMailAddress = '';

     

             for (var i = 0; i

     

                       Dataset.Close();

     

                       ApplyDatasetFilter(Dataset, 'ID', IDs[i], true);

     

                       Dataset.Open();

     

                       var SingleAccountEMailAddress = GetCurrentAccountEmailAddress(Dataset);

     

                       AccountEMailAddress += IsEmptyValue(SingleAccountEMailAddress) ? '' :

     

                           (IsEmptyValue(AccountEMailAddress) ? '' : ';') +

     

                                SingleAccountEMailAddress;

     

             }

     

             CreateEmptyMessage(AccountEMailAddress);

     

             Dataset.Close();

     

    }

     

     

    3. В окне wnd_AccountsWorkspace добавить на закладке невизуальных компонентов одно действие, например, amiSendEmail и на событие OnExecute прописать вызов функции:

     

    SendMailWithoutTemplate();

     

     

    В результате с помощью действия будет создано письмо с e-mail адресом контрагента, действие в гриде продублируется автоматически.

     

    Полная инструкция со скриншотами прикреплена.

    Приятной работы! 

    Поделиться

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

    Значительно ли будет отличатся реализация данного функционала в Terrasoft CRM 3.2?

    Олег, данные функции работают и в Terrasoft CRM 3.2, т.е. реализация отправки e-mail в данной версии аналогична.

    P.S. Не забудьте присоединять скрипт scr_MailUtils в scr_AccountsWorkspace.

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