Здравствуйте. Был составлен бизнес процесс визирование документа по аналогии с визированием заказа. Добавлен объект и составлены два БП (как и у оригинала). Однако, сам БП "визирование документа" в библиотеке не присутствует, хотя он есть в конфигурации. Как его туда добавить и нужно ли вообще это делать? И как добавить этот процесс в кнопку "действие", чтобы визирование работало?
Благодарю

Нравится

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

Добрый день. Обратите внимание,что в OrderPageV2 еще есть следующий код

	getActions: function() {
						var actionMenuItems = this.callParent(arguments);
						actionMenuItems.add("SendToVisaSeparator", this.getActionsMenuItem({
							Type: "Terrasoft.MenuSeparator",
							Caption: ""
						}));
						actionMenuItems.add("SendToVisa", this.getActionsMenuItem({
							"Caption": VisaHelper.resources.localizableStrings.SendToVisaCaption,
							"Tag": VisaHelper.SendToVisaMenuItem.methodName,
							"Enabled": {"bindTo": "canEntityBeOperated"}
						}));
						return actionMenuItems;
					},
 
					/**
					 * Действие "Отправить на визирование"
					 */
					sendToVisa: VisaHelper.SendToVisaMethod,

а также в OrderSectionV2

define("OrderSectionV2", ["ProductSalesUtils", "BaseFiltersGenerateModule", "VisaHelper", "ReportUtilities",
	"css!VisaHelper"], function(ProductSalesUtils, BaseFiltersGenerateModule, VisaHelper) {
	return {
		entitySchemaName: "Order",
		attributes: {
			/**
			 * Заголовок пункта меню "Отправить на визирование"
			 */
			SendToVisaMenuItemCaption: {
				dataValueType: Terrasoft.DataValueType.TEXT,
				value: VisaHelper.resources.localizableStrings.SendToVisaCaption
			}
		},
		methods: {
 
			/**
			 * Действие "Отправить на визирование"
			 */
			sendToVisa: VisaHelper.SendToVisaMethod,
 
			/**
			 * Возвращает коллекцию действий раздела в режиме отображения реестра
			 * @protected
			 * @overridden
			 * @return {Terrasoft.BaseViewModelCollection} Возвращает коллекцию действий раздела в режиме
			 * отображения реестра
			 */
			getSectionActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getActionsMenuItem({
					Type: "Terrasoft.MenuSeparator",
					Caption: ""
				}));
				actionMenuItems.addItem(this.getActionsMenuItem({
					"Caption": {bindTo: "SendToVisaMenuItemCaption"},
					"Click": {bindTo: "sendToVisa"},
					"Enabled": {bindTo: "isSingleSelected"}
				}));
				return actionMenuItems;
			},
// продолжение модуля....

Спасибо нашёл их. Только как заменить DocumentSectionV2. Он находится в папке Document и при попытке сохранения выдаёт вот такую надпись "Для заданного локального пути не указан путь к хранилищу".
Сохранив ваш код в схеме DocumentPageV2 страницу раздела перестал отображать

Добрый день!

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

"Зарицкий Олег Васильевич" написал:

"Пащенко Александр Сергеевич" написал:

Спасибо. Сейчас попробую сделать

Здравствуйте. Создал замещающую схему и добавил указанные коды. Однако, раздел перестал отображаться. Посмотрите пожалуйста может где-то ошибка есть?

define("DocumentSectionV2", ["VisaHelper", "BaseFiltersGenerateModule",	"DocumentSectionGridRowViewModel"],
	function(VisaHelper, BaseFiltersGenerateModule) {
		return {
			entitySchemaName: "Document",
			methods: {
				/**
				 * Устанавливает значение идентификатора контекстной справки для раздела "Документы"
				 * @overridden
				 */
				initContextHelp: function() {
					this.set("ContextHelpId", 1005);
					this.callParent(arguments);
				},
			attributes: {
                        /**
                         * Заголовок пункта меню "Отправить на визирование"
                         */
                        SendToVisaMenuItemCaption: {
                                dataValueType: Terrasoft.DataValueType.TEXT,
                                value: VisaHelper.resources.localizableStrings.SendToVisaCaption
                        }
                },
                methods: {
                        
                        /**
                         * Действие "Отправить на визирование"
                         */
                        sendToVisa: VisaHelper.SendToVisaMethod,

                        /**
                         * Возвращает коллекцию действий раздела в режиме отображения реестра
                         * @protected
                         * @overridden
                         * @return {Terrasoft.BaseViewModelCollection} Возвращает коллекцию действий раздела в режиме
                         * отображения реестра
                         */
                        getSectionActions: function() {
                                var actionMenuItems = this.callParent(arguments);
                                actionMenuItems.addItem(this.getActionsMenuItem({
                                        Type: "Terrasoft.MenuSeparator",
                                        Caption: ""
                                }));
                                actionMenuItems.addItem(this.getActionsMenuItem({
                                        "Caption": {bindTo: "SendToVisaMenuItemCaption"},
                                        "Click": {bindTo: "sendToVisa"},
                                        "Enabled": {bindTo: "isSingleSelected"}
                                }));
                                return actionMenuItems;
                        },

				/**
				 * @overridden
				 * @inheritDoc BaseSectionV2#initFixedFiltersConfig
				 */
				initFixedFiltersConfig: function() {
					var fixedFilterConfig = {
						entitySchema: this.entitySchema,
						filters: [
							{
								name: "PeriodFilter",
								caption: this.get("Resources.Strings.PeriodFilterCaption"),
								dataValueType: Terrasoft.DataValueType.DATE,
								columnName: "Date",
								startDate: {},
								dueDate: {}
							},
							{
								name: "Owner",
								caption: this.get("Resources.Strings.OwnerFilterCaption"),
								dataValueType: Terrasoft.DataValueType.LOOKUP,
								filter: BaseFiltersGenerateModule.OwnerFilter,
								columnName: "Owner"
							}
						]
					};
					this.set("FixedFilterConfig", fixedFilterConfig);
				},

				/**
				 * @overridden
				 */
				getGridRowViewModelClassName: function() {
					return "Terrasoft.DocumentSectionGridRowViewModel";
				},

				/**
				 * overridden
				 */
				getReportFilters: function() {
					var filters = this.getFilters();
					var recordId = this.get("ActiveRow");
					if (recordId) {
						filters.clear();
						filters.name = "primaryColumnFilter";
						filters.logicalComparisonTypes = Terrasoft.LogicalOperatorType.AND;
						var filter = this.Terrasoft.createColumnInFilterWithParameters(
							this.entitySchema.primaryColumnName, [recordId]);
						filters.addItem(filter);
					}
					return filters;
				},

				/**
				 * overridden
				 */
				prepareResponseCollection: function(collection) {
					this.callParent(arguments);
					var cardPrintMenuItems = this.get("CardPrintMenuItems");
					collection.each(function(item) {
						item.set("CardPrintMenuItems", cardPrintMenuItems);
					}, this);
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "DataGridActiveRowPrintAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"style": Terrasoft.controls.ButtonEnums.style.GREY,
						"caption": {"bindTo": "Resources.Strings.PrintRecordGridRowButtonCaption"},
						"tag": "print",
						"visible": {
							bindTo: "getDataGridActiveRowPrintActionVisible"
						}
					}
				}
			]/**SCHEMA_DIFF*/
		};
	});

У Вас лишняя точка с запятой в предпоследней строке и не хватает одной закрывающей фигурной скобки.
Должно быть так:

//весь ваш код
   ]/**SCHEMA_DIFF*/
                }
            }
        });

