7.3_Версия_7.3.0.2567_Версия_7.3.0.4021
Технические вопросы
7.x

Добрый день, уважаемое сообщество!

Возникла проблема после переезда на новый билд платформы 7.3 с версии 7.3.0.2567 на
более позднюю версию 7.3.0.4021. Проблема заключается в следующем:

При квалификации лида и поиске подобных записей контактов по Name/Phone/Email не удается отобразить коллекцию записей.

Collection приходит но не отображается и возникает ошибка.

Идентифицировал появление ошибки в методе onCollectionDataLoaded в модуле
Terrasoft.controls.Grid.

onCollectionDataLoaded: function(a, b, c) {
        this.theoreticallyActiveRows = null ;
        if (this.rows.length) {
            if (!Ext.Object.isEmpty(b) && this.rendered) {
                var d = []
                  , a = {
                    rows: d
                };
                b.each(function(a) {
                    a = this.getRow(a);
                    d.push(a)
                }
                , this);
                if (this.hierarchical && (b = b.getByIndex(0).get(this.hierarchicalColumnName),
                a[this.hierarchicalColumnName] =
                b,
                "listed" === this.type && b))
                    b = this.getDomRow(b),
                    b = parseInt(b.getAttribute("level"), 10),
                    a.rowLevel = b + 1;
                b = [];
                this.renderGrid(b, a);
                for (var a = "", e = 0, f = b.length; e f; e += 1)
                    a += Ext.DomHelper.createHtml(b[e]);
                Ext.Object.isEmpty(c) && (c = {
                    mode: "bottom"
                });
                this.addRows(a, c)
            }
        } else
            this.collection = this.collection || a,
            this.prepareCollectionData(),
            this.allowRerender() && this.reRender()
    }

Данные методы немного различны между версиями.
Вот данный метод из предыдущей версии из модуля grid.js:

                onCollectionDataLoaded: function(collection, newItems, settings) {
                    this.theoreticallyActiveRows = null;
                    if (!this.rows.length) {
                        this.collection = this.collection || collection;
                        this.prepareCollectionData();
                        var wrapEl = this.getWrapEl();
                        if (wrapEl && this.allowRerender()) {
                            this.reRender();
                        }
                        return;
                    }
                    if (this.Ext.Object.isEmpty(newItems) || !this.rendered) {
                        return;
                    }
                    var rows = [];
                    var options = {
                        rows: rows
                    };
                    newItems.each(function(item) {
                        var row = this.getRow(item);
                        rows.push(row);
                    }, this);
                    if (this.hierarchical) {
                        var firstItem = newItems.getByIndex(0);
                        var firstItemParent = firstItem.get(this.hierarchicalColumnName);
                        options[this.hierarchicalColumnName] = firstItemParent;
                        if ("listed" === this.type && firstItemParent) {
                            var firstItemParentDom = this.getDomRow(firstItemParent);
                            var parentLevel = parseInt(firstItemParentDom.getAttribute("level"), 10);
                            options.rowLevel = parentLevel + 1;
                        }
                    }
                    var result = [];
                    this.renderGrid(result, options);
                    var resultHtml = "";
                    for (var i = 0, c = result.length; i c; i += 1) {
                        resultHtml += Ext.DomHelper.createHtml(result[i]);
                    }
                    if (Ext.Object.isEmpty(settings)) {
                        settings = {
                            mode: "bottom"
                        };
                    }
                    this.addRows(resultHtml, settings);
                }

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

Нравится

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

Здравствуйте! Скажите, пожалуйста, каким образом происходило обновление?

Обновление происходило через WorkSpaceConsole.

Александр, и во время обновления никаких ошибок не возникало?

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

Добрый день!
Пример с использованием обратных связей
var servicePact = this.get("ServicePact");
if (!servicePact) {
return;
}
var filtersCollection = this.Terrasoft.createFilterGroup();
filtersCollection.add("ServiceItemByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,
"[ServiceInServicePact:ServiceItem].ServicePact", servicePact.value));

return filtersCollection;

