Вопрос

Коллеги, возможно ли как-то переименовать пакет?

Нравится

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

таблица SysPackage

Я делал запросом в БД

таблица SysPackage

Дмитрий Степанов пишет:

таблица SysPackage

Благодарю, всё получилось. 

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

Доброе время суток !



Вопрос:

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



Задача:

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

Это нужно сделать в бизнес-процессе, т.е отобразить пользователю страницу для ввода.



Клиентской схемы я так понимаю нет у Автогенерируемой страницы, да ?



Примечание:

(использовать Автогенерируемую страницу не обязательно)

Нравится

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

Ну не используй автогенерируемую страничку используй стандартный элемент БП "Открыть страницу редактирования".

Ну не используй автогенерируемую страничку используй стандартный элемент БП "Открыть страницу редактирования".

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

использовал элемент [Преднастроенная страница], там так можно

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

Коллеги, всем доброго дня!

Можно ли проводить настройку форм на портале силами аналитика? Если можно то как?

Видел что имеется 2 вида портальных лицензий: SELF-SERVICE PORTAL и  CUSTOMER PORTAL. У CUSTOMER PORTAL заявлена возможность создавать до 3 кастомных разделов на портале. 

Где можно почитать про это? Как это реализовывается? Нужна разработка или достаточно настройки аналитиком?

Нравится

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

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

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

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

мастер не предоставляет практически ничего. Огромный минус для платформы, которая называет себя low cod

Шувалов Николай Юрьевич,

Значит нужно программировать, унаследовать и переопределить страничку обращения для портала или создать свою по аналогии. Аналогично с разделом. Для портала было огранчено количество объектов доступ к которым можно дать через портал (раньше было не больше 40) Подробности лучше запросить у тех поддержки!

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

Добрый день. Как правильно добавлять в BPM ссылку на внешнюю службу asmx?

Обычно в VS необходимо добавить ссылку и ввести url службы, но при вызове службы Terrasoft.Configuration.Dev.НазваниеСлужбы приложение не компилируется.

ERROR: The type or namespace name 'Dev' does not exist in the namespace 'Terrasoft.Configuration' (are you missing an assembly reference?) FILE: ICLObject.ICL_Entity.cs LINE: 27

Нравится

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

Там где параметры БП, есть вкладка методы в самом вверху этой вкладки есть Using, возле нее жми + и добавляй свой assembly reference.

Так же посмотри на статью Вызов веб-сервисов из бизнес-процессов

 

 

 

Там где параметры БП, есть вкладка методы в самом вверху этой вкладки есть Using, возле нее жми + и добавляй свой assembly reference.

Так же посмотри на статью Вызов веб-сервисов из бизнес-процессов

 

 

 

А если не из БП вызывать,а из событийного процесса объекта?

То есть я не хочу указывать сборку в using, а только url сервиса

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

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

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

Сервис типа soap, по нему не нашел документации.

Если у сервиса есть возможность обратиться к нему по URL, то используйте соответствующий элемент БП.

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

Здравствуйте, коллеги.

Появилась необходимость добавить смайлики к модулю HtmlEditModule (используется для написания email внутри bpm'online, а так же в различных текстовых полях вроде Примечаний). Насколько удалось докопаться, данный модуль реализован с помощью CKEditor, на оф.сайте которого предлагается уже разработанный аддон Smiley. В принципе, понятно каким образом можно его добавить для системы, развёрнутой on-site, поскольку необходимо всего лишь поместить соответствующие файлы с оф.сайта в папку CKEditor ([директория установки экземпляра bpm'online]\Terrasoft.WebApp\Resources\ui\CKEditor) и произвести необходимые замещения в модулях системы. Но возникает вопрос, каким образом этот аддон можно установить на системе, развёрнутой в облаке? Terrasoft предоставляет подобный сервис или же для облачных систем такая кастомизация в принципе невозможна?