"Пащенко Александр Сергеевич" написал:
<

Александр, здравствуйте. Посмотрите пожалуйста вот этот код. Записал отдельную схему представления раздела, с родительским объектом "Раздел контакты". Но и там кнопка визирования не отображается. Скорее всего что-то делаю не так. Буду весьма благодарен за помощь

define("ContactSectionV2", ["VisaHelper", "css!VisaHelper"], function(VisaHelper) {
	return {
		entitySchemaName: "Contact",
		attributes: {
                        /**
                         * Заголовок пункта меню "Отправить на визирование"
                         */
			SendToVisaMenuItemCaption: {
				dataValueType: Terrasoft.DataValueType.TEXT,
				value: VisaHelper.resources.localizableStrings.SendToVisaCaption
			}
		},
		methods: {
                       
                        /**
                         * Действие "Отправить на визирование"
                         */
			sendToVisa: VisaHelper.SendToVisaMethod,

                        /**
                         * Возвращает коллекцию действий раздела в режиме отображения реестра
                         * @protected
                         * @overridden
                         * @return {Terrasoft.BaseViewModelCollection} Возвращает коллекцию действий раздела в режиме
                         * отображения реестра
                         */
			getSectionActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getActionsMenuItem({
					Type: "Terrasoft.MenuSeparator",
					Caption: ""
				}));
				actionMenuItems.addItem(this.getActionsMenuItem({
					"Caption": {bindTo: "SendToVisaMenuItemCaption"},
					"Click": {bindTo: "sendToVisa"},
					"Enabled": {bindTo: "isSingleSelected"}
				}));
				return actionMenuItems;
			}
			}
	};

Дмитрий, вы создали замещающий клиентский модуль или новую схему представления раздела, с родителем "Раздел контакты"?
Вам нужен именно замещающий клиентский модуль

"Пащенко Александр Сергеевич" написал:

Дмитрий, вы создали замещающий клиентский модуль или новую схему представления раздела, с родительским объектом "Раздел контакты"?

Вам нужен именно замещающий клиентский модуль


Да я просто создал новую схему представления раздела. При замещающей схеме нужно копировать всю родительскую схему + дописывать свои доработки?

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

"Ануфриев Дмитрий Юрьевич" написал:

Да я просто создал новую схему представления раздела. При замещающей схеме нужно копировать всю родительскую схему + дописывать свои доработки?