выполняет следующий запрос
select * from ServiceItem
where exists(select * from ServiceInServicePact
where ServiceInServicePact.ServiceItemID = ServiceItem.ID and
ServiceInServicePact.ServicePactID = @value)

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

Подскажите, пожалуйста какое условие фильтрации нужно наложить на схему ServiceCategory, чтобы выполнялся запрос и с обратными связями и с прямыми вот такого вида:
( показывались только те категории сервисов, сервисы которых есть в данном сервисном договоре)

select * from ServiceCategory
where exists(select * from ServiceInServicePact
inner join ServiceItem on ServiceInServicePact.ServiceItemID=ServiceItem.ID
where ServiceItem.CategoryID = ServiceCategory.ID and
ServiceInServicePact.ServicePactID = @value)

Нравится

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

Попробовала такой вариант для вышеописанного запроса

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "ServiceCategory"});
esq.addColumn("Id");
esq.filters.add("servicePactAndCategoryFilter", this.getServiceCategoryFilters());

где
getServiceCategoryFilters: function() {
var servicePact = this.get("ServicePact");
if (!servicePact) {
return;
}
var filtersCollection = this.Terrasoft.createFilterGroup();
filtersCollection.add("ServiceCategoryByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "[ServiceInServicePact.ServiceItem:ServiceCategory].ServicePact", servicePact.value));
return filtersCollection;

но такой вариант не работает.

Интересует - насколько корректна конструкция ? filtersCollection.add("ServiceCategoryByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "[ServiceInServicePact.ServiceItem:ServiceCategory].ServicePact", servicePact.value));

Аналогична ли она условию в запросе
select * from ServiceCategory
where exists(select * from ServiceInServicePact
inner join ServiceItem on ServiceInServicePact.ServiceItemID=ServiceItem.ID
where ServiceItem.CategoryID = ServiceCategory.ID and
ServiceInServicePact.ServicePactID = @value) ?

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

Добрый день, Дарья!

Данная логика является специфичной и у нас нет примеров реализации данного функционала, но вероятнее всего в фильтре, который Вы пытаетесь построить должна быть колонка «[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact».

Спасибо, Елена!
Думаю, это то, что нужно
Итак, фильтр на объект ServiceCategory
«[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact».

Насколько я поняла, этот фильтр дает такой запрос
select * from ServiceCategory
where exists (select * from ServiceItem
where ServiceItem.CategoryID= ServiceCategory.ID
and exists (select * from ServiceInServicePact
where ServiceInServicePact.ServiceItemId = ServiceItem.ID
and ServiceInServicePact.ServicePactId = @value))

что в общем-то накладывает необходимое условие.

Елена, скажите, пожалуйста, я правильно поняла действие этого условия
[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact ?

Не могли бы вы пояснить, какой в результате фильтр в терминах sql накладывается на ServiceCategory,
если применить условие
[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact

Да, Елена, проверила!
Это условие действительно то самое.
Спасибо!

Всегда рада помочь:)

Показать все комментарии
Автогенерируемая страница
бизнес-процесс
Технические вопросы
7.x

Добрый день!

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

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

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

Здесь та же проблема с клавишей закрыть. Но и появилась другая: Кнопка выполнить позже, ничего не делает. Пробовал добавить отображение в расписание, напоминание... и т.д. Но BPM не в какую не демонстрирует уведомление, вообще никаких показателей этому.

Использую BPM 7.5

Нравится

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

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

Кнопка "Закрыть" создает активность пользователю, который ее нажал. Кнопка "Выполнить позже" запрашивает у пользователя информацию, когда именно пользователь хочет выполнить отложенную активность.
Возможность убрать кнопку "Закрыть" есть (на самом деле она не убирается, а скрывается). Вам необходимо заместить AutoGeneratedPageV2Utilities и прописать логику сокрытия кнопки в замещающую страницу.

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

Добрый день.
Помогите.Как создать сценарий,вписать туда код и просмотреть его результат. Например самое простое: написать код на С# в сценарий,который бы выводил "Hellow world"

Нравится

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

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

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

В сценарии обратиться к параметру как к переменной и записать в него "Hello World".

С помощью элемента "Изменение данных" или "Добавление данных" Вы можете присвоить значение данного параметра одной из колонок любого объекта с типом "Строка".

Показать все комментарии
лента
Обращения
права доступа
Технические вопросы
7.x

Добрый день,

каким образом можно организовать деталь, аналогичную Ленте в разделе Обращения, но изначально настроить так, чтобы все комментарии в данной ленте обращения были бы доступны только сотрудникам компании?

Нравится

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

Маргарита, добрый день!

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

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

Деталь Лента является специфической. К сожалению, у нас нет подробной инструкции по ее созданию, ориентироваться следует на существующую логику, реализованную в системе.
Для того, чтобы отображать/скрывать деталь, следует:
1) на странице редактирования раздела, в блоке diff в элементе детали добавить атрибут «visible», отвечающий за отображение/скрытие детали;
2) создать метод, который будет выполнять проверку видимости согласно Вашей бизнес-логике;
3) связать метод с атрибутом.

Пример:

{
"operation": "insert",
"name": "TabsContainer",
"parentName": "CardContentContainer",
"propertyName": "items",
"values": {
"itemType": Terrasoft.ViewItemType.CONTAINER,
"visible": {"bindTo": "getTabsContainerVisible"},
"items": []
}
}

Также следует отметить, что Вы можете разграничить доступ к детали в меню Управление конфигурацией – Администрирование: доступ к объектам.

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

Здравствуйте.
Существует ли интеграция переноса данных базовых версий 3.х.х -> 7.6.0 ?
К примеру Контрагентов, Контактов, Продаж и т.п.

Нравится

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

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

Есть два варианта выполнения подобного переноса.

Первый, это выполнение экспорта данных из версии Terrasoft 3.x и последующий импорт (используя универсальный импорт записей) в bpm'online 7.6.

Второй вариант, это перенос данных с помощью написания sql скриптов.

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

"Alina_Velichko" написал:Первый, это выполнение экспорта данных из версии Terrasoft 3.x и последующий импорт (используя универсальный импорт записей) в bpm'online 7.6.

интересно, сколько же Excel-файлов необходимо создать, чтобы перенести стандартные данные? И в каждом проекте с нуля делать?

Владимир, система позволяет импортировать таким способом до 10 тысяч записей одним файлом.
Но, естественно, преимущество за вторым вариантом, используя перенос с помощью базовых комманд select/insert.

Показать все комментарии
contract
OrderProduct
Агрегирующий фильтр
бизнес-процесс
продукт в заказе
Технические вопросы
7.x

Здравствуйте! Нуждаюсь в помощи по двум вопросам.

Вопрос №1

Делаю в БП страницу редактирования Договора. Мне надо чтобы элемент был выполнен только если на детали Продукты есть хотя-бы одна запись. Пробовал сделать через агрегирующий фильтр:

агрегирующий фильтр

После чего я вижу:

ошибка

Пробовал на другие детали, работает как-то выборочно. Например на визу работает, а на активности нет. Поставил зависимости от пакетов:
ContracInOrder, Order, CoreContract, и другие

Пробовал на разных сайтах. Ошибка идентичная.

Данную задачу можно выполнить с помощью элемента "Чтение данных", но интересно почему не работают фильтры и как с ними работать?

Вопрос №2

в БП нужно создать визу в договоре на Контакта у которого
контрагент = Наша компания,
филиал = Контакт текущего пользователя.Филиал
должность = Фин.директор
И когда виза будет подтверждена продолжать БП. Подскажите как это лучше реализовать. Заранее спасибо.

версия 7.5

Нравится

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

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

Вопрос №1.

Ничего не указывайте в поле "Считать элемент выполненым, если объект соответствует условиям".
После завершения задачи, используйте элемент "Чтение данных". Считайте количество записей в объекте "Продукт в заказе", где Заказ = Id Вашего заказа.
Используйте условные потоки:

  • Если количество = 0, тогда возвращаемся к редактированию заказа
  • Иначе - идем по процессу дальше

Вопрос №2.

1) Используйте элемент "Чтение данных" по объекту "Контакт", с фильтром Контакт = Контакт текущего пользователя
2) Используйте элемент "Чтение данных" по объекту "Контакт", с фильтром Филиал = Чтение данных1.Первый элемент результирующей коллекции.Филиал и Контрагент = Наша компания и Должность = Фин.директор
3) Используйте элемент "Добавить данные" в объекте "Виза договора". Установите визирующим контакта, прочитанного на втором шаге.
4) Используйте "Промежуточный обрабатыващий сигнал" по объекту "Виза договора", событие - изменение записи по Id созданной на предыдущем шаге записи с фильтром Состояние = "Положительная", чтобы отследить изменение состояния в поле "Состояние".