И, раз уж на то пошло, если у кого-нибудь был опыт работы с аддонами CKEditor, не могли бы вы поделиться советами по данному вопросу?

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

Нравится

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

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

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

Если есть тестовый локальный сайт, можно протестировать на нём, а потом передать в поддержку готовые файлы и инструкцию, куда их класть.

Но, например, добавление шрифтов в CKEditor делается без доступа на сервер, чисто в конфигурации. Возможно, и аддон Smiley можно добавить похожим образом.

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

Была создана кнопка (на основе кнопки "добавить заказ") в продажах "Добавить проект". Все работатет отлично, только при создании проекта не проставляется номер проекта. Номер с автоникриментом проставляется на основе статьи https://academy.terrasoft.ru/documents/technic-sdk/7-12/primer-ispolzov…, но там он только при создании проекта из меню и копировании его там, а как сделать что бы при создании проекта через бизнес-процесс проставлялся этот номер?

Нравится

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

Можно как вариант так

В Этой же статье (по ссылке) есть ниже пример "Алгоритм реализации кейса на стороне сервера"  получение номера в событийного подпроцессе.

В этого случая не важно как будет создан объект через клиента или БП, он получит номер в любом случае. Если что то неясно опишите более подробно что вам нужно.

согласно этому коду - номер генерится при наступлении одного из событий "добавление" или "копировании", но процесс создает проект через элемент "добавить данные" а потом открывается на редактирование и при этом не isAddMode() не isCopyMode() не срабатывает и указывают на false, не давая пройти if для генерации номера

"

Прочитайте внимательно мой первый пост.

if (this.isAddMode() || this.isCopyMode()) 
- это относится к варианту когда нумерация сделана
 на клиенте (тобишь при нажатии кнопки сохранить копировать в карточке или реестре)

 Вам нужно посмотреть вторую часть статьи (Листать вниз пока не увидите раздел "Алгоритм реализации кейса на стороне сервера")

 

Те формирование номера можно делать в карточке (на клиенте) при первом сохранении  (this.isAddMode() || this.isCopyMode()) или в событийном БП объекта (При любом создании нового экземпляра объекта) Но не одновременно - это избыточно и не нужно!!!

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

1) сделать 2 сист настройки

2) сделать событийный процесс объекта

3) Опубликуйте 

4) Тестируй

В примере в событийном процессе объекта вы настраиваетесь на событие добавление записи! Она наступает при любом добавлении записи в объект. через механизмы ESQ в том числе через элемент БП добавить данные (как у вас в принскрине все должно быть нормально)!!!!!!

 

Если не получится или не поймещ что делать пиши что сделал по пунктам с принскринами.

 

Прошу прощения, не сообразил сразу, теперь все понял, спасибо я даже как-то не подумал сразу что это сработает

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

 не работает почему-то

 

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

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

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

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

 системные настройки не менял, оставил те что были при клиенском коле

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

 есть один большей минус этого способа по причине него он не подходит "

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

"

1) Напишите как называется ваш проект и какие сис. настройки вы сделали (их имена). Имя системных настроек жестко привязано к имени объекта.

2) В примере для хранения номера  используется поле Code объекта. Если у тебя поле для номера называется по другому UsrNumber в БП должно быть

string.IsNullOrEmpty(Entity.GetTypedColumnValue<string>("UsrNumber "))

 

Entity.SetColumnValue("UsrNumber ", UserTask1.ResultCode);

См статью для понимания где произвести замены

3) В сам объект проект ты добавил событийный процесс в котором перед добавлением записи сделали все по инструкции? Обращаю внимание что все объекты событийного  подпроцесса должны находится в контейнере событийный субпроцесс (Это элемент БП внизу списка найдеш!) На картинке не видно что у тебя подпроцесс в событийном контейнере

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

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

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

Можно как вариант так

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

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

