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

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

Вопрос следующий: потребовалось переназначить это действие на другого пользователя. Каким образом это можно сделать? 

 

Нравится

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

У элемента "Преднастроенная страница" есть поле "Кому открыть страницу?", указываете в формуле нужного контакта.

У элемента "Преднастроенная страница" есть поле "Кому открыть страницу?", указываете в формуле нужного контакта.

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

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

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

А каким то образом можно изменить пользователя, который заполняет эту страницу в запущенном экземпляре процесса?

Нравится

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

Добрый день!

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

https://academy.terrasoft.ru/docs/user/biznes_processy/spravka_po_eleme…

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

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

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

Но как создать на C# (не в бизнес процессе) уведомление без этой ссылки, как это реализовано например у уведомлений об синхронизации с LDAP?

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

Нравится

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

Создаете в с# в таблице Remindings запись, вот и будет вам текст без ссылки. Откройте таблицу Remindings и посмотрите запись у которой дата 24.02.2021 в 17:57 и увидите какие поля должны быть заполнены чтобы получить такое уведомление.

Именно туда и ложил, потому что все уведомления там лежат только с указанием разных типов. Пробовал и такой способ   и такой . Смотрел в таблице "Reminding" как реализовано уведомление что на скрине, но без указания раздела его пользователь просто не видит, а с указанием делает гиперссылкой 

Александр Тыра,

Мне эти ссылки не нужны. Приложите код которым создаете уведомление и скриншоты с полями в двух записях бд, та которая у вас создается уведомление и уведомление с ldap. 

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

Александр Тыра,

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

А исходные данные мне нужны чтобы понять куда вы смотрите и почему разницу не видите.

Данные из бд можно работая в SQL Server Management Studio  выгрузить в csv, можно выделить и скопировать в excel.

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

И приложите свой c# код создания уведомления и файл с двумя записями из Reminding.

От

Полозюков Евгений Петрович,

Ответ простой - в 7.13 нельзя создать уведомление без ссылки, потому это поправили в более поздних версиях

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

Подскажите, как реализовать групповую отправку счетов на оплату ?

Ситуация:

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

Спасибо!

Нравится

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

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

А если у вас много счетов данные по которым отправляются одному человеку, надо собирать текст письма по данным счетов и отправить его в один элемент. Сборка текста по счета также либо циклом, либо через подпроцесс, а лучше c# кодом.

А в каком виде вы отправлять собрались?

Полозюков Евгений Петрович,

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

Думаю добавить логическое поле, и по этому критерию осуществить выборку в БП.

Левон Т.,

Если представляете значит у вас задачи нет. Сначала проведите анализ бизнес требований и сформулируйте на их основе задачу.

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

Зверев Александр пишет:

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

 

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

 

Подскажите, что я делаю не так?

На первом шаге БП читает коллекцию счетов, дальше, при формировании тела письма, коллекция как параметр, не отображается...

Вам надо сделать процесс, который посылает письмо для одного контакта. И в этот процесс передавать коллекцию.



В итоге процесс запустится для каждого контакта из коллекции.



Но тут надо быть внимательным с количеством вызовов этого процесса? Вы его примерно можете оценить?

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

А если у вас много счетов данные по которым отправляются одному человеку, надо собирать текст письма по данным счетов и отправить его в один элемент. Сборка текста по счета также либо циклом, либо через подпроцесс, а лучше c# кодом.

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

Добрый день!

Посоветуйте, как реализовать вывод ссылки на загруженный файл на мини- карточку, или же preview самого файла.

Ситуация такая, нужно чтобы при наведении курсора на номер счета, отображался документ..

Спасибо!

Нравится

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

Левон, вот статья о создании мини-карточки со ссылкой на скачивание файла, что выглядит так:

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

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

Спасибо !

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

 

В статье описывается именно тот функционал, который мне нужен, но уровень сложности великоват!

Есть человек(фрилансер), который может помочь с реализацией данной функциональности?

Левон, в Маркете есть раздел с компаниями-партнёрами. К сожалению, кого выбрать, не подскажу.

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

Добрый день!

 