Только учтите, что состояние визы еще может быть "Отрицательным".

1. Я через чтение данных и сделал. Интересовало как работать с агрегирующими фильтрами и работают ли они ?
2. А если будет несколько контактов в должности фин.директор ?
Я пробую записать в объект Виза договора результат выборки по контакту. Но я столкнулся с тем, что колонка визирующий смотрит в объект "Объект администрирования"

Добрый день!

1. Как видно из предоставленных Вами скриншотов, фильтры работают некорректно - было предложено альтернативное решение.
2. Полностью с Вами согласен - виза проставляется либо роли, либо пользователю, поэтому объект действительно "Объект администрирования".
Перед элементом "Добавить данные" используйте еще одно чтение данных по объекту "Объект администрирования" с фильтром Контакт = Id контакта с должностью фин. директор.

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

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

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

Нравится

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

Олег, фильтрация настраивается путем указания соответствующих masterColumn и detailColumn при добавлении детали на страницу

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

define("CorrespondencePageV2", [],
	function() {
		return {
			entitySchemaName: "Document",
			details: /**SCHEMA_DETAILS*/{
				Order: {
					schemaName: "OrderDetailV2",
					entitySchemaName: "Order",
					filter: {
						masterColumn: "Id", // Id текущего Document
						detailColumn: "[OrderInDocument:Order:Id].Document" // Все Document, которые связаны с Order детали через таблицу OrderInDocument
					}
				}
			}/**SCHEMA_DETAILS*/,
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"parentName": "HistoryTabContainer",
					"propertyName": "items",
					"name": "Order",
					"values": { "itemType": Terrasoft.ViewItemType.DETAIL }
				}
			]/**SCHEMA_DIFF*/
		};
	});

