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

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

Тест ошибки в журнале:

System.ArgumentException: user does not have mail account

   в Terrasoft.Core.Process.SyncImapMail.ScriptTask1Execute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Нравится

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

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



Для решения необходимо выполнить следующий скрипт:

delete from QRTZ_TRIGGERS 
where (TRIGGER_GROUP = 'imap' or TRIGGER_GROUP = 'exchange')
and (TRIGGER_NAME like '%UId%')

Где UId - пользователя (не контакта) у которого возникает ошибка.

Спасибо, проблема решена!

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

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

Помогите, пожалуйста, разобраться с проблемой, как объединить фильтрацию и сортировку в oData?

фильтрация - работает

http://url/0/ServiceModel/EntityDataService.svc/ContactCollection?$sele…

сортировка- работает

http://1url/0/ServiceModel/EntityDataService.svc/ContactCollection?$select=Name&$orderby=Name

сортировка и фильтрация- НЕ работает

http://url/0/ServiceModel/EntityDataService.svc/ContactCollection?$sele…

выходит ошибка

 

4

The query parameter '$orderBy' begins with a system-reserved '$' character but is not recognized.

The query parameter '$orderBy' begins with a system-reserved '$' character but is not recognized.

System.Data.Services.DataServiceException

at System.Data.Services.HttpContextServiceHost.VerifyQueryParameters() at System.Data.Services.DataServiceHostWrapper.VerifyQueryParameters() at System.Data.Services.DataService`1.ProcessIncomingRequestUri() at System.Data.Services.DataService`1.HandleRequest()

 



не могу понять что не так.

Нравится

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

Проверьте такой вариант у меня ошибки нет

http://127.0.0.1:520/0/ServiceModel/EntityDataService.svc/ContactCollection?$select=Name&$orderby=Name&$filter=Phone ne '12'

 

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



вместо амперсантов ставить запятые? все выражение взять в скобки?

не очень понимаю что нужно изменить

http://url/0/ServiceModel/EntityDataService.svc/ContactCollection?($sel…; - вот так не работает, а с запятыми - просто не фильтрует

 

Проверьте такой вариант у меня ошибки нет

http://127.0.0.1:520/0/ServiceModel/EntityDataService.svc/ContactCollection?$select=Name&$orderby=Name&$filter=Phone ne '12'

 

Григорий Чех, да, спасибо, заработало

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

Добрый день



наблюдаем ошибку загрузки файлов в ActivityFile. в связи с чем она может возникать?

почему файлы не загружаются?

Изображение удалено.

Нравится

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

Причина написана в поле ErrorOnUpload: «А referenced period is missing.» А что именно это значит, нужно смотреть, какая логика пишет в это поле (стандартная детали файлов, БП, какая-то интеграция) и в каких случаях оставляет такое примечание.

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

Добрый день!

Подскажите, может кто-то решал подобную задачу? Как в отчете (список) реализовать данные колонки (сколько времени обращение было в том или ином состоянии). 

Изображение удалено.

 

Нравится

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

Вариантов много например так: создайте объект (по которой в дальнейшем можно и деталь сделать прикрепленную к обращению и отчет построить ) в которой будут колонки:

1) Id обращения (или сразу номер обращения для отчета)

2) код статуса (или сразу название статуса для отчета)

2) время установки статуса

3) время закрытия статуса

Создайте БП который по смене статуса будет вносить корректировки в выше созданый объект. А по созданию обращения делать первую запись. Таким образом при переходе в согласование например смотрите какой статус был раньше (в обращениях была колонка - приведущий статус) и для объекта меняете время закрытия преведущего статуса для текущего обращения. И вносите время установки для текущего статуса. Как то так.

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

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

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

 

 

 

 

Вариантов много например так: создайте объект (по которой в дальнейшем можно и деталь сделать прикрепленную к обращению и отчет построить ) в которой будут колонки:

1) Id обращения (или сразу номер обращения для отчета)

2) код статуса (или сразу название статуса для отчета)

2) время установки статуса

3) время закрытия статуса