Нет, необходимо указать только следующий обязательный код:
1) Для страницы редактирования:

define('ContactPageV2', ['ContactPageV2Resources', 'GeneralDetails'],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: 'Contact',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {},
		rules: {},
		userCode: {}
	};
});

2) Для страницы раздела:

define("ContactSectionV2", ["GridUtilitiesV2", "GoogleIntegrationUtilities", "RightUtilities",
		"ConfigurationConstants", "GoogleIntegrationUtilitiesV2"],
	function(gridUtilitiesV2, GoogleUtilities, RightUtilities, ConfigurationConstants) {
		return {
			entitySchemaName: "Contact",
			attributes: {},
			messages: {},
			mixins: {},
			methods: {}
		};
	});

"Демьяник Алексей" написал:Нет, необходимо указать только следующий обязательный код:

Возможно, поможете. Добавила все коды выше, но при нажатии на кнопку "Отправить на визирование" возникает ошибка (на скриншоте)

Анастасия,
Трудно определить причину по скриншоту. Напишите письмо в тех.поддержку с детальным описанием.

Показать все комментарии
Технические вопросы
7.x

Здравствуйте. Помогите реализовать один процесс. При положительном или отрицательном состоянии активности должно приходить уведомление автору этой задачи. Решил попробовать при помощи элемента "Страница редактирования", чтобы не создавались новые задачи и не терялась вся информация, которую доработали. Так вот процесс запускается, однако он приходит к тому, кто изменил состояние, т.е. выполнил условие начального сигнала. Подскажите как можно настроить элемент, чтобы уведомления приходили именно автору активности? Может следует воспользоваться другим элементом?
Благодарю.

Нравится

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

Дмитрий,

Задачу можно решить следующим образом:
1. Стартовый сигнал на изменение состояния активности.
2. Чтение данных. Активность. Id = Пункт 1.Id
3. Добавление данных. Уведомление. Заполнить необходимые поля. Поле Кому = Пункт 2. Автор

"Зарицкий Олег Васильевич" написал:

Дмитрий,

Задачу можно решить следующим образом:

1. Стартовый сигнал на изменение состояния активности.

2. Чтение данных. Активность. Id = Пункт 1.Id

3. Добавление данных. Уведомление. Заполнить необходимые поля. Поле Кому = Пункт 2. Автор


Здравствуйте. Не совсем понял последнего (третьего) пункта. Объясните пожалуйста подробнее.
После написания этого процесса будет создана новая задача или останется старая активность?

Добрый день!

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

"Зарицкий Олег Васильевич" написал:

Добрый день!

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