Подскажите как правильно организовать распределение входящих Лидов между операторами если каждый оператор привязан к своему региону и набору каналов(e-mail, звонки, лэндинги)?  Возникла идея организовать распределение через очереди, но в стандартной реализации Тип очереди "Лид" отсутствует. На сколько реализуемо? Какие есть альтернативные варианты? 

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

 

 

Нравится

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

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

Откроется окно с аналогом старого интерфейса:

Максим, добавьте Лид в справочнике [Объекты очередей] и он появится в списке.

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

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

Максим Румский,

а у вас какая версия? на 7.17.0 у меня другой интерфейс добавления записи для этого справочника и там UID нет. Просто добавляешь и работает.

 

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

 

версия 7.17.1 с новым интерфейсом раздела "Конфигурация". Видимо при переезде на новый интерфейс что-то потерялось. Написал в тех.поддержку.

 

Просьба еще проверить какое у Вас значение указано в  свойствах справочника "Страница реестра":

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

Откроется окно с аналогом старого интерфейса:

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

Спасибо! Так все работает.

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

Добрый день!

 

Коллеги, помогите найти решение:

 

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

Может у кого была подобная задача, есть чем поделиться?

Спасибо!

Нравится

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

Добрый вечер.

Можно попробовать реализовать через бизнес-процесс с помощью элементов 'Автогенерируемая страница' и 'Преднастроенная страница'.

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

Подробнее о работе с этими элементами можно почитать Элемент процесса [Автогенерируемая страница] и Элемент процесса [Преднастроенная страница].

Добрый вечер.

Можно попробовать реализовать через бизнес-процесс с помощью элементов 'Автогенерируемая страница' и 'Преднастроенная страница'.

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

Подробнее о работе с этими элементами можно почитать Элемент процесса [Автогенерируемая страница] и Элемент процесса [Преднастроенная страница].

Можете использовать Terrasoft.utils.inputBox, в нем поместить Ваши поля

Модальное окно может отображать карточку, в коде карточке вы можете настроить любое количество интересующих вас элементов.

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

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

Нравится

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

Думаю, заказчику лучше обратиться с вопросом к тому, кто разрабатывал сценарий. Без подробностей сложно сказать, что именно он делает в системе. Например, если каждый раз сохранять запись о новом обращении с одним и тем же Id (а при нормальной работе он уже есть в запросе к /0/DataService/json/SyncReply/InsertQuery), то не создастся много записей, а будут ошибки.

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

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

 

Логика Terrasoft.controls.mixins.Bindable.callModelMethod вызывает привязанный метод ExperimentVisibility к элементу страницы из раздела diff в параметре bindTo

 

{
  "operation": "merge",
  "name": "ConsumptionDetailcc99e44c",
  "values": {
     "visible": {
        "bindTo": "ExperimentVisibility"
     }
  }
},

Метод ExperimentVisibility проверяет установлено ли значение в схеме объекта страницы. На момент когда Bindable.callModelMethod вызывается, данные схемы объекта страницы еще не загружены логикой. Значение которое проверяется методом = undefined. 

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

 

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

Нравится

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

Можно создать на странице атрибут логического типа, присвоить ему значение false, а видимость компонента привязать к нему.

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

"CommentsVisible": {
	"dataValueType": this.Terrasoft.DataValueType.BOOLEAN,
	"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"value": false
},
...
/**
 * Toggle comments block visibility and load first portion of comments if it is visible and empty.
 * @protected
 */
toggleCommentsVisibility: function() {
	if (this.get("CommentCount") < 1) {
		return;
	}
	var newVisibilityState = !this.get("CommentsVisible");
	this.set("CommentsVisible", newVisibilityState);
	if (newVisibilityState && this.get("ShownCommentMessagesCount") === 0) {
		this.onLoadNextComment();
	}
},
...
{
	"operation": "insert",
	"name": "ESNCommentsContainer",
	"parentName": "HistoryV2MessageFooterContainer",
	"propertyName": "items",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.CONTAINER,
		"wrapClass": ["esn-comments-container"],
		"visible": {"bindTo": "CommentsVisible"},
		"items": []
	},
	"index": 1
},

 

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

В Академии есть описание как скачать шаблон для импорта объектов из Конфигурации. В предыдущих версиях часто это использовала. 