Создайте БП который по смене статуса будет вносить корректировки в выше созданый объект. А по созданию обращения делать первую запись. Таким образом при переходе в согласование например смотрите какой статус был раньше (в обращениях была колонка - приведущий статус) и для объекта меняете время закрытия преведущего статуса для текущего обращения. И вносите время установки для текущего статуса. Как то так.

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

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

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

 

 

 

 

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

Добрый день коллеги.

В общем размер файлов по непонятным мне причинам ограничен.

Методы  GetStreamValue GetColumnValue возвращают файл не больше 512 kb.

Каким образом можно сделать чтобы возвращался весь файл, а не 512 kb сначала файла ?

 

Мне нужен весь файл так как я его собираюсь отправлять в файловое хранилище !

string iin1;	
iin1=Get<string>("iin");
int nomer1;		
nomer1=Get<int>("nomer");
Guid fileid1;	
fileid1=Get<Guid>("fileid");
 
string filename;
filename = "/public/Письма БПМ/";
filename = filename + iin1 +"/" + nomer1.ToString() +"/";
 
 
 
var userConnection = Get<UserConnection>("UserConnection");
var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SubsidiesFile");
esqResult.AddColumn("Name");
esqResult.AddColumn("Data");
 
var entity = esqResult.GetEntity(userConnection, fileid1);
 
 
//var data = entity.GetColumnValue("Data") as byte[]; послу получения размер массива 512288
//MemoryStream stream = new MemoryStream(data);
 
 
// Тут тоже 512288
MemoryStream stream = entity.GetStreamValue("Data");
 
fileexported = SftpService.SftpService.UploadFile(stream, filename);

 

Нравится

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

Но все равно остается вопрос почему БП неправильно сигнализирует добавление файла 

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

var data = entity.GetBytesValue("Data");

MemoryStream stream = new MemoryStream(data);

GetBytesValue тоже возвращает 512 кб

Судя по тому, что раздел самодельный, дело может быть в неверных свойствах поля «Data» в его объекте. Попробуйте проверить такую же логику для другого раздела.

Если и с ним то же самое, то нужно смотреть, как в этих случаях работает стандартный сервис скачивания /0/rest/FileService/GetFile/ и в чём отличие от Вашей логики.

 

А если попробовать так....

var userConnection = Get&lt;UserConnection&gt;("UserConnection");
var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SubsidiesFile");
esqResult.AddColumn("Name");
var colData = esqResult.AddColumn("Data");
 
var entity = esqResult.GetEntity(userConnection, fileid1);
 
using (MemoryStream stream = entity.GetStreamValue(colData.Name)){
if (stream != null) {
                                               stream.Position = 0;
//UploadFile....
stream.Flush();
                               }
}

И какой тип данных в конфигураторе установлен для колонки Data ????

 

объект наследуется от базового !

Нет Григорий Ваш код не помог до сих пор 512 кб. Видимо придется эскалировать на службу поддержки !

string iin1;    
iin1=Get&lt;string&gt;("iin");
int nomer1;        
nomer1=Get&lt;int&gt;("nomer");
Guid fileid1;    
fileid1=Get&lt;Guid&gt;("fileid");
 
string filename;
filename = "/public/Письма БПМ/";
filename = filename + iin1 +"/" + nomer1.ToString() +"/";
 
var userConnection = Get&lt;UserConnection&gt;("UserConnection");
var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SubsidiesFile");
 
 
esqResult.AddColumn("Name");
var colData = esqResult.AddColumn("Data");
 
var entity = esqResult.GetEntity(userConnection, fileid1);
 
 
string[] lines = { fileid1.ToString(),filename };
System.IO.File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines.txt", lines);
 
string name1 = entity.GetTypedColumnValue&lt;string&gt;("Name");
filename = filename + name1;
 
bool fileexported=false;
 
using (MemoryStream stream = entity.GetStreamValue(colData.Name)){
    if (stream != null) {
        stream.Position = 0;
        fileexported = SftpService.SftpService.UploadFile(stream, filename);
        string[] lines2 = { filename ,name1 , stream.Length.ToString() };
        System.IO.File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines2.txt", lines2);
        stream.Flush();
        }
}
 