Здравствуйте, Олег. Снова вынужден поднять данный вопрос.
Создал страницу редактирования Активности. Однако, не возможно задать ответственное лицо и время уведомления. Страница просто не редактируемая. С чем это может быть связано? Быть может не правильно идентификаторы прописываю?
Благодарю
[URL=http://radikal.ru/big/e1434526e018474f91b5967e305a35ad][IMG]http://i057…]
[URL=http://radikal.ru/big/705e7efb91594d9f823bf8995e15e2ab][IMG]http://s018…]

"Зарицкий Олег Васильевич" написал:

Дмитрий,

Задачу можно решить следующим образом:

1. Стартовый сигнал на изменение состояния активности.

2. Чтение данных. Активность. Id = Пункт 1.Id

3. Добавление данных. Уведомление. Заполнить необходимые поля. Поле Кому = Пункт 2. Автор

Сделал как вы и написали, но уведомление не приходит. БП проходит все пункты и завершается
[URL=http://radikal.ru/big/29a8000c67a940e9ba2b088910540da1][IMG]http://s019…]

Дмитрий,
Для решения задачи в элементе “Страница редактирования” нет необходимости.
Во вложении пример процесса, который создает уведомление.
usraddremind_1.rar

"Зарицкий Олег Васильевич" написал:

Дмитрий,

Для решения задачи в элементе “Страница редактирования” нет необходимости.

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

usraddremind_1.rar

А есть пример без написания кода? Где участвует простой БП и пример заполнения полей? Потому как настроил цепочку БП завершается успешно, счётчик показывает, но самого уведомления нету открыть не имеется возможности

Значение полей в примере заполнены из справочников. За исключением колонки Время - DateTime.Now - создает уведомление в момент выполнения процесса.
Также следует отметить – в системе есть провайдеры, которые с определенным интервалом считают кол-во уведомлений и отображают в коммуникационной панели. Каждый провайдер настроен на определенный объект.
Т.е. если создавать уведомление для объекта на который не настроен провайдер – уведомление добавится в БД, но в коммуникационной панели будет пустая запись.
Пример реализации провайдера в системе – ActivityNotificationProvider.

"Зарицкий Олег Васильевич" написал:

Значение полей в примере заполнены из справочников. За исключением колонки Время - DateTime.Now - создает уведомление в момент выполнения процесса.

Также следует отметить – в системе есть провайдеры, которые с определенным интервалом считают кол-во уведомлений и отображают в коммуникационной панели. Каждый провайдер настроен на определенный объект.

Т.е. если создавать уведомление для объекта на который не настроен провайдер – уведомление добавится в БД, но в коммуникационной панели будет пустая запись.

Пример реализации провайдера в системе – ActivityNotificationProvider.

Уведомление создаётся для Активности, не для нового объекта. Значит провайдер уже есть в системе.
Основные колонки отображения уведомления это будут текущее время и заголовок активности. Кому приходит это на данный момент "контролёру"

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

Показать все комментарии
visible
действие
Технические вопросы
7.x

Нужно показывать действие по условию.
Сделал действие в карточке:

                getActions: function() {
                    var actionMenuItems = this.callParent(arguments);
                    actionMenuItems.addItem(this.getButtonMenuItem({
                        "Caption": {"bindTo": "Resources.Strings.UsrFormContractCaption"},
                        "Tag": "FormContract",
                        "Visible": {"bindTo": "FormContractVisible"}
                    }));
                    return actionMenuItems;
                },
                FormContractVisible: function(){
                    var contract = this.get("UsrContract");
                    var state = this.get("Status")?this.get("Status").value:false;
                    if(!contract && state == Constants.OrderStatus.formation){
                        return true;
                    }else{
                        return false;
                    }
                }

При режиме карточки всё отрабатывает отлично.
Далее добавил действие в Section.

            getSectionActions: function(){
                var actionMenuItems = this.callParent(arguments);
                actionMenuItems.addItem(this.getButtonMenuItem({
                    "Caption": {"bindTo": "Resources.Strings.UsrFormContractCaption"},
                    "Tag": "FormContract",
                    "Visible": {"bindTo": "FormContractVisible"}
                }));
                return actionMenuItems;
            },
            FormContractVisible: function(){
                var activeRow = this.getActiveRow();
                if(!activeRow) return;
                var Contract = UsrContract || activeRow.values.UsrContract;
                var Status = Status || activeRow.values.Status.value;
                if(!Contract && Status == Constants.OrderStatus.formation){
                    return true;
                }else{
                    return false;
                }
            }

При режиме combined тоже всё стало отрабатывать. Но если в карточке изменить поле, например UsrContract то видимость уже не изменяется. Можно после сохранения карточки, например в функции onCardModuleResponse переинициализировать действия, но как это сделать не нашёл.
Подскажите как правильно реализовать задачу.

Версия 7.7

Нравится

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

Тут есть две проблемы:

1. В activeRow попадают только те колонки, что выведены на реестр. Следовательно и проверять в своей функции FormContractVisible вы можете только те колонки что видны вам в реестре(!). Иначе значения будут неопределенными, и результат проверки явно ошибочным;

2. Метод getSectionActions срабатывает только при смене фокуса между строками реестра, то есть, что бы ваши actionMenuItems увидели изменения в комбинированном режиме, вам нужно перейти от одной записи к другой и обратно, что, не очень то и удобно.

Что бы избежать первой проблемы, вам стоит из activeRow только гуид записи, а остальное вытягивать с помощью запросов ESQ.

Что бы по изменению значения на форме, секция об этих изменениях узнавала в реальном времени, без необходимости переключатся по записям.
Вам стоит использовать сообщения. (sandbox)
Поищите по конфигурации примеры использования, их очень много, ключевые слова: sandbox.subscribe и sandbox.publish

Алгоритм конечной реализации для комбинированного может быть приблизительно таким:

1. Видимость вашего actionMenu итема в секции, вы привязываете к атрибуту секции;
2. В секции, объявляете сообщение, в методе init подписываетесь на него через sandbox.subscribe;
2a. Обработчик этого сообщения меняет атрибут, к которому привязана видимость экшена.
3. В карточке по событию изменения целевых полей, вы генерируете адресное сообщение через sandbox.publish

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

Первое было решено. Я переопределил функцию которая указывает что тянуть в activeRow. Я вытягиваю в этот объект нужные мне колонки без запросов.

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

Да. Надо было всего-лишь в секшене видимость подвязать на атрибут.
Как-то я протупил) Спасибо за наводочку)

"Щиголь Максим" написал:Алгоритм конечной реализации для комбинированного может быть приблизительно таким:

1. Видимость вашего actionMenu итема в секции, вы привязываете к атрибуту секции;
2. В секции, объявляете сообщение, в методе init подписываетесь на него через sandbox.subscribe;
2a. Обработчик этого сообщения меняет атрибут, к которому привязана видимость экшена.
3. В карточке по событию изменения целевых полей, вы генерируете адресное сообщение через sandbox.publish

и такое workaround планируется считать нормальным решением?

"Владимир Соколов" написал:и такое workaround планируется считать нормальным решением?

На то он и workaround, хотя типовое решение не сильно и отличается от него. Т.к. в данном случае было найдено существующее сообщение sandbox. Писать своё, как я понимаю, не пришлось. Проблема была решена подвязкой видимости на атрибут, который изменяется в секции по сообщению CardModuleResponse.

Показать все комментарии
7.7
редактор схем
Технические вопросы
7.x

Подскажите, пожалуйста, есть ли возможность отключить проверку indentation в функционале проверки кода?
А то количество ошибок таких большое, автоматического beautify нету, а сторонний из Notepad++ никак не удается настроить так, чтобы его взгляд на красоту кода совпадал со взглядом конфигуратора bpm'online :(
А видеть ошибки в коде - полезно, как ни крути..

Нравится

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

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

Ошибки конфигуратора - это проверка кода на красоту, а не его работоспособность. Отключить данную проверку при сохранении схем нет возможности.

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

Здравствуйте, Алексей Владимирович.

Рекомендуем Вам вместо Notepad++ использовать IDE c автоматической проверкой кода на наличие ошибок JavaScript, ведь пропущенная запятая является ошибкой, а не сделанный отступ нет. Например: JetBrains WebStorm, Brackets или Visual Studio 2015 community. Две из этих IDE являются бесплатными.

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

Показать все комментарии
мастер страницы
Технические вопросы
7.x

Добрый день!

В bpm'online есть возможность с помощью мастера создать несколько страниц на раздел, в зависимости от типов.
А как решить обратную задачу? Решили объединить обратно в одну страницу.

Переэкспериментировали с SysModuleEdit, SysModule, TypeColumnValue, SysModuleEntityId по-всякому, но результата получить не удалось.
Может, кто-то может дать точную инструкцию, как вернуть разделу Контакты стандартную страницу ContactPageV2?

Нравится

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

Здравствуйте, Владимир!

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

SysModuleEdit
SysModuleEditLcz

Примерно так получилось:

1) update SySModuleEntity set TypeColumnUId = null where SysEntitySchemaUId in (select Uid from SysSchema where Name = 'Contact')