Если же фильтрация сложная или требует предварительных вычислений, то лучше наверное воспользоваться filterMethod:

details: /**SCHEMA_DETAILS*/{
	OpportunityAccount: {
		schemaName: "OpportunityDetailV2",
		filter: {
			masterColumn: "Account",
			detailColumn: "Account"
		},
		filterMethod: "opportunityAccountFilter",
		captionName: "AccountOpportunitiesCaption"
	},
}/**SCHEMA_DETAILS*/,
methods: { 
	/**
	 * Метод фильтрации детали Продукты контрагента
	 * @protected
	 * @virtual
	 * @return {Terrasoft.FilterGroup} Возвращает группу фильтров
	 */
	opportunityAccountFilter: function() {
		var account =  this.get("Account");
		var accountId = this.Terrasoft.GUID_EMPTY;
		if (account && account.value) {
			accountId = account.value;
		}
		var opportunityId = this.get("Id");
		var filterGroup = new this.Terrasoft.createFilterGroup();
		filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
		filterGroup.add("AccountFilter", this.Terrasoft.createColumnFilterWithParameter(
				this.Terrasoft.ComparisonType.EQUAL, "Account", accountId));
		filterGroup.add("OpportunityFilter", this.Terrasoft.createColumnFilterWithParameter(
				this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", opportunityId));
		return filterGroup;
	},
}

Олег, здравствуйте!

"Толмачев Дмитрий Юрьевич" написал:

Олег, фильтрация настраивается путем указания соответствующих masterColumn и detailColumn при добавлении детали на страницу

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

define("CorrespondencePageV2", [],

        function() {

                return {

                        entitySchemaName: "Document",

                        details: /**SCHEMA_DETAILS*/{

                                Order: {

                                        schemaName: "OrderDetailV2",

                                        entitySchemaName: "Order",

                                        filter: {

                                                masterColumn: "Id", // Id текущего Document

                                                detailColumn: "[OrderInDocument:Order:Id].Document" // Все Document, которые связаны с Order детали через таблицу OrderInDocument

                                        }

                                }

                        }/**SCHEMA_DETAILS*/,

                        diff: /**SCHEMA_DIFF*/[

                                {

                                        "operation": "insert",

                                        "parentName": "HistoryTabContainer",

                                        "propertyName": "items",

                                        "name": "Order",

                                        "values": { "itemType": Terrasoft.ViewItemType.DETAIL }

                                }

                        ]/**SCHEMA_DIFF*/

                };

        });

Дмитрийпредоставил правильную рекомендацию.
За подобную бизнес-задачу отвечает masterColumn и detailColumn.

Спасибо, добавил filterMethod, работает, только одна проблема как мне сравнивать значение дат.
Необходимо отфильтровывать и выводить только те записи у которых ValidTill больше текущей даты.
Пробовал значение сравнивать с текущей датой в разных форматах (yyyy-mm-dd и dd/mm/yyyy), фильтр не отрабатывает

filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter(
                                this.Terrasoft.ComparisonType.GREATER, "ValidTill", today));

Также вопрос, как фильтровать логические значение, сравнивать их с true или 1 ?

С датами, по-моему, так:

filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter(
                                this.Terrasoft.ComparisonType.GREATER, "ValidTill", new Date()));