Set("fileexported", fileexported);
Set("path", filename);
Set("filename", name1);
 
return true;

 

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

Добрый день коллеги.

В общем ситуация такая. Нетривиальная.

Там есть событие на добавление записи.

При добавление файла, файл отправляется на сервер по 512 кб.

Когда срабатывает событие, загружены только первые 512 кб.

Событие на изменение записи не работает!

В итоге для того чтобы отправить файл в файловое хранилище нужно ждать 10-15 сек, в зависимости как быстро закачается весь файл в Bpmonline! 

 

Напрашивается вопрос Террасофту, почему нельзя генерировать событие на добавление файла, когда весь файл записан, а не только первые его 512 кб??

В стандартном объекте «Файл» есть обработчики событий «Saving» и «Saved». В первом вычисляется версия и размер (и на тот момент его считает верно), второй пустой. Может, завязаться на второе и привязать туда запуск нужного БП. Или сразу на первое и обрабатывать данные файла ещё до его сохранения в базу.

Еще как вариант можно в FileDetail

перезгрузить событие и отсюда вызывать бизнес процесс параметрами 

onFileComplete: function(error, xhr, file, options) {

                if (!error) {

                    this.loadGridDataRecord(options.data.fileId);

                } else {

                    this.onFileCompleteError(error, file);

                }

                alert("Hie_dias");

                console.log(options);

            },

Но все равно остается вопрос почему БП неправильно сигнализирует добавление файла  ?

Может, на момент срабатывания события вся логика на стороне системы уже отработала и по 512 КБ асинхронно грузит сама база? Интересно, если смотреть в SQL-профайлере, завершился ли в тот момент Insert/Update-запрос?

возможно, но дальше разбираться нет желания...

Но все равно остается вопрос почему БП неправильно сигнализирует добавление файла 

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

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

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

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

В БП добавляю элементы: Чтение данных с чтением коллекции записей по нужным критериям и элемент Отправить E-mail (в качестве получателя Формула: [#Читать данные 1.Коллекция записей:E-mail#] или [#Читать данные 1.Коллекция записей:Контакт#] - не существенно) и при попытке сохранить процесс выдает ошибку: "Возникла ошибка при сохранении: Элемент коллекции с уникальным идентификатором "{F1C3BE1A-40EB-4214-9690-318F52F0D1F7}" не найден". Ошибка точно связана с чтением коллекции записей и ее обработкой, т.к при чтении одной записи - все отлично.

Кто сталкивался с подобным/как исправить или корректно обрабатывать коллекцию?

Нравится

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

На сколько я знаю, на данный момент коллекцию можно обработать только в элементе "Веб-сервис". В следующих релизах будет возможность передачи коллекции в подпроцесс. Информация отсюда, из раздела Бизнес-процессы https://academy.terrasoft.ru/documents/upcoming-releases

На сколько я знаю, на данный момент коллекцию можно обработать только в элементе "Веб-сервис". В следующих релизах будет возможность передачи коллекции в подпроцесс. Информация отсюда, из раздела Бизнес-процессы https://academy.terrasoft.ru/documents/upcoming-releases

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

Спасибо. А есть ли какие-то прогнозы когда можно будет использовать "простым смертным" прелести коллекций?:)

Хованский Владислав,

это вам к разработчикам bpm'online) но полагаю, что в следующем релизе

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

Всем доброго времени суток. Версия 7.12.

Сделали действие в меню, обрабатывающее выбор нескольких записей в разделе, всё по образцу из академии: https://academy.terrasoft.ru/documents/technic-sdk/7-12/obrabotka-vybor…

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

Изображение удалено.

В чём дело? Существует ли решение?

Нравится

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

Добавь "IsEnabledForSelectedAll": true    и верни проверку на доступность, те что хотя бы одна запись была выделена или выбрана. Вот что получилось в итоге:

isCustomActionEnabled: function() {
	var activeRowId = this.get("ActiveRow");
	if (activeRowId) return true;
	var selectedRows = this.get("SelectedRows") || [];                
	return selectedRows.length &gt; 0;
},
getSectionActions: function () {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator",
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
            "Caption": {bindTo: "Resources.Strings.GetServiceInfoButtonCaption"},
            "Click": {bindTo: "onGetServiceInfoClick"},
            "Enabled": {bindTo: "isCustomActionEnabled"},
            "IsEnabledForSelectedAll": true	
	}));
	return actionMenuItems;
},