2) update SysModule set CardSchemaUId = '70FF5E22-D786-4439-9465-4CDA09486A3E' where code = 'contact'

Непонятно, что за CardSchemaUId такой левый, т.к. его нет в схемах в базе, но в исходной базе он есть в SysModule

3) update SysModuleEdit set SysModuleEntityId = null where SysModuleEntityId = 'A3E7BF65-7380-E011-AFBC-00155D04320C'

здесь Id - это UID схемы Contact в SysSchema

4) insert into SysModuleEdit select * from SalesOmnichannel_Softkey_MSSQL_ENU_760_938_pg.dbo.SysModuleEdit where SysModuleEntityId = 'A3E7BF65-7380-E011-AFBC-00155D04320C'

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

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

Но вот как это сделать через БП я не понимаю. Нужна помощь!

Нравится

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

Добрый день, Виктор!

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

Ссылка на скрин: http://cs630829.vk.me/v630829418/126ed/gSvd7QmP4to.jpg

По сути не важно что должно вызывать БП. Главное как запустить из БП данный функционал для листинга.

Нид хэлп!

Есть 2 варианта:

1. Если при нажатии на кнопку вызывается Web-сервис, то с C# кода вызвать необходимый Web-сервис с корректными параметрами.

2. Если при нажатии на кнопку вызывается метод из js, то можно использовать WebSocket'ы.

Пример с использованием WebSocket'ов:

Создать замещающую страницу и добавитьтакой код:
methods: {
init: function() {
Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onTest, this);
this.callParent(arguments);
},
onTest: function(scope, response) {
if (response && response.Header.Sender !== "Test") {
return;
}
--логика метода при нажатии на кнопку
}

В БП добавить задание-сценарий с таким кодом:
var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

Что то я не понял. Что из этого отменит выгрузку через зипал?
Кнопку мне нажимать не надо. Это должен делать БП.

Добрый день!

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

Данная проблема все еще актуальна.
Саппорт ответил вот что:

Это весь необходимый c# код для "задание-сценарий":
var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);
 
С помощью этого кода вызывается метод на  JS, который удаляет листинги с рекламных площадок. 
Сам метод по удалению листингов должен быть написан на JS.

на схеме страницы за эту функцию отвечает вот что как я понял:

			deleteListings: function(silent) {
				this.showConfirmationDialog(this.get("Resources.Strings.DeleteListingConfirmation"),
					function(result) {
						if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
							AssisHelper.deleteListings.call(this, silent, function() {
								this.set("IsListingPublished", false);
							});
						}
					}, ["yes", "no"]);
			}

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

Просто добавить в js схему такой код:
methods: {
init: function() {
Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onTest, this);
this.callParent(arguments);
},
onTest: function(scope, response) {
if (response && response.Header.Sender !== "Test") {
return;
}
--логика метода при нажатии на кнопку
}

А там где написано "--логика метода при нажатии на кнопку" - вставить реализацию метода deleteListings

Ну это я понял.
К примеру у меня в БП читаются данные по 100 листингам. И для каждого надо реализовать вызов как я понял:

var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

Как лучше это сделать? Что за переменная userConnection? Как оно поймет для какого листинга вызвать метод из схемы?

Этот код нужно просто вставить в задание-сценарий:
var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

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

А в С# вызыввается "Test".