Появился вопрос насчёт разделения прочитанных и непрочитанных email сообщений в соответствующем разделе коммуникационной панели. Возможно ли как-то визуально разделять email по прочитанности в этом списке? Подтягивается ли этот параметр каждого письма через интеграцию с почтой или в контексте bpm'online возможно разделение только на обработанные и необработанные письма?

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

Нравится

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

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

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

Евгений, добрый день!

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

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

Видимо так. Только как это сделать? Был бы рабочий пример, боюсь что собственными силами не осилю.

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

Спасибо за ссылку, может пригодится.

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

Добрый день!

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

При выборе строки в гриде модального окна Распределение продуктов устанавливать фокус в поле Количество, выделять значение, после изменения по нажатию кнопки Enter сохранять и, при необходимости, переходить на следующую строку.

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

Окно вызывается в графике оплат и поставок на вкладке Паспорт в Заказе.

Нравится

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

Борис Леонов,

Немного лень экспериментировать, но я бы в функции onGridClick подменил target. а-ля:

onGridClick: function(event, target) {
	var newDiv = target.parentElement.children[5]; //берём div нужного элемента. 5 - номер колонки
	target = newDiv.children[0]; //проваливаемся в span
	.....
}

 

Как минимум лепить какой-нибудь ConfigurationGridV2.

В нем переопределять onGridClick (чтобы по клику в фокус попадало только поле количество), переопределять keyMap (там сейчас Tab классно работает, даже ряд создает. осталось всё это перенести на enter), ну и вызывать AddNewRow на клиенте по enter-ивенту из грида.

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

я знал что вы ответите :)

а можно пример onGridClick с назначением фокуса конкретному полю?

Борис Леонов,

Немного лень экспериментировать, но я бы в функции onGridClick подменил target. а-ля:

onGridClick: function(event, target) {
	var newDiv = target.parentElement.children[5]; //берём div нужного элемента. 5 - номер колонки
	target = newDiv.children[0]; //проваливаемся в span
	.....
}

 

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

Идея понятна, большое спасибо!

 

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

Реализовала такой запрос:

var esqKit = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Kit");

                EntitySchemaQuery kitsCountSubQuery;

                esqKit.AddColumn("Id", AggregationTypeStrict.Count, out kitsCountSubQuery);

                esqKit.Filters.Add(esqKit.CreateFilterWithParameters(FilterComparisonType.Equal, "BTContactPatient",

                    patientId));

                EntityCollection kitsCollection = esqKit.GetEntityCollection(userConnection);

По факту выполнения на стороне sql-сервера формируется корректный sql-запрос и возвращает правильный результат, но я не понимаю, каким образом мне получить результат этого запроса.

Как называется эта колонка и как правильно обратиться к kitsCountSubQuery, чтобы получить результат запроса?

Нравится

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

Алла, нужно запомнить объект-результат AddColumn в переменную, а потом посмотреть её Name. Как тут:

var gridPageEntitySchemaQuery = (EntitySchemaQuery)GridPageEntitySchemaQuery;
var monthColumn = gridPageEntitySchemaQuery.AddColumn(gridPageEntitySchemaQuery.CreateMonthFunction(columnName));
var yearColumn = gridPageEntitySchemaQuery.AddColumn(gridPageEntitySchemaQuery.CreateYearFunction(columnName));
var aggregationValueColumn = gridPageEntitySchemaQuery.AddColumn(
	gridPageEntitySchemaQuery.CreateAggregationFunction(AggregationTypeStrict.Count,
	gridPageEntitySchemaQuery.RootSchema.PrimaryColumn.Name));
EntitySchemaQueryFilterCollection filters = gridPageEntitySchemaQuery.Filters;
filters.Add(gridPageEntitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.IsNotNull,columnName));
var entityCollection = gridPageEntitySchemaQuery.GetEntityCollection(Page.UserConnection);
string dateName = string.Empty;
int month = 0;
foreach (var item in entityCollection) {
	var aggregationValue = item.GetTypedColumnValue&lt;double&gt;(aggregationValueColumn.Name);
	month = item.GetTypedColumnValue&lt;int&gt;(monthColumn.Name);
	dateName =  item.GetTypedColumnValue&lt;string&gt;(yearColumn.Name)+ "-" +(month &lt; 10 ? "0" + month.ToString() : month.ToString());
	series.Add(dateName, aggregationValue);
}

 

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

Спасибо за подсказку - все получилось.

Если интересно, то данная колонка называется просто 'Column'.

А если вторую сделать?

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

Добрый день!

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

Нравится

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

Алла Савельева,

Было в сервисе в CasePage (Case)

Сергей,

а вы код метода смотрели? Просто сделайте по аналогии там вроде есть все что вам нужно.

 

 

 

Сергей,

Есть 2 вопроса:

1. Что такое группа ответственных - это группа пользователей? Объясните на примере.

2. В какой схеме реализована эта логика (onPrepareOwner) и какие именно вопросы есть по её реализации? 

Алла Савельева,

Было в сервисе в CasePage (Case)

Сергей,

а вы код метода смотрели? Просто сделайте по аналогии там вроде есть все что вам нужно.

 

 

 

Алла Савельева,

Группа ответственных - это группа пользователей (подразделение в оргструктуре). В ней находятся пользователи и они становятся ответственными.



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

Да, метод смотрел, но я так понимаю там не он один нужен. Ну и сама суть - метод же именно то что мне нужно, но при копировании его просто так - чуда не происходит

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

Быстров Сергей,

Есть ли в консоли какие-то ошибки при попытке проверить эту функциональность?

И приведите, пожалуйста, пример своего кода.

Алла Савельева,

Пытаюсь действовать по примеру:

"attributes": {
// Колонка модели представления.
   "Owner": {
// Тип данных атрибута.
      "dataValueType": Terrasoft.DataValueType.LOOKUP,
// Конфигурационный объект атрибута типа LOOKUP.
      "lookupListConfig": {
// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
         "filters": [
            function() {
               var group = this.get("Group");
               var filterGroup = Ext.create("Terrasoft.FilterGroup");
// Добавление фильтра "IsUser" в результирующую коллекцию фильтров.
// Выбирает все записи из корневой схемы Contact, к которой присоединена
// колонка Id из схемы SysAdminUnit, для которых Id не равен null.
               filterGroup.add("IsUser",
               Terrasoft.createColumnIsNotNullFilter("[SysAdminUnit:Contact].Id"));
// Добавление фильтра "InGroup" в результирующую коллекцию фильтров.
// Выбирает все записи из корневой схемы Contact, к которой присоединена
// колонка из схемы SysAdminUnitRole.
               filterGroup.add("InGroup",
               Terrasoft.createColumnFilterWithParameter(
               Terrasoft.ComparisonType.EQUAL,
               "[SysAdminUnitInRole:SysAdminUnit:Contact].SysAdminUnitRoleID",
               group));
               return filterGroup;
           }
        ]
   }
}

Я уверен на 99% что так делать нельзя, но уже не представляю как связать SysAdminUnit между собой, чтобы происходила фильтрация. Неужели никто с такой задачей не сталкивался?

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

"Owner": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	// Конфигурационный объект атрибута типа LOOKUP.
	"lookupListConfig": {
		// Данный фильтр отображает ответственных из группы
		"filters": [
			function() {
				var filterGroup = Ext.create("Terrasoft.FilterGroup");
				if (this.get("Group") != null) {
					filterGroup.add("IsActive", Terrasoft.createColumnFilterWithParameter(3, "[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole.Id", this.get("Group").value));				
					return filterGroup;
				}
			}
		]
	}
}

Вышло такое. Оно работает. Может кому понадобится. Спасибо https://community.terrasoft.ru/questions/filtr-pola-kontakt-po-funkcion…;

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