"Глобин Олег" написал:Также вопрос, как фильтровать логические значение, сравнивать их с true или 1 ?

Сравнивать с true.

Спасибо за помощь, добавил метод

productPriceFilter: function() {
    var filterGroup = new this.Terrasoft.createFilterGroup();
    filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
    filterGroup.add("ValidTillNullFilter", this.Terrasoft.createColumnFilterWithParameter(
                    this.Terrasoft.ComparisonType.IS_NULL, "UsrValidTill"));
    filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter(
                    this.Terrasoft.ComparisonType.GREATER, "UsrValidTill", new Date()));
    return filterGroup;
},

и добавил деталь

"ProductPriceDetail": {
	"schemaName": "ProductPriceDetailV2",
	"filter": {
		"masterColumn": "Id",
		"detailColumn": "Product"
	},
	"filterMethod": "productPriceHistoryFilter"
},

Фильтрация по дате заработала, но теперь не работает базовая фильтрация по Id продукта и значению Product в детали.
Вопрос как добавить в filterMethod условие Id equal Product И (ValidTill > newDate() ИЛИ ValidTill isNull)
Т.е. добавить срази условие И и ИЛИ в один фильтр, т.к. изменение

filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;

меняет отношения сразу между всеми условиями

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

Вам необходимо создать дополнительную группу фильтров, а существующую filterGroup использовать внутри неё:

productPriceFilter: function() {
	var filterGroup = new this.Terrasoft.createFilterGroup();
	filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.OR;
	filterGroup.add("ValidTillNullFilter", this.Terrasoft.createColumnFilterWithParameter(
		this.Terrasoft.ComparisonType.IS_NULL, "UsrValidTill"));
	filterGroup.add("ValidTillGreaterFilter", this.Terrasoft.createColumnFilterWithParameter(
		this.Terrasoft.ComparisonType.GREATER, "UsrValidTill", new Date()));
	var mainFilterGroup =  new this.Terrasoft.createFilterGroup();
	mainFilterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
	mainFilterGroup.addItem(filterGroup);
	// добавляете фильтр по Id продукта
	return mainFilterGroup;
},

Спасибо

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

Добрый день!

Скажите, пожалуйста, какими способами в BPM Online ITIL можно настроить автоматическое заведение заявок из электронной почты ( и можно ли вообще).

Спасибо

Нравится

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

Добрый день, Дарья!

В bpm’online ITIL service реализована функциональность автоматической отправки email-сообщений по обращениям.
Email-сообщение отправляется клиенту при регистрации, взятии в работу, разрешении, отмене, отклонению по SLA и закрытии его обращения.
Для отправки сообщений выполните предварительную настройку:

• В системной настройке“E-mail службы поддержки” укажите почтовый ящик, который будет использоваться для автоматической отправки email-сообщений

У меня вопрос в другом был совсем) - я спрашивала про автоматическое заведение заявок из электронной почты.

Для автоматического создания обращения по входящему е-mail, в системной настройке “E-mail службы поддержки” укажите почтовый ящик поддержки.

Затем, необходимо ввести пароль от общего ящика и поставить галку в графе «Использовать как общий ящик»
[IMG]http://s020.radikal.ru/i701/1507/9e/17b4df9c6094.jpg[/IMG]
Таким образом, при входящем e-mail на указанный ящик будет автоматически создано новое обращение.

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

Добрый день.
Делаю все также но Обращение не создается.
Письмо продолжает после получения находиться "Не обработанным" в папке "Входящие"
В письме определен Контрагент и Контакт. А Активность/Обращение не подлинковано.
Может есть еще настройки?

Для автоматической регистрации обращения по входящему email для версии продукта 7.6 необходимо выполнение следующих условий:
1. В справочнике «Список почтовых ящиков для регистрации обращений» указать email, при поступлении письма на который, будет формироваться обращение в системе.
2. В системной настройке «E-mail службы поддержки» указать тот же ящик, что указан при выполнении пункта 1. Если Вы в справочнике указали несколько email, то в системной настройке укажите тот ящик, который будет использоваться по умолчанию.
3. В системной настройке «Автоматический запуск процесса "Регистрация инцидента по входящему email"» необходимо проставить признак активности в графе «Значение по умолчанию».
Если данные введены корректно, то их должно быть достаточно для автоматической регистрации обращения по входящему email.

Дополнительно:
Возникают иногда ситуации, что при выполнении вышеуказанных действий регистрация не происходит, в таком случае необходимо настроить в Вашем профиле «Учётные записи почты».
Также через «Управление конфигурацией» проверить корректность или вообще присутствие настроек для Вашего почтового сервера на вкладке «Настроить список почтовых провайдеров». Рис. во вложении.

Получилось.
Спасибо.

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

Добрый день, Павел!

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

Еще добавлю описание принципиального отличия между ними:
• ЗАПРОС НА ОБСЛУЖИВАНИЕ — обращение, поступающее в службу поддержки в рамках нормального функционирования сервиса. Например, запрос на установку нового рабочего места или настройку телефонной линии.
• ИНЦИДЕНТ — событие, которое не является частью стандартной работы сервиса и которое может повлечь за собой прерывание либо ухудшение качества сервиса. Например, запрос на ремонт оборудования или восстановление телефонной связи после сбоев.

Спасибо.
Я так и думал и этого очень недостаточно на данный момент.
А работы по реализации данного функционала идут? Есть какие то планы по срокам?

Добрый день, Павел! Данный функционал, реализован в 7.7. При регистрации обращения, поле остается пустым, а Вы самостоятельно сможете выбрать "инциндент" это, либо "запрос на обслуживание"

Добрый день, Павел!
Данный функционал, реализован в 7.7. При регистрации обращения, поле остается пустым, а Вы самостоятельно сможете выбрать "инцидент" это, либо "запрос на обслуживание"

Добрый день!

Версия bpm online 7.9.1
Почта приходит, письма отображаются, но обращения не регистрируются.
Почтовый провайдер Exchange
В "Журнале процессов" по процессу Регистрация обращения по входящему письму:
Подпись Состояние Дата начала Описание ошибки
Email to support Завершен 04.05.2017 13:58
Завершен 04.05.2017 13:58
Register incident Завершен 04.05.2017 13:58

Настроено все как в видео уроке "Настройка обработки обращений по каналу Email в bpm’online".
Раньше был настроен IMAP, все работало.
Потом необходимо было изменить почтовый ящик.
Сейчас перевели почту на Exchange (по рекомендации техподдержки Террасофт)

Ольга, добрый день!
В версии продукта 7.9.0 и выше есть много нового функционала по работе с нежелательной почтой.
Необходимо проверить активность (письмо) не является ли данное письмо автоответом и не попадает ли оно под параметры указанные в справочнике "Черный список email адресов и доменов для регистрации обращений".
Так же, прошу обратить Ваше внимание, что регистрация обращения происходит только от имени пользователей у которых есть лицензия на продукт Service. Процесс регистрации запускается от имени пользователя, который выполняет синхронизацию с почтой, если не корректно настроена синхронизация (ее может запустить любой пользователь), то есть вероятность что пользователь у которого нет лицензий и запустит процесс, который в свою очередь упадет с ошибкой.

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

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

Здравствуйте, Коллеги!

Есть деталь, добавленная на несколько страниц. Необходимо реализовать разную клиентскую JavaSdcript логику в зависимости от того, на какую странице добавлена деталь. Подскажите, пожалуйста, как это сделать из JS.

Спасибо, Коллеги!

Нравится

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

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

Для решения задачи следует:
// Взять информацию о детали
var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id]) || {};
// Имя карточки, на которой размещена деталь
var cardPageName = detailInfo.cardPageName;

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

Спасибо за ответ!
Однако вылетает исключение на строчке

var detailInfo = this.sandbox.publish("getDetailInfo", null, [this.sandbox.id]) || {};

Текст исключения

Uncaught i {message: "Message getDetailInfo is not defined in undefined module"}

Сокращенный код детали:

define("UsrUsrVacancyCandidates1PageV2", ["GeneralDetails", "BusinessRuleModule", "ConfigurationConstants",
	"LookupUtilities"
], function(GeneralDetails, BusinessRuleModule, ConfigurationConstants, LookupUtilities) {
	return {
		entitySchemaName: "UsrVacancyCandidates",
		details: /**SCHEMA_DETAILS*/ {} /**SCHEMA_DETAILS*/ ,
		diff: /**SCHEMA_DIFF*/ [{
			"operation": "insert",
			"name": "UsrVacancies0084c888-fcc2-467b-b586-53b355ca0765",
			"values": {
				"layout": {
					"colSpan": 12,
					"rowSpan": 1,
					"column": 0,
					"row": 0,
					"layoutName": "Header"
				},
				"bindTo": "UsrVacancies",
				"enabled": {
					"bindTo": "getUsrVacanciesEnabled"
				}
			},
			"parentName": "Header",
			"propertyName": "items",
			"index": 0
		}] /**SCHEMA_DIFF*/ ,
		attributes: {
		methods: {
			getUsrVacanciesEnabled: function() {
				// Get detail info
				var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id]) || {};
				// Get card name which hosts the detail
				var cardPageName = detailInfo.cardPageName;
				var vacanciesCardPageName = "UsrVacanciesPage";
				return cardPageName !== vacanciesCardPageName;
			}
		},
	};
});

Сообщение GetDetailInfo и метод getDetailInfo доступны в контексте детали, поэтому их можно вызывать в контексте детали:
var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id])|| {};
var detailInfo = this.getDetailInfo();

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

Код выше это код разметки детали, а не карточки. Если я оттуда вызову this.name я получу имя страницы с разметкой детали. А мне нужно получить имя страницы карточки, на которую добавлена деталь.
Вы не могли бы более подробно объяснить про "контекст детали"? Где именно я должен разместить указанные Вами строки кода, чтобы они оказались "в контексте детали"?

// v7.5
getUsrVacanciesEnabled: function() {
       var defaultValues = this.getDefaultValues();
       if (!Ext.isEmpty(defaultValues)) {
             return defaultValues.some(function(value){
                    return (value.name === "UsrCandidates")
             })
       }
}
 
// v7.6
getUsrVacanciesEnabled: function() {
       var value = this.getDefaultValueByName("UsrCandidates");
       return (!Ext.isEmpty(value));
}

Спасибо, работает!
Хотя способ конечно немного чудной)

вот это еще нашёл в bpm:

var cardPageName = this.get("CardPageName");

var OrderId = this.get("MasterRecordId");
Показать все комментарии