Добрый день!

Может у кого-то есть решение следующего кейса.

 

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

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

При отмене удаления - уведомления пользователя об отмене и запись остается в системе.

Какие есть варианты реализации? 

Нравится

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

Навскидку: 

1. В объекте добавить Boolean поле - отметка на удаление

2. На событие в объекте Before deleting record проверять установленный факт подтверждения. Если его нет, то ставить отметку на удаление, а самое удаление отменять

3. Каким-то образом (скорее всего, отдельный раздел "Подтверждения удаления") формировать запись для визирования руководителю

4. После установки визирования снова удалять запись. Тут уже факт подтверждения есть, потому запись можно удалить в событии Before deleting record

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

 

Можно и более высокоуровнево, скрыть в разделах и деталях (можно через базовую страницу) кнопку удаления и вместо неё добавить кнопку запуска БП, который будет до реального удаления скрывать запись от нажавшего (если администрируется по записям), задавать вопрос кому нужно, а затем действительно удалять.

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

Добрый день!

В конструкторе есть элемент "Выполнить действия процесса". А где можно почитать что там за действия такие и как их можно использовать?

Может есть действие, что процесс обновли страницу после расчетов на детали или самой страницы?)

Нравится

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

Почитать можно тут.

 

Действие процесса — это схема с названием ...UserTask (иногда для сложных часть кода вынесена во вспомогательную схему ...UserTaskPartial), где есть основная функция на C#, запускаемая с параметрами, передаваемыми в действие извне и могут быть вспомогательные функции, которые она вызывает. Ещё у действия могут быть страницы для настройки их свойств в дизайнере БП.

 

Пример несложного действия — ChangeDataUserTask (элемент изменения данных). Так выглядит в дизайнере:

Свои тоже можно создавать:

Посмотреть все доступные действия можно в выпадающем списка при создании элемента БП или в конфигурации, отфильтровав схемы быстрым фильтром по полю в реестре «Название менеджера = ProcessUserTaskSchemaManager».

 

Такого, как Вы хотите, видимо, нет. Действие «Обновить запись в реестре», похоже, осталось от интерфейса 5.Х и в 7.Х не сработает. Можно сделать своё и взаимодействовать с нужной страницей по ClientMessageBridge.

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

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

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

Как\где поменять иконки кастомно или кодом?Изображение удалено.

Нравится

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

Если нажать правой кнопкой на иконке и посмотреть в исходниках веб-страницы, видно, что она загружается из EntityConnectionLinksResourceUtilities. Там кода почти нет, зато все эти картинки в дереве справа: ContactExistIcon, AccountExistIcon и др., а для неизвестных — цепь в DefaultIcon. 

 

А логика подстановки в зависимости от названия колонки реализована в EntityConnectionLinksUtilities (и аналогичными по смыслу в EntityConnectionLinksPanelItemUtilities) функциями:

/**
 * Returns menu of connections type buttons.
 * @protected
 * @param {Object} column Connection column.
 * @return {Terrasoft.BaseViewModel} View model menu item.
 */
generateRelationMenuItemConfig: function(column) {
	var imageConfig = this.getRelationImageConfig(column.name);
	var config = {
		"click": {"bindTo": "onRelationMenuItemClick"},
		"caption": column.caption,
		"imageConfig": imageConfig,
		"tag": column.name,
		"visible": {
			"bindTo": column.name,
			"bindConfig": {
	"converter": "isEmptyColumnValue"
}
		},
		"markerValue": column.caption
	};
	return config;
},
 
...
/**
 * Returns object config with button icon parameters.
 * @param {String} columnName Column name.
 * @return {Object}
 */
getRelationImageConfig: function(columnName) {
	var resourceName = columnName + "ExistIcon";
	var image = EntityConnectionLinksResourceUtilities.resources.localizableImages[resourceName] ||
		EntityConnectionLinksResourceUtilities.resources.localizableImages.DefaultIcon;
	return image;
},

То есть если для нового раздела колонка и иконка одна и та же и дополнительных условий проверять не требуется, можно без изменений в коде, только добавить в EntityConnectionLinksResourceUtilities новую картинку с названием название_раздела + ExistIcon, желательно в том же размере и формате.

 

PS: уже была такая тема.

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

т.е надо заместить схему? Что-то слышал, что уже нельзя замещать какие-то схемы?

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

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

