Добрый день!

При вызове скрипта генерирования печатной формы в бизнес-процессе он падает с ошибкой:

System.NullReferenceException: Object reference not set to an instance of an object.

   at Terrasoft.Configuration.ReportService.ReportService.GetSchemaNameByTemplateId(Guid templateId)

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

Вопросы: как можно заменить Supervisor на другого пользователя? Или может посоветуете как получить UserConnection другого пользователя для выполнения ReportService? Возможно ли обойтись в ReportService без UserConnection?

Спасибо!

Нравится

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

а как происходит инициализация ReportService в бп?

Ранее тема обсуждалась тут и тут. В ReportService в логике функций GenerateMSWordReport или GenerateDevExpressReport есть фрагменты, которые позволяют его запускать только при работе из браузера, но не в фоновом режиме с сервера, когда UserConnection нет. В комментариях один из участников рассказал, что в итоге переделал этот сервис, чтобы не использовать UserConnection. А другой предложил запускать от имени какого-то пользователя посредством ProcessEngineService, так работает нормально.

Варфоломеев Данила,

Процесс запускается через задание-сценарий вызовом 

GenerateMSWordReport, в который передаются параметры бизнес-процесса и UserConnection

 

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

Спасибо вам за информацию!

Мы заметили, что новый функционал в 7.13.2 "Фоновое выполнение операции" предназначен для запуска фоновых задач, которые требуют UserConnection. Я правильно понимаю, что с помощью этого функционала можно создать UserConnection для передачи в GenerateMSWordReport? (https://academy.terrasoft.ru/documents/technic-sdk/7-13/fonovoe-vypolne…)

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

и может вы знаете как на время изменить в процессе системную настройку текущего системного пользователя по умолчанию с Supervisor на другого пользователя, чтобы таким образом взять его UserConnection?

Дело не в том, что это конкретно Supervisor. Если под Supervisor зайти в систему и по действию построить отчёт, всё отработает.

Варианты по ссылкам предлагались ещё до появления 7.13.2, можете проверить и этот механизм.

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

Добрый день!



Интересует возможность печати всего раздела. Возможно ли сделать такой шаблон? Грубо говоря, хочется выгрузить реестр в виде печатного шаблона Word со всеми макросами, которые есть в системе.



Задача: 

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

Нравится

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

Для реализации Вашего отчета в MS Word Вам нужно реализовать sql-представление с полями 'Клиент' и 'Суммой по клиенту' (в цифровом значении). На основании этого представления создать EntitySchema и уже её использовать в отчете.

Чтобы ничего не дорабатывать для вывода суммы прописью, в отчете MS Word Вы можете использовать преднастроенный макрос базовой версии [#NumberRU#].

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

Потом при формировании шаблона в MS Word нужно добавить на страницу шаблона данную колонку с макросом в виде Сумма[#NumberRU#]

P.S. Также по этой ссылке Вы можете ознакомиться, какие ещё есть стандартные макросы в базовой версии.

Добрый день!

А что значит фраза

но как тогда в Excel превратить цифры в прописные буквы?

Имеется ввиду сумма прописью? Если да, то тут вариантов море. Кто-то берет готовые библиотеки и с их помощью конвертирует, кто-то пишет свои, даже попадался вариант конвертации в sql-процедуре)

Для реализации Вашего отчета в MS Word Вам нужно реализовать sql-представление с полями 'Клиент' и 'Суммой по клиенту' (в цифровом значении). На основании этого представления создать EntitySchema и уже её использовать в отчете.

Чтобы ничего не дорабатывать для вывода суммы прописью, в отчете MS Word Вы можете использовать преднастроенный макрос базовой версии [#NumberRU#].

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

Потом при формировании шаблона в MS Word нужно добавить на страницу шаблона данную колонку с макросом в виде Сумма[#NumberRU#]

P.S. Также по этой ссылке Вы можете ознакомиться, какие ещё есть стандартные макросы в базовой версии.

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

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

Нравится

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

Что именно вам необходимо сделать? Реализовать свою бизнес-логику в карточке вашего раздела?

От авто-сгенерированных классов страниц нельзя наследоваться. 

Как можно замещать страницу просмотра в разделе контакты:

Нужно создать схему UsrMobileContactPreviewPage. В которой вы опишите классы (controller/view) своей страницы, которые будут наследоваться от базовых классов страницы.

Пример можно посмотреть в схеме: Mobile -> MobileContactPreviewPage

Затем вам нужно будет прописать имя этой схемы в соответствующей секции в манифете мобильного приложения:

"Models": {
   "Contact": {
      "Preview": "UsrMobileContactPreviewPage"
Показать все комментарии

Настроил свой БП на обращения. В нем есть отправка письма.

Для отправки письма используется мультиязычный шаблон. Для формирования письча делаю читать данные схемы Case, потом Действие процесса Обработать шаблон письма с макросами (где указан мой шаблон), затем добавляю данные в раздел Активности и далее отправляю письмо скриптом:

var activityId = Get<Guid>("AddDataID");
if (UserConnection.GetIsFeatureEnabled("UseAsyncEmailSender")) {
	AsyncEmailSender emailSender = new AsyncEmailSender(UserConnection);
	emailSender.SendAsync(activityId);
} else {
	var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
	var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
	activityEmailSender.Send(activityId);
}
return true;

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

Пример такой настройки взят и стандартного БП Отправка письма при смене статуса обращения.

Вопрос как мне заставить отправлять письмо по настройкам языка получателя?

Нравится

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

EmailSender скорее всего берет тело сообщения из активности, а там уже лежит текст сообщения на каком то языке.

Почему бы не воспользоваться стандартным блоком "Отправить Email"?

Письмо должно быть привязано в хронологию обращения. К тому делал через отправку стандартным блоком Отправить Email и постоянно какие то ошибки. Не дружу я с ним )

К тому же все стандартные процессы по отправке писем не используют блок Отправить Email, а отправляют скриптами

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

Как то так

cultureId = UserConnection.CurrentUser.SysCultureId;

//cultureId бери из настроек пользователя те тот язык на котором хочешь чтобы было письмо пользователя

esq.SetLocalizationCultureId(cultureId);

Ну или более глобально как то так

userConnection.CurrentUser.SysCultureName = "en-US";

 

В итоге выяснилось путем тестов. Элемент БП Выполнить действие -  - Обработать шаблон письма с макросами не учитывает мультиязычные шаблоны.  Делал подмену шаблона из таблицы EmailTemplate на EmailTemplateLang. 

var mailTemplateID = Get&lt;Guid&gt;("MailTemplateID");
var usrLangId = Get&lt;Guid&gt;("UserLanguageID")==Guid.Empty
    ? new Guid("6EBC31FA-EE6C-48E9-81BF-8003AC03B019")
    : Get&lt;Guid&gt;("UserLanguageID");
var newMailTemplate = new EmailTemplateStore(UserConnection);
Set&lt;Guid&gt;("MailTemplateID", newMailTemplate.GetTemplate(mailTemplateID, usrLangId).PrimaryColumnValue);
return true;

И подавал на вход Элементу Обработать шаблон письма с макросами - результате пустое письмо. Поэтому перешел на другую отправку писем:

var contactEmail = Get&lt;string&gt;("ContactEmail");
var senderEmail = Get&lt;string&gt;("SenderEmail");
var caseId = Get&lt;Guid&gt;("RecordId");
var templateId = Get&lt;Guid&gt;("MailTemplateID");
var emailTemplateMacrosManager = new EmailWithMacrosManager(UserConnection);
emailTemplateMacrosManager.SendEmailFromTo(caseId, templateId, senderEmail, contactEmail);
return true;

Хорошо что раздел обращения. Полагаю в другом разделе такая отправка не заработает (

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

Добрый день!

Есть необходимость администрировать только одну колонку "Ответственный" во всем разделе. Использовать Администрирование по колонкам не очень хочется, поскольку знаю что это достаточно сильно раздувает таблицы прав и колонок в моем разделе достаточно много.

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

П.С. На всякий случай уже пробовал условие с использованием роли "Текущий пользователь = Системный администратор" - не прокатило :(

Нравится

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

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

Вот ссылки на Академию: Механизм блокировки полей страницы редактирования и Как полностью заблокировать поля страницы редактирования.

Добрый день. Вам подойдет способ проверки прав доступа на операцию. Без кода сделать не получится. Загляните в эту тему: https://community.terrasoft.ru/questions/kak-ubrat-deistvie-kopirovatiz…

Дмитрий А.,

А есть решение другое, как для аналитика, а не программиста?

Семенов Михаил,

Посмотрите это расширение

оно позволяет делегировать права пользователя/роли другому пользователю.

Григорий Чех,

не совсем понимаю как это расширение поможет. У меня основная идея отказаться от администрирования по колонкам (ради одной колонки настраивать почти сотню остальных как то не очень)

Семенов Михаил пишет:

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

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

Вот ссылки на Академию: Механизм блокировки полей страницы редактирования и Как полностью заблокировать поля страницы редактирования.

Спасибо, есть с чем потренироваться)

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

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

Каким способом можно это реализовать? Через OData нет доступа к системным коллекциям, типо SysLeadRight насколько я понимаю. 

Нравится

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

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

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

Есть задача выслать напоминание через 3 рабочих часа. Т.к. использоваться будет много, то хочу сделать по примеру темплейта https://marketplace.terrasoft.ru/template/raschet-rabochih-dney-v-bizne…. Только получается надо к дате/времени события прибавить рабочие минуты с учетом календаря. Если событие произойдет 7 марта в 16:00 (рабочий день до 17:00), то напоминание должно прийти 11 марта в 11:00 (рабочий день с 9:00). Все праздники и сокращенные дни занесены в Типовой календарь.

Как работать с выходными днями понял, а вот с рабочим временем не очень то понимаю.

Нравится

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

В продуктах ServiceDesk есть рабочий календарь (график работы) и расчет рабочих дат через веб-сервисы,(посмотрите TermCalculationService и сделайте что вам нужно по аналогии)

Так же есть бесплатные расширения для БП позволяющие работать с рабочими днями (можете сделать свой вариант по аналогии если существующий функционал вас не устроит)

В продуктах ServiceDesk есть рабочий календарь (график работы) и расчет рабочих дат через веб-сервисы,(посмотрите TermCalculationService и сделайте что вам нужно по аналогии)

Так же есть бесплатные расширения для БП позволяющие работать с рабочими днями (можете сделать свой вариант по аналогии если существующий функционал вас не устроит)

Решил задачу с использованием класса TermCalculatorActions

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

Добрый день!

Имеется следующий кейс: закрытие подчиненных обращений после закрытия родительского.

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

Нравится

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

Возможно

стартовый сигнал изменение состояния обращения на закрыто (отменено/огтклонено), дальше меняете состояния у всех не закрытых обращений у которых Id из стартового сигнала родитель!

Возможно

стартовый сигнал изменение состояния обращения на закрыто (отменено/огтклонено), дальше меняете состояния у всех не закрытых обращений у которых Id из стартового сигнала родитель!

Григорий Чех,

Благодарю! Сработало.

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

Добрый день!

Установил расширение, которое по таймеру показывает всплывающие изображения (https://marketplace.terrasoft.ru/app/new-year-motivation-bpmonline)

Изменил скрипт, который сейчас показывает изображения пользователю, запустившему процесс:

var sender = "ShowImageScreen";

var userConnection = Get("UserConnection");

var messageText = string.Format("\"number\":{0}", UsrNumber.ToString());

messageText = '{' + messageText + '}';

            MsgChannelUtilities.PostMessage(userConnection, sender, messageText);

return true;

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

Заранее благодарю!

Нравится

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

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

В клиентском модуле необходимо подписаться на данное сообщение. Например данное сообщение необходимо выводить в карточке контакта ContactPageV2

Тогда в данном модуле необходимо прописать следующее:

 

define("ContactPageV2", [],
function() {
	return {
		entitySchemaName: "Contact",
		attributes: {},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		messages:{},
		methods: {
			init: function () {
				this.callParent(arguments);
				this.subscriptionFunction();
			},			
			subscriptionFunction: function() {
				this.callParent(arguments);
				Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
				this.onWebSocketListener, this);
			},
			onWebSocketListener: function(scope, message) {
				if (message &amp;&amp; message.Header.Sender === "ShowImageScreen") {
					var message2 = message.Body;
					if (!this.Ext.isEmpty(message2)) {
						this.Terrasoft.showInformation(message2);
					}
					return;
				} 
			},
 
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

 

Нигрескул Алексей,

в нашем случае сообщение всплывает поверх всех открытых окон в bpm. Задача не стоит конкретно отображать сообщение в каком-либо разделе (в Вашем примере в контактах), а в самом скрипте прописать параметр, в который мы бы и задавали пользователя для отображения сообщения.

Насколько понимаю, MsgChannelUtilities.PostMessage взаимодействует только с текущим пользователем, выполняющим процесс. Ещё есть MsgChannelUtilities.PostMessageToAll(string sender, string message), см. обсуждение.

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

Всем доброго времени суток!

Столкнулся с такой проблемой при разработке в ФС сжирается все ОЗУ и ПК тупо зависает.

ОЗУ 16 Гб. При компиляции загружается под 100%. Где можно настроить ограничение ресурсов ОЗУ при компиляции?

Заранее благодарен.

Нравится

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

Отсутствие пророческого дара не позволяет вам помочь. Если проблема еще актуальна может вы немного подробнее описать что вы делаете и ответить на нижеприведенные вопросы или все тоже самое отправить в тех поддержку террасофт

- ос

- версия нет фрєймворка

- версия sql сервера (для MS SQL то что возвращает select @version)

- как компилируете (если через VS то версия и обновления установленные) если через консоль то параметры и желательно логи компиляции

- какие доп сборки включены в конфигурацию

Отсутствие пророческого дара не позволяет вам помочь. Если проблема еще актуальна может вы немного подробнее описать что вы делаете и ответить на нижеприведенные вопросы или все тоже самое отправить в тех поддержку террасофт

- ос

- версия нет фрєймворка

- версия sql сервера (для MS SQL то что возвращает select @version)

- как компилируете (если через VS то версия и обновления установленные) если через консоль то параметры и желательно логи компиляции

- какие доп сборки включены в конфигурацию

Григорий Чех,

ОС: Windows 10, версия 1803

.Net framework: http://prntscr.com/mpr4ys

версия sql сервера: Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64)   Apr 29 2016 23:23:58   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 17134: ) 

Компилировал и через VS и через конфигурацию, память загружается под 100%

 Сборки: Sales, Marketing, Service

 

Нажал публикацию объекта:

http://prntscr.com/mpruc6

данный процесс съедает почти 4 гб озу

У меня компилятор 3 Гб выедает. Но при 64-х воткнутых в сервер это не проблема :)

Алексей-Карягин,

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

VBCSCompiler.exe — это компилятор от Microsoft. Сайт bpm'online его просто запускает с нужными параметрами.

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

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

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

Отключен файл подкачки т.к. использую SSD

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

Поставил файл подкачки проблема пропала

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