Но в версии 7,17,0 - не могу определить где находится кнопка Настройки. 

Пример на скрине

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

Нравится

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

На версии 7.17.0 можно попробовать пройти по адресу yoursite/0/ViewPage.aspx?Id=c2af7f54-07df-4670-9c2b-af2497d3231f

 

На версии 7.17.1 прежде чем эту ссылку использовать надо реанимировать старый конфигуратор

 

Спасибо! Вот только клиенту это уже не объяснишь....

А клиент в старой конфигурации умел это делать сам? в этом случае дайте ему ссылку, а дальше все тоже самое осталось.

Екатерина, что Вы имеете в виду под шаблоном для импорта объектов из Конфигурации? Речь о выгрузке схем или данных в Excel? Приведите ссылку или скриншот, как раньше было.

вот тут ссылка на окошко старого интерфейса /0/ViewPage.aspx?Id=c2af7f54-07df-4670-9c2b-af2497d3231f

добраться из старой конфигурации можно так:

 

Было бы не плохо вставить эту кнопку "Скачать шаблон"  в новый мастер импорта, который по адресу /0/Nui/ViewModule.aspx?vm=FileImportWizard#FileImportModule/FileImportStartPage/f0a9cd02-5a19-4a4b-9e6e-7505bd509247

Спасибо, теперь понял, о чём Вы. В новой конфигурации нет кнопки «настройки», поскольку она была не частью старой конфигурации, а частью старого 5.Х-интерфейса вообще, была видима в любом разделе. А в 7.17 старый интерфейс окончательно убрали, а с ней и кнопку настройки, и окно старого импорта, и кнопку скачивания в нём. В новом интерфейсе свой экран настроек, «Дизайнер системы».

В академию по поводу неактуального абзаца сообщил.

Сложность в использовании функциональности импорта из Excel о том, что нет возможности скачать шаблон файла для загрузки данных объекта была зарегистрирована ещё при запуске нового UI импорта из Excel, но пока ничего не планировали. Приоритетность реализации зависит от количества запросов  по этой теме.

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

Как обходной вариант, можно просто вывести в реестре раздела нужные колонки и скачать файл по действию «Экспорт в Excel», а затем его открыть и оставить только «шапку».

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

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

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

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

Не, идея не в этом. Шаблон выгружается согласно доработанной объектное модели.(он не статичен) Т.о. добавляем в объект все нужные поля и справочники, выгружаем шаблон и отдаем для наполнения. А так как у всех модели данных разные, то и выгрузка шаблонов - регулярна.

В таком случае, можно опять выгрузить по действию «Экспорт в Excel».

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

Да, но для этого нужно опять добавлять колонки в реестр.

А зачем Вы их удаляли?

С выгрузкой по действию «Экспорт в Excel» тоже есть свои нюансы. Так например списочное представление позволяет вывести только 24 колонки. Можно конечно в плиточном вывести все необходимые колонки. Тогда Экспорт в Excel выгрузит все что надо. Но Выгрузка шаблона позволяла выгрузить сразу всю объектную модель данных без настройки реестра записей, да еще и с указанием обязательности полей

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

а зачем мне в реестре весь список полей из объекта? Алексей в сообщении выше очень точно описал суть проблемы)

В таком случае ожидайте реализации идеи по добавлению скачивания шаблона в новый импорт.

Или самостоятельно сделать БП с логикой, взятой из DownloadTemplateMenuItemClickScriptTaskExecute схемы ImportSettingsPage и адаптированной под сохранение файла где-то в базе.

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