Похоже у нас легкое недопонимание.
Давайте я опишу задачу.
У листингов есть поле - Дата окончание договора
Процесс:
1. БП запускается выбирает все листинги у которых дата окончания договора равна сегодня
2. Получаем к примеру 500 листингов в результате.
3. Эти 500 листингов мне надо удалить с выгрузки Зипал.

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

В БП сначала считываете данные , добавляете условие : если "Дата окончание договора" = Сегодня, то выполнить Задание-сценарий(задание-сценарий связывает БП с методом на JS, кот. удаляет листинг).
Рабочего примера, к сожалению, нет.

Я просто не пойму, как этот код:

var userConnection = UserConnection;
MsgChannelUtilities.PostMessage(userConnection, "Test", String.Empty);

понимает что это листинг, где искать js метод, и как передаёт в этот js листинг

В PostMessage передается параметр "Test".
А в JS методе Вы проверяете, если сигнал не равен "Test", то ничего не происходит, иначе отрабатывает логика удаления листингов.

if (response && response.Header.Sender !== "Test") {
return;
}
--логика метода при нажатии на кнопку
}

Уже лучше! Спасибо! Мне надо понять что именно на до сделать и как это работает. Есть еще пару вопросов:
1. Могу ли я пережать еще параметры? К примеру Ид записи?
2. Как данный метод поймет что надо обращаться именно к схеме листинга где лежит метод? И вызвать именно этот метод?
3.

AssisHelper.deleteListings.call(this, silent, function() {
                                                                this.set("IsListingPublished", false);
                                                        });

Я так понимаю что this это сущность данного листинга? Что есть silent?
Не будут ли эти переменные null если вызвать так метод?

В C# коде Вы больше ничего не передаёте, этот код служит только для передачи сигнала.
Все действия,которые вы хотите сделать с листингами, необходимо описывать в JS коде.
Id записи и необходимые значения полей в листинге можно считывать в БП с помощью блока Читать данные.
this - это теккущая сущность, silent - параметр, кот. передается в deleteListings: function(silent) {...}
Почему переменные должны быть null, если метод будет вызываться для того листинга, у которого будет выполнятся определенное условие (Дата окончания договора = сегодня).
Тоесть, БП проходится по всем листингам и проверяет каждый на условие, если условие удовлетворяется, то переходит в блок задание-сценарий, в котором передается сигнал для JS метода удаления текущего листинга.

Показать все комментарии
Технические вопросы
7.x

Доброго дня!
Нам надо запускать БП каждый день.
Нашел в SDK статью - Запуск процессов по расписанию.
У меня возникли вопросы:
1. Для какой версии BPM указаны примеры в статье?
2. Как запустить данный планировщик?
3. Как отслеживать работу планировщика? Как посмотреть какие задачи распланированы?

У нас версия 7,6

Нравится

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

Виктор, добрый день! Принцип работы планировщика одинаковый для всех версий 7.x. Для того, чтобы БП запускался с заданным интервалом необходимо: 1. Использовать элемент “Задание сценарий”. Добавить job в планировщик, который будет запускать процесс в указанное время. 2. В пространстве имен (Usings) процесса добавить необходимые классы. 3. Выполнить первичный запуск процесса(вручную или по событию). После того, как процесс дойдет до элемента “Задание сценарий” в планировщик будет добавлена запись, которая будет в дальнейшем запускать процесс. Примеры реализации были рассмотрены в рамках других тем, рекомендуем с ними ознакомиться. https://community.terrasoft.ru/questions/problema-pri-zapuske-bp-iz-pla…

https://community.terrasoft.ru/questions/planirovsik-zapuska-processa

https://community.terrasoft.ru/questions/problema-pri-zapuske-bp-iz-pla… https://community.terrasoft.ru/questions/planirovsik-dobavlenie-process…

Спасибо!
Но все равно по 3 пункту не понятно.

Добрый день!

Подразумевается следующее:
Для того, чтобы процесс запускался автоматически, без вмешательства пользователя, необходимо добавить Job в планировщик. Добавление происходит в элементе “Задание сценарий”. Соответственно необходимо процесс, в котором находится “Задание сценарий”, сперва запустить (первичный запуск). После того, как процесс отработает хотя бы один раз – job будет добавлен. Первичный запуск можно сделать вручную (самостоятельно запустить процесс) или установить в процессе стартовый сигнал, который отработает согласно указанному условию.

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

Виктор, добрый день!

Вы можете посмотреть какие job’ы хранятся в планировщике. Таблица QRTZ_TRIGGERS. При создании job’а (в бизнес-процессе ) рекомендую указывать имя, которое будет ассоциироваться с конкретным процессом.

Показать все комментарии
7.7
кнопка в карточке редактирования
меню
Технические вопросы
7.x

Добавляю в кнопку "Действие" свой пункт, все по фэн-шую, то есть SDK.
Вот фрагмент:

actionMenuItems.addItem(this.getActionsMenuItem({
        Type : "Terrasoft.MenuSeparator",
        Caption : ""
}));
// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
actionMenuItems.addItem(this.getActionsMenuItem({
// Привязка заголовка пункта меню к локализуемой строке схемы.
        "Caption" : {
        bindTo : "Resources.Strings.UsrCheckOrder"
},

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

Нравится

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

Здравствуйте, Алексей Владимирович.

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

Пожалуйста..

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails", "ProcessModuleUtilities", "NotificationsModule"],
	function(resources, GeneralDetails, ProcessModuleUtilities, NotificationsModule) {
	return {
		entitySchemaName : "Order",
		details: /**SCHEMA_DETAILS*/{},/**SCHEMA_DETAILS*/
		diff: /**SCHEMA_DIFF*/[],/**SCHEMA_DIFF*/
		attributes: {},
		methods: {
			getActions : function() {
				// Вызывается родительская реализация метода для получения
				// коллекции проинициализированных действий базовой страницы.
				var actionMenuItems = this.callParent(arguments);
				// Добавление линии сепаратора для визуального отделения пользовательского действия от списка
				// действий базовой страницы.
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
				actionMenuItems.addItem(this.getActionsMenuItem({
						// Привязка заголовка пункта меню к локализуемой строке схемы.
						"Caption" : {
							bindTo : "Resources.Strings.UsrCheckOrder"
						},
						// Привязка метода обработчика действия.
						"Tag" : "CheckOrderPay"
						// Привязка свойства видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet.
						//"Visible": { bindTo: "isAccountPrimaryContactSet" }
					}));
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				return actionMenuItems;
 
			},
			// Метод-обработчик выбора действия.
			CheckOrderPay : function() {
				// Получение идентификатора заказа.
				var OrderId = this.get("Id");
				// Объект, который будет передан в качестве аргумента в метод executeProcess.
				var args = {
					// Имя процесса, который необходимо запустить.
					sysProcessName : "UsrCheckOrder",
					// Объект со значением входящего параметра для процесса.
					parameters : {
						idOrder : OrderId
					}
				};
				// Запуск пользовательского бизнес-процесса.
				ProcessModuleUtilities.executeProcess(args);
				//Terrasoft.configuration.NotificationsModule.onShowNewNotificationClick();
				//this.Location.Reload(false);
			}
		},
		rules : {},
		userCode : {}
	};
});

В Resources.Strings.UsrCheckOrder Заголовок и значение одинаковы, Проверить заказ
Строчка с Visible закоментирована в точности как указано, но функции, указанной там, в теле схемы нет..

Здравствуйте, Алексей Владимирович.

Мы проанализировали Ваш код. Данное поведение возникает у Вас, по причине того, что используя статью http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/AddActionT… Вы не выполнили пункты начиная с 6-го. После добавления локализированной строки в OrderSectionV2 данная проблема возникать не будет.

Спасибо за анализ, но я не повторяю типовое задание, а делаю свое, и у меня нет необходимости контролировать видимость пункта в зависимости от статуса заказа.
При любом статусе кнопка видна, по задумке.
Сейчас ситуация такова:
1. Ctrl+F5
2. Создаю заказ. Текст пункта виден.
3. Сохраняю заказ.
4. Открываю на редактирование только что созданный заказ - текст не виден.
5. Ctrl+F5 и открываю заказ опять - текст виден.
6. Закрываю заказ кнопкой "Закрыть".
7. Открываю заказ, текст пункта не виден.

Я понимаю, что, возможно, я где-то что-то не так сделал. Мне интересно что делать дальше?
Сейчас вот подумалось, что надо сделать новую локализуемую строку и попробовать ее назначить вместо прежней. Сделаю, отпишусь.

Увы, ситуация не изменилась, текст пропадает.
data-item-marker и текст, с ним совпадающий, показывается только в первый раз после полной перезагрузки.
Попробую пересоздать замещающую схему.

Здравствуйте, Алексей Владимирович.

Копирую Ваш код предварительно изменив его для ContactPageV2 и добавляю локализированную строку.

Результат:
При создании контакта элемент виден.

При открытии контакта элемент отсутствует.

Добавляем замещающую схему раздела с такой же локализированной строкой.

В результате элемент не пропадает.

Сергей, Спасибо! Урок усвоен :redface:

Показать все комментарии
бизнес-процесс
подстановка
7.x

Добрый день.
Помогите разобраться.
Были созданы раздел "Расходных материалов" и деталь в Обращении "Расходные материалы в обращении". Общее поле в них это "Модель картриджа". Мне необходимо посчитать количество израсходованных.
Я построила БП, но возможно будет какой то другой совет как это сделать.
Проблема заключается в БП, он отрабатывается, но результата я не получаю.

text
Скрин
Скрин 1
Скрин 2
Скрин 3
Скрин 4
Скрин 5
Скрин 6

Нравится

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

Добрый день!

Трудно определить причину судя по скриншотам. Лучше обратиться в техническую поддержку для детального анализа.
Примечания:
1. “Читать данные расходных материалов в обращении”. В условии следует поставить логическое ИЛИ. Id = Id. Добавленной записи ИЛИ Id = Id. Измененной записи.
2. Следует убедится, что поля “Количество пустых”, “Количество” и параметр “Сумма пустых картриджей” имеют тип Целое.

Кроме того, можно добавить автогенерируемую страницу перед каждым из элементов. И с помощью элемента “Формула” передавать на страницу значения, который мы получаем из чтения данных. Таким образом можно определить на каком из этапов происходит сбой.

Добрый день.
Спасибо, Олег, за помощь.
Я изменила условие на ИЛИ в "Читать данные расходных материалов в обращении", и добавила чтение данных после изменения записи, и все заработало.

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

Здравствуйте. Как можно ограничить права доступа на изменения в разделе "Заказы" для пользователя мобильным приложением?
Как можно делать изменения не применив заветной кнопки редактирования? Нужно, чтобы при поступившем заказе можно было только лишь выбрать определённые пункты и поставить "галочку" в нужном пункте?

Нравится

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

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

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

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

"Клименко Николай" написал:

Права доступа в мобильном приложении ограничиваются как и в самом bpm'online - согласно прав доступа по умолчанию.

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

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

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

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

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

Здравствуйте. Версия bpm'online sales commerce и на сколько мне известно тут не предусмотрены полевые продажи.

Дело вот ещё в чём. Через администрирование были настроены права доступа на чтение, изменение и удаление для экспедиторов. Была создана организационная структура "Экспедиторы". Даже по колонкам были розданы полномочия по возможностям изменения. И нужные пункты были отмечены для возможности редактирования. Однако, ничего не работает. В разделе "Заказы" для экспедиторов пишет, что у вас нет прав на изменение раздела "Order". Хотя право на чтение в заказе для экспедитора есть и с этим всё нормально.
Скрины предоставляю
[URL=http://radikal.ru/big/21763c3f8c5c499f99ff5d01cc1be14d][IMG]http://s019…]
[URL=http://radikal.ru/big/a50dcda0ab104ad6899025ccaf578649][IMG]http://s019…]
[URL=http://radikal.ru/big/5339c2efd6d5459abf2e68368aad08f0][IMG]http://s005…]
[URL=http://radikal.ru/big/eb8e4fae4f634d919718b35443d8b03c][IMG]http://s017…]

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

Подскажите пожалуйста - проблема только с мобильным приложением или через основное приложение под логином экспедитора те же функции также не доступны?
Можем ли мы, совместно с вами подключится к системе и проанализировать текущие права? Для етого сообщите пожалуйста в службу технической поддержки ( support@terrasoft.ru ) удобное для Вас время и контактныq телефон для связи. В теме письма укажите номер - 0291994

"Клименко Николай" написал:

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

Можем ли мы, совместно с вами подключится к системе и проанализировать текущие права? Для етого сообщите пожалуйста в службу технической поддержки ( support@terrasoft.ru ) удобное для Вас время и контактныq телефон для связи. В теме письма укажите номер - 0291994


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

Здравствуйте ещё раз. Нашёл причину в таком поведении. В БП визирование заказа присутствует элемент изменение прав доступа. Там вот и указано, что после положительной визы доступ на удаление и изменение изымаются у пользователей. Возможно ли как-то это исправить или легче заново написать БП по визированию?

[URL=http://radikal.ru/big/8bf4e509c3904a4e8baee5faeb236cc3][IMG]http://s019…]

Добрый день!

Изменить базовый процесс визирования, у пользователей нет возможности.

Для того, чтобы изменить базовый процесс, необходимо скопировать базовый процесс (Скриншот 1).

Далее в системной настройке, которая соответствует нужному процессу визирования, указать Ваш кастомный процесс (Скриншот 2).

Спасибо!

"Арменчу Артём Александрович" написал:

Добрый день!

Изменить базовый процесс визирования, у пользователей нет возможности.

Для того, чтобы изменить базовый процесс, необходимо скопировать базовый процесс (Скриншот 1).

Далее в системной настройке, которая соответствует нужному процессу визирования, указать Ваш кастомный процесс (Скриншот 2).

Спасибо!

Прикрепленный файлРазмер

1.png
74.95 кб

2.png
76.64 кб

С уважением, Арменчу Артём.

Большое спасибо всё работает как нужно!

А можно то же самое делать с базовыми схемами?

"Ануфриев Дмитрий Юрьевич" написал:

А можно то же самое делать с базовыми схемами?

Дмитрий, здравствуйте!

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

"Ануфриев Дмитрий Юрьевич" написал:

А можно то же самое делать с базовыми схемами?

Дмитрий, здравствуйте!

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

"Мотков Илья" написал:
Ануфриев Дмитрий Юрьевич пишет:

А можно то же самое делать с базовыми схемами?

Дмитрий, здравствуйте!

Вы имеете ввиду копировать схемы, как происходит данное действие в БП? Вряд ли.

Для корректной работы приложения схемы необходимо замещать.


Здравствуйте. Спасибо. Будем замещать тогда

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