Работает и при множественном выделении если хотябы ода запись отмечена или выбрана

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

actionMenuItems.addItem(this.getButtonMenuItem({
	"Click": {"bindTo": "openShowOnMap"},
	"Caption": {"bindTo": "Resources.Strings.ShowOnMapActionCaption"},
	"Enabled": {"bindTo": "isAnySelected"}
		}));

 

Я вообще убирал какие-либо условия для Enabled, и всё равно блокируется.

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

Добавь "IsEnabledForSelectedAll": true    и верни проверку на доступность, те что хотя бы одна запись была выделена или выбрана. Вот что получилось в итоге:

isCustomActionEnabled: function() {
	var activeRowId = this.get("ActiveRow");
	if (activeRowId) return true;
	var selectedRows = this.get("SelectedRows") || [];                
	return selectedRows.length &gt; 0;
},
getSectionActions: function () {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator",
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
            "Caption": {bindTo: "Resources.Strings.GetServiceInfoButtonCaption"},
            "Click": {bindTo: "onGetServiceInfoClick"},
            "Enabled": {bindTo: "isCustomActionEnabled"},
            "IsEnabledForSelectedAll": true	
	}));
	return actionMenuItems;
},

Работает и при множественном выделении если хотябы ода запись отмечена или выбрана

Денис,

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

Заметила для базового действия "Merge records".

Уточнила у службы поддержки не является ли это ошибкой, на что был получен ответ: "Это корректное поведение базового функционала.

Таким образом система предотвращает объединение всех записей и защищает пользователя от совершения ошибки, но если необходимо выделить диапазон записей, то Вы можете воспользоваться клавишей shift. 

Нажмите на необходимую запись, она выделится, после этого зажмите shift и нажмите на необходимо границе выборки."

Мое мнение, что это совсем неочевидно (про shift).

Озвучила им, что функционал нужно переделать и пункт меню 'Merge records' должен быть доступен при 'Select all', так как вариант с shift более трудозатратный и требует дополнительных действий со стороны пользователя. Сказали, что информацию передадут соответствующей команде разработки.

В общем выделяйте пока shift и будет Вам счастье wink

Ну, или же, как вариант, перепишите свое действие.

 

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

Всем доброго времени суток. Версия 7.12.

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

Ну т.е. например есть объект Contact, у него страница ContactPageV2

есть объект Case и страница CasePage

и т.д. для других объектов.

Нужно для правильной генерации ссылок.

Нравится

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

Всем доброго времени суток. Версия 7.12.

Можно ли как-то получить значение отображаемой колонки через запрос, не зная саму колонку, но зная id записи? Или хотя бы код этой колонки, зная объект?

Изображение удалено.

Нравится

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

require объекта можно сделать. Прилетит его полное описание.

Ну или в this.entitySchema в карточке/разделе посмотреть.

Значение - Entity.PrimaryDisplayColumnValue в С#

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

А через JS как-нибудь можно?

require объекта можно сделать. Прилетит его полное описание.

Ну или в this.entitySchema в карточке/разделе посмотреть.

См. последний пример тут.

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

Всем доброго времени суток. Версия 7.12.

Можно ли при загрузке передать в параметр детали ссылку на функцию?

details: /**SCHEMA_DETAILS*/{
				DataDetail: {
					schemaName: "BaseGridDetailV2",
					entitySchemaName: function(){return this.get("SysModuleCode")},
					filter: {
						masterColumn: "SysModuleId",
						detailColumn: "Id"
					},
					filterMethod: "DataDetailFilter"
				}
			}/**SCHEMA_DETAILS*/,

Такая конструкция не сработала. Возможна ли вообще реализация заявленной задачи?

Нравится

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

Насколько я знаю, нет. Но можно в качестве entitySchemaName использовать view.

Насколько я знаю, нет. Но можно в качестве entitySchemaName использовать view.

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