Нынешняя логика этой кнопки такая:

		public virtual bool DownloadTemplateMenuItemClickScriptTaskExecute(ProcessExecutingContext context) {
			Page.BaseMessagePanel.Clear();
			if (string.IsNullOrEmpty(SchemaName)) {
				Page.BaseMessagePanel.AddMessage(WarrningMessage, UnableSelectObjectMessage, MessageType.Warning, true);
				return true;
			}
			Page.Response.ClearHeaders();
			Page.Response.ClearContent();
			string fileName = SchemaName;
			var instance = UserConnection.EntitySchemaManager.GetInstanceByName(SchemaName);
			if (instance != null) {
				fileName = instance.Caption.ToString();
			}
			Page.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
			if (HttpContext.Current.Request.Browser.Browser == "IE") {
				string fileNameEnc = HttpUtility.UrlPathEncode(fileName);
				Page.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileNameEnc + ".xlsx\"");
			} else {
				Page.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
			}
			List<double> columnWidthsList = new List<double>();
			using (MemoryStream stream = new MemoryStream()) {
				using(SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook)) {
					// Add a WorkbookPart to the document.
					var workbookpart = spreadsheetDocument.AddWorkbookPart();
					workbookpart.Workbook = new OpenXmlSpreadsheet.Workbook();
 
					// Add a WorksheetPart to the WorkbookPart.
					var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
					var workbookStylesPart = workbookpart.AddNewPart<WorkbookStylesPart>(); 
					worksheetPart.Worksheet = new OpenXmlSpreadsheet.Worksheet(new OpenXmlSpreadsheet.SheetData());
 
					// Add Sheets to the Workbook.
					OpenXmlSpreadsheet.Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<OpenXmlSpreadsheet.Sheets>(new OpenXmlSpreadsheet.Sheets());
 
					// Append a new worksheet and associate it with the workbook.
					string relationshipId = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart);
					string sheetName = fileName;
					OpenXmlSpreadsheet.Sheet sheet = new OpenXmlSpreadsheet.Sheet() {
						Id = relationshipId,
						SheetId = 1, 
						Name = sheetName
					};
					sheets.Append(sheet);
 
					OpenXmlSpreadsheet.Worksheet worksheet = new OpenXmlSpreadsheet.Worksheet();
					OpenXmlSpreadsheet.SheetData sheetData = new OpenXmlSpreadsheet.SheetData();
					OpenXmlSpreadsheet.Row row = new OpenXmlSpreadsheet.Row();
 
					OpenXmlSpreadsheet.Cell currentCell;
					int columnCount = 0;
					var entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName(SchemaName);
					foreach (EntitySchemaColumn column in entitySchema.Columns) {
						if (!column.DefValue.IsSystemValue &&
								(column.UsageType != EntitySchemaColumnUsageType.Advanced) && 
								(column.UsageType != EntitySchemaColumnUsageType.None) &&
								!column.Name.Equals("ProcessListeners") &&
								!(column.DataValueType is ImageDataValueType) &&
								!(column.DataValueType is ImageLookupDataValueType)) {
							currentCell = new OpenXmlSpreadsheet.Cell();
							currentCell.DataType =  OpenXmlSpreadsheet.CellValues.String;
							if (column.RequirementType == EntitySchemaColumnRequirementType.ApplicationLevel || column.RequirementType == EntitySchemaColumnRequirementType.DBLevel) {
								currentCell.StyleIndex = 3;
							} else {
								currentCell.StyleIndex = 4;
							}
							columnWidthsList.Add(CalculateWidth(column.Caption.Value));
							currentCell.CellValue = new OpenXmlSpreadsheet.CellValue(column.Caption.Value);
							row.AppendChild(currentCell);
						}
					}
					sheetData.Append(row);
					row = new OpenXmlSpreadsheet.Row();
					for (int i=0;i<columnWidthsList.Count; i++) {
						currentCell = new OpenXmlSpreadsheet.Cell();
						currentCell.DataType =  OpenXmlSpreadsheet.CellValues.String;
						currentCell.StyleIndex = 5;
						row.AppendChild(currentCell);
					}
					sheetData.Append(row);
					//Adding columns and specifeing width
					OpenXmlSpreadsheet.Columns columns = new OpenXmlSpreadsheet.Columns();
					uint j = 1;
					foreach (var w in columnWidthsList) {
						columns.Append(CreateColumnData(j, w));
						j++;
					}
					worksheet.Append(columns);
					//--
					worksheet.Append(sheetData);
 
					workbookStylesPart.Stylesheet = CreateStyleSheet();
					worksheetPart.Worksheet = worksheet;
					spreadsheetDocument.Close();
 
					stream.Seek(0, SeekOrigin.Begin);
					byte[] dataArray = stream.ToArray();
 
					Page.Response.BinaryWrite(dataArray);
					Page.Response.End();
				}
			}
			return true;
		}

 

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