Доброго дня, коллеги! Есть два вопроса:

 

  1. Возникла такая потребность, что в справочнике необходимо отобразить изображение и как его правильно загрузить в элемент справочника? 
  2. Как мне реализовать связь один к одному и один ко многим в справочниках? Мне необходимо вытягивать id-поле из одного справочника и присваивать его в другом. Есть ли какой-то способ?

 

Нравится

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

Добрый день. По первому пункту такое реализовано в справочнике "Приоритеты обращений" CasePriority (есть в продукте Service). Там можно провалиться в запись справочника и загрузить картинку.

Общий порядок действий примерно таков:

1) создать объект. назовем его BCActivityColor. Наследуем его от базового справочника и добавляем колонку BCImage (Ссылка на изображение).

Не забываем в настройках объекта установить "Изображение" - нашу колонку. запомним UID объекта

2) Создадим для справочника страницу редактирования (я взял коробочную CasePriorityLookupEditPageV2 и выкинул лишнее).  Реализуем там загрузку картинок.

страницу наследуем от Базовая страница справочника ( UIv2 ). пример: CasePriorityLookupEditPageV2

запомним UID странички

3) зарегистрируем нашу страницу редактирования для объекта (sql). 

Привяжем BCActivityColor_SysModuleEntity (указывается UId объекта который создали в п.1) и BCActivityColor_SysModuleEdit (указывается UId схемы странички которую создали в п.2)

не забыть перезайти в почистить кэш.

Пример регистрации страницы справочника CaseCasePriority_SysModuleEdit и CaseCasePriority_SysModuleEntity

4) после заполнения справочника не забыть привязать SysImage и значения нашего нового справочника.

Добрый день. По первому пункту такое реализовано в справочнике "Приоритеты обращений" CasePriority (есть в продукте Service). Там можно провалиться в запись справочника и загрузить картинку.

Общий порядок действий примерно таков:

1) создать объект. назовем его BCActivityColor. Наследуем его от базового справочника и добавляем колонку BCImage (Ссылка на изображение).

Не забываем в настройках объекта установить "Изображение" - нашу колонку. запомним UID объекта

2) Создадим для справочника страницу редактирования (я взял коробочную CasePriorityLookupEditPageV2 и выкинул лишнее).  Реализуем там загрузку картинок.

страницу наследуем от Базовая страница справочника ( UIv2 ). пример: CasePriorityLookupEditPageV2

запомним UID странички

3) зарегистрируем нашу страницу редактирования для объекта (sql). 

Привяжем BCActivityColor_SysModuleEntity (указывается UId объекта который создали в п.1) и BCActivityColor_SysModuleEdit (указывается UId схемы странички которую создали в п.2)

не забыть перезайти в почистить кэш.

Пример регистрации страницы справочника CaseCasePriority_SysModuleEdit и CaseCasePriority_SysModuleEntity

4) после заполнения справочника не забыть привязать SysImage и значения нашего нового справочника.

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

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

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

 

Заранее благодарю за ваши ответы.

Нравится

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

Мария, этот механизм реализован во многих схемах. Для плитки активности интерфейс описан в схеме BaseDashboardItemViewConfig, а логика — в ActivityDashboardItemViewModel и её родителях EntityDashboardItemViewModel и BaseDashboardItemViewModel. В них можно увидеть кнопку «Завершить» (Execute) и её логику заголовка, видимости и нажатия. А сами названия этих схем прописаны в схеме SectionActionsDashboard в пакете ActionsDashboard в функции:

/**
 * @inheritdoc Terrasoft.BaseActionsDashboard#initDashboardConfig
 * @override
 */
initDashboardConfig: function() {
	this.callParent(arguments);
	const dashboardConfig = this.get("DashboardConfig");
	const processItemsConfig = {
		"VwProcessDashboard": {
			masterColumnName: "Id",
			referenceColumnName: "EntityId",
			viewModelClassName: "Terrasoft.ProcessDashboardItemViewModel",
			viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"
		}
	};
	const activityItemsConfig = {
		"Activity": {
			viewModelClassName: "Terrasoft.ActivityDashboardItemViewModel",
			viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"
		}
	};
	const approvalItemsConfig = this._getApprovalItemsConfig();
	const extendedConfig = this.values.dashboardConfig || {};
	Ext.merge(dashboardConfig, processItemsConfig);
	Ext.merge(dashboardConfig, activityItemsConfig);
	Ext.merge(dashboardConfig, extendedConfig);
	Ext.merge(dashboardConfig, approvalItemsConfig);
	this.set("DashboardConfig", dashboardConfig);
},
 
/**
 * Returns approval items config.
 * @private
 * @return {Object}
 */
_getApprovalItemsConfig: function() {
	const config = {};
	const approvalSchemaName = this.get("ApprovalSchemaName");
	if (approvalSchemaName) {
		config[approvalSchemaName] = {
			masterColumnName: "Id",
			referenceColumnName: this.get("ApprovalReferenceColumnName"),
			viewModelClassName: "Terrasoft.ApprovalDashboardItemViewModel",
			viewConfigClassName: "Terrasoft.ApprovalDashboardItemViewConfig"
		};
	}
	return config;
},

Соответственно, Вам надо будет делать свои схемы-наследники этих, добавлять там кнопку и заместить SectionActionsDashboard на версию с их упоминанием. Для примера, для виз в схемах ApprovalDashboardItemViewModel и ApprovalDashboardItemViewConfig сделана своя логика с несколькими кнопками, а те схемы унаследованы от тех же EntityDashboardItemViewModel и BaseDashboardItemViewConfig.

 

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

Почему не опубликовали публичный образ, что мешает сделать и опубликовать соответствующий docker-compose.yml файл? 

Нравится

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

Здравствуйте, Богдан!

 

Docker мы поддерживаем только для .NET Core приложения.

Задача создания (и публикации) образов при сборке .NET Core приложения — в roadmap разработки системы.

 

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

 

Файл docker-compose.yaml делаться не будет, будет только 1 поставка через helm v 3.0.

 

helm хорошо, но не у всех есть k8s. 

Все равно людям придется писать docker-compose.yaml

Отказаться от  docker-compose в пользу helm решено по причине необходимости отказоустойчивости.

 

PS: Планируется публикация  helm v 3.0 пакета для продуктов на платформе .NET Core в сентябре-ноябре.

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

Довольно простая задача - прочитать параметр БП который содержит ID или текст. При следующем коде в Задание-сценарий:

Guid activityId = Get("Activity11");

String activity1 = Get("ActivityGuid");

 

return true;

Выдает всегда ошибку:  

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

   в Terrasoft.Common.ReflectionUtilities.GetPropertyValueByPath(Object source, String propertyPath)

   в Terrasoft.Core.Process.ProcessModel.Get[T](String propertyPath)

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

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

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

 

В чем может быть проблема ? 

Нравится

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

Добрый день.

 

Какую версию срм используете?

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

7.14.1.935

Александр Че,

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

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

Спасибо,

но как я понял из того же поста:

"Начиная с версии 7.12.3 все создаваемые бизнес-процессы в bpm’online являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы get и set."

В расширенных настройках только поле с Именем есть теперь.



Есть еще идеи ? 

Александр Че,

Служебное слово 'string' пишется с маленькой буквы, а у Вас с большой. Попробуйте написать правильно, вот так:

string activity1 = Get<string>("ActivityGuid");

И ещё меня смущает названия Ваших параметров: в строку пытаетесь получить параметр с названием 'ActivityGuid'. Вы точно правильно параметры приводите к соответствующим типам?

 

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

Начиная с версии 7.12.3 все создаваемые бизнес-процессы в bpm’online являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы get и set

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

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

Пересобрал БП.  И добавил другие параметры:

И все равно та же ошибка с GET ..

Скриншоты БП ниже



А после изменения кода в скрипте компилировали процесс или только сохраняли?

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

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

 

На 7.16.1 аналогичное работает нормально:

String ProcessSchemaParameter1 = Get<String>("ProcessSchemaParameter1");
Set("ProcessSchemaParameter2", ProcessSchemaParameter1);
return true;

Но тут механизм параметров дорабатывался, добавили направление.

Сомневаюсь, что в 7.14.1 просто стандартное обращение к параметру не работало. Может, у Вас сначала было неправильно с типом или названием параметра, и это закешировалось?

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

 в 7.14 еще нет направления, и параметры указываются в коде через их имена, которые указаны в параметрах процесса. 

Я тоже думал что закэшированно, и потому поднял быстро дефолтный Service и создал БП в пакете Custom и компилировал еще раз пакет уже в конфигурации, но ошибка так и не уходит.. такое ощущение что библиотеки не хватает.

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

 

Возможно, Ваш вопрос решит обновление.

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

Коллеги подскажите как правильно, настроить git для разработки в creatio?

Нравится

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

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

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

Стандартно интеграции с Git нет, только с SVN. Если выгружать в файловую систему, можно к папке на диске подключить любую систему контроля версий, но с сайтом это автоматически не интегрируется.

Спасибо за ответы. Но я хотел спросить у кого настроен Git, у кого есть практика использования git настроили только на папку PKG или как то по другому? Мы настроили на весь проект, но при работе почему то модифицируется те файлы которые мы не трогали например DLL. По этому я и спросил как именно настраивали git. 

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

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

Добый день, Коллеги!

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

Я пробовал генерировать исходный код, потом компилировать и обновлять структуру БД.

Я попробовал удалить пакет и с 0 поставить, но в этой схеме всеравно кода нет...

Нравится

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

Здравствуйте! Сталкивался с такой проблемой, только со схемой "Исходный код", пакет устанавливался без ошибок, а новых методов не добавлялось. Это связано с тем, что схема которая обновляется, в бд помечена как измененная, таблица SysSchema  колонка IsChanged = 1. Проверте свою схему и измените значение на IsChanged = 0  если стоит 1. По крайне мере у меня так было.

Здравствуйте! Сталкивался с такой проблемой, только со схемой "Исходный код", пакет устанавливался без ошибок, а новых методов не добавлялось. Это связано с тем, что схема которая обновляется, в бд помечена как измененная, таблица SysSchema  колонка IsChanged = 1. Проверте свою схему и измените значение на IsChanged = 0  если стоит 1. По крайне мере у меня так было.

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

Да, так и есть. Спасибо

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

Добрый день, имеется развернутый локально Creatio. Хочу добавить лэндинг(чтобы можно было к примеру перейти на localhost/landing/index.aspx) с формой, у которой есть поле phone и данные введенные в поле будут попадать в контакты -> мобильный телефон уже к имеющемуся контакту.

Что уже сделал?

Сейчас контакт выглядит следующим образом

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

Как описано в документации добавил лэндинг. Сжато он выглядит так:

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

После чего в папке ../0/Nui/ создал папку Landing с файлом index.aspx в котором лежит следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!--ШАГ 2-->
    <!--Эту часть необходимо скопировать из поля ШАГ 2 страницы редактирования лендинга-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/track-cookies.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/create-object.js"></script>
    <script>
 
    var config = {
        fields: {
            "Subject": "#subject-field",
            "Email": "#email-field",
            "Name": "#name-field",
            "MobilePhone": "#phone-field",
        },
        landingId: "54a57d16-e7b6-4c7d-9c38-237cfcf6512d",
        serviceUrl: "http://localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData",
        redirectUrl: "yandex.ru"
    };
 
    function createObject() {
        landing.createObjectFromLanding(config)
    }
    </script>
    <!--ШАГ 2-->
</head>
<body>
<h1>Landing web-page</h1>
<div>
    <h2>Case form</h2>
    <form action="localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData" method="POST" class="mainForm" name="landingForm" onSubmit="createObject(); return false">
        Subject:<br>
        <input type="text" name="subject" id="subject-field"><br>
        Email:<br>
        <input type="text" name="Email" id="email-field"><br>
        Name:<br>
        <input type="text" name="Name" id="name-field"><br>
        Phone:<br>
        <input type="text" name="Phone" id="phone-field"><br><br>
        <input type="submit" value="Submit">
        </font>
    </form>
</div>
</body>
</html>

Если я правильно понял для того чтобы POST запрос прошел корректно должен отработать файл GeneratedObjectWebFormService.svc. Нужно ли его создавать по документации или он является дефолтным? При попытки отправки запроса возникает 403 ошибка. Как сделать это рабочим и какие ошибки я совершил?

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

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

Нравится

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

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

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

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

Нет, дело не в этом. Посмотрите второй абзац прошлого ответа.

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

исправил без /0/ теперь следующую проблему не могу побороть 

политика CORS дефолтная и выглядит так:

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

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