Приветствую. Столкнулся с такой проблемой:
Разбираюсь с BPM. Нужно добавить некоторые поля на страницы добавления \ редактирования контрагентов. Как я понимаю, делается это в "Мастере раздела" на вкладке "Страница". Суть в том, что при попытке открытия вкладки "Страница" идет бесконечная загрузка и выбивает ошибки в консоль.

message: Uncaught TypeError: Cannot read property 'name' of undefined
 date: Fri Feb 17 2017 17:25:49 GMT+0300 (RTZ 2 (зима))
 stack: TypeError: Cannot read property 'name' of undefined

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

Нравится

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

Страница базовая? Какая версия продукта? Компиляция проходит удачно?
Посмотрите, указана ли первичная колонка

и указан объект в entitySchemaName

Если ошибка будет актуально, то скиньте код схемы.

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

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

Доброго времени суток!
Столкнулся с такой задачей, что необходимо отправить на визирование произвольный объект.
Например, есть раздел Командировка и необходимо осуществить возможность отправления записей этого раздела на визирование.
Собственно вопрос, кто знает где можно подсмотреть как происходит процесс визирования или может кто объяснить этот процесс?

Нравится

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

Добрый день, Михаил!

С информацией по базовой логике работы процесса Вы можете ознакомиться в руководстве пользователя, на примере процесса визирования заказов: https://academy.terrasoft.ua/documents/sales-commerce/7-9/process-vizir…
С информацией по использованию базовых элементов при построении процесса визирования можно ознакомится в руководстве по процессам. Например в теме: https://academy.terrasoft.ua/documents/technic-bpms/7-9/kak-ispolzovat-…
А в общем для создания собственного процесса Вы можете в качестве примера развернуть бесплатную демо-версию и в библиотеке процессов открыть на просмотр схему процесса. В результате сделать свой по аналогии. Для наглядности прикреплены скриншоты.

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

Коллеги, здравствуйте!
Необходимо настроить права для поиска дублей для bpm 7.9.0. В документации этого не нашла, попался небольшой документ для версий 3.х https://community.terrasoft.ru/system/files/duplicates_search_setting...
Подскажите, пожалуйста, какие-либо материалы по данному вопросу, либо может, кто-то с этим сталкивался?

Нравится

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

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

Права доступа на работу с функционалом дедупликации настраиваются в соответствующих правах доступа на операции: 1. Доступ к правилам поиска дублей; 2. Обработка дублей; 3. Поиск дублей.
Во вложении прикреплен скриншот для наглядности. Для каждой из вышеуказанных операций можно дать права определенной роли или конкретному пользователю.
Базовый функционал и логика поиска дублей описана в руководстве пользователя (+ статьи см. также): https://academy.terrasoft.ru/documents/sales-commerce/7-9/globalnyy-poi…

Валерий, спасибо большое!

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

Здравствуйте.
Мне надо в карточке контакта (ContactPageV2) по нажатию кнопки (UsrAddBtn), добавить несколько значений детали (UsrLoyaltyDetail и к ней относящиеся объект и страница соответственно UsrLoyaltyObj, UsrLoyaltyDetailPage). Как это сделать?

Причем одно из полей детали, берется из поля ContactPageV2 (допустим из: UsrString).

Обработчик кнопки есть, что в него вписать?

Нравится

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

Здравствуйте,
Для чтения данных из колонок карточки, в контексте карточки можно использовать просто var myValue = this.get("UsrString")
Если данные нужно вытащить из другого объекта, можно было бы использовать EntitySchemaQuery:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-r…
Для записи значения детали, используйте InsertQuery, множество примеров использования можете посмотреть в базовой конфигурации, к примеру в схеме EmailPageV2 из UIv2:

var roleId = ConfigurationConstants.Activity.ParticipantRole.Participant;
var insert = this.Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: "ActivityParticipant"
});
var id = Terrasoft.utils.generateGUID();
insert.setParameterValue("Id", id, Terrasoft.DataValueType.GUID);
insert.setParameterValue("Activity", activityId, Terrasoft.DataValueType.GUID);
insert.setParameterValue("Participant", contactId, Terrasoft.DataValueType.GUID);
insert.setParameterValue("Role", roleId, Terrasoft.DataValueType.GUID);

insert.execute();

Так же небольшой пример с пакетной записью есть здесь:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-detali-…

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

сообщение
messages: {
			"GetLoyalty": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		}

отправка

this.sandbox.publish("GetLoyalty", id1, [this.sandbox.id])

где id1 = { value: itemID, displayValue: Лояльный }

В карточке Детали, идет прием:
сообщение:

messages: {
			"GetLoyalty": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		}

подпись:

init: function() {
				var sandID = "CardModuleV2_dad159f3-6c2d-446a-98d2-0f4d26662bbe_ContactPageV2"; //sandboxID - карточки контакта
				this.callParent(arguments);
				this.sandbox.subscribe("GetLoyalty", function(recordId) {
					var id = {
						value: recordId.value,
						displayValue: recordId.displayValue
					};
					this.set("UsrLoyalty", id);
					}, this, [sandID]);
}

Где у меня промашка? Предполагаю, что как-то с айдишками накосячил.

"Михайловский Илья Викторович" написал:Где у меня промашка?

Зачем вы что-то отправляете в схему детали, все же намного проще. Если вам нужно то, что вы изначально написали в теме, а именно создание записи (новой строчки) для детали которая размещена на карточке ContactPageV2. То вам достаточно писать код только в схеме ContactPageV2.

Не нужно использовать песочницу, передавать сообщение между схемами. Просто сделайте Terrasoft.InsertQuery в объект детали с нужными данными.
И в колбеке, кстати вот как можно писать колбек во время вызова создания записи:

insert.execute(function(response) {
if (response && response.success) {
this.updateDetail({detail: "SupplyPayment"});
}
}, this);

напишите this.updateDetail({detail: "SupplyPayment"}); что вызовет перезагрузку детали, и отобразит созданные записи. Где SupplyPayment имя детали, так, как оно написано в схеме ContactPageV2 в блоке details.

"Максим Шевченко" написал:
Михайловский Илья Викторович пишет:

Где у меня промашка?

Зачем вы что-то отправляете в схему детали, все же намного проще. Если вам нужно то, что вы изначально написали в теме, а именно создание записи (новой строчки) для детали которая размещена на карточке ContactPageV2. То вам достаточно писать код только в схеме ContactPageV2.

Не нужно использовать песочницу, передавать сообщение между схемами. Просто сделайте Terrasoft.InsertQuery в объект детали с нужными данными.

И в колбеке, кстати вот как можно писать колбек во время вызова создания записи:

insert.execute(function(response) {

if (response && response.success) {

this.updateDetail({detail: "SupplyPayment"});

}

}, this);

напишите this.updateDetail({detail: "SupplyPayment"}); что вызовет перезагрузку детали, и отобразит созданные записи. Где SupplyPayment имя детали, так, как оно написано в схеме ContactPageV2 в блоке details.


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

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

onEntityInitialized: function() {
this.callParent(arguments);
// ваш код
}

делаете EntitySchemaQuery запрос к объекту контакта, с фильтром по Id, достаете нужные данные, и в колбеке делатете this.set( ... нужным колонкам карточки детали.

Id родительской записи из которой добавляется запись детали, в карточке детали можно получить по колонке связи, подозреваю колонка связи в объекте детали у вас контакт, возможно с приставкой Usr, значит получить её ид можно так:
this.get("UsrContact").value

Но как именно это сделать, не могли бы написать код?
Карточка конткта: UsrContactPageV2 (объект контакта: UsrContact)
поле из которого нужуно получить значение (справочное): UsrLoyalty
деталь: объект - UsrLoyaltyObj, карточка: UsrLoyaltyObj1Page
поле куда надо поместить в детале: UsrLoyalty

"Михайловский Илья Викторович" написал:не могли бы написать код?

Код написать не видя всей картины, всех полей объектов карточки и детали, нет, но выше достаточно информации для написания данной логики самостоятельно,
больше всего почитайте про https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-r…
если возникнут точечные трудности, обращайтесь. Так же если у вас достаточный пакет поддержки для консультаций по разработке, можете обратится в поддержку террасофт с предоставлением доступа к сайту: support@terrasoft.ru

"Максим Шевченко" написал:
Михайловский Илья Викторович пишет:

не могли бы написать код?

Код написать не видя всей картины, всех полей объектов карточки и детали, нет, но выше достаточно информации для написания данной логики самостоятельно,

больше всего почитайте про https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-re...

если возникнут точечные трудности, обращайтесь. Так же если у вас достаточный пакет поддержки для консультаций по разработке, можете обратится в поддержку террасофт с предоставлением доступа к сайту: support@terrasoft.ru


Ну вот взял из примера:

// Получаем [Id] объекта карточки.
var recordId = this.get("Id");
// Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "Contact"
});
// Добавляем колонку с именем основного контакта контрагента, который относится к данному контакту.
esq.addColumn("Account.PrimaryContact.Name", "PrimaryContactName");
// Получаем одну запись из выборки по [Id] объекта карточки и отображаем ее
// в информационном окне.
esq.getEntity(recordId, function(result) {
    if (!result.success) {
        // обработка/логирование ошибки, например
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    this.showInformationDialog(result.entity.get("PrimaryContactName"));
}, this);

Не работает, вернее выдает пустое сообщение...

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

"Максим Шевченко" написал:

Что-то я не понял как работает InsertQuery.
Есть деталь (UsrLoyaltyObj), со справочными полями (UsrLoyalty, usrParam)
Так деталь выглядит в карточке контакта:
Эта деталь на на странцие контакта
Ну и далее в обработчике кнопки:

var insert = Ext.create("Terrasoft.InsertQuery", {
					rootSchemaName: "UsrLoyaltyObj"
				});
				insert.setParameterValue("UsrLoyalty", "ТЕКСТ", Terrasoft.DataValueType.TEXT);
				insert.setParameterValue("UsrParam", "Parametr", Terrasoft.DataValueType.TEXT);
				insert.execute(function(response) {
					window.console.log(response);
				});
				this.reloadGridData();

Что именно указывать в рут схема? (Карточку контакта или карточку детали). и сет параметерс, думаю это заполнено верно. Но чего-то не хватает...

"Михайловский Илья Викторович" написал:Или есть какой-то способ узнать, айди контакта который открыл карточку?

Контакта, который открыл карточку? Вы про пользователя который работает в системе? Или все же про Id карточки контакта из которой открыта карточка детали? Если второе, то выше был ответ, this.get("... колонки связи с карточкой контакта, тоесть, колонка справочного типа "Контакт" в карточке детали. Если же про первое, то:
ar currentUserContactId = this.Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

"Михайловский Илья Викторович" написал:Что именно указывать в рут схема? (Карточку контакта или карточку детали). и сет параметерс, думаю это заполнено верно. Но чего-то не хватает...

В rootSchemaName вы пишите имя объекта, В КОТОРЫЙ хотите добавлять запись, setParameterValue вроде верный, вначале имя колонки, второй параметр значение, третий, тип данных.

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

Добрый день, проблема заключается в том, чтобы отобразить мини-карточку при нажатии кнопки new, для добавления новой записи с возможностью установки значений, а для существующих записей отображать мини-карточку в режиме просмотра при наведении мышкой. Буду рад любым советам и идеям) Заранее большое спасибо всем откликнувшимся =)

Нравится

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

Здравствуйте, каким элементом в бизнес процессах можно обрабатывать входящие email сообщения? Необходимо, вытягивать email отправителя и если такой контакт есть в базе, то чтобы он автоматически подставлялся в это входящее сообщение в поле “привязать контакт”.

Нравится

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

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

Алгорит решения:
1. Стартовый сигнал по добавлению записи в объект Активности, где Тип = Email, Тип сообщения = Входящее.
2. Читать данные в активностях, где Id = Пункт 1. Id
3. Читать кол-во записей в контактах, где Email = Пункт 2. От кого
Условный поток: Если кол-во записей > 0 - изменить активносить
Поток по умолчанию: завершить процесс

Спасибо :smile:
А можно ли как-то сделать с помощью БП, чтобы в карточку контакта во вкладку “История” привязывалось полученное входящее сообщение? В блоке “Изменить данные” нет полей из вкладки “История” для установки id активности, а в "История раздела Контакты (представление)" есть только поле контакт :sad:

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

Для того, чтобы привязать активность (с типом Email) к контакту необходимо в активности заполнить поле Контакт.
В рамках процесса следует использовать элемент "Изменить данные". В активности заполнить поле Контакт интересующим значением.

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

!
с чем это может быть связано?

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

На детали "Активности" отображаются записи из раздела "Активности", у которых тип = Email. Активности с типом Email отображаются на детали "Email".

Базовая логика приложения скрывает деталь в двух случаях:

  1. У контакта тип "Сотрудник"
  2. У контрагента контакта тип "Наша компания"

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

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

.

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

Задача следующая: при настройке прав доступа на группу статей в базе знаний, раздавать те же права на все подгруппы в ней (а так же все статьи им соответствующие).
Замещать модуль Rights или RightUtilities (и создать свой сервис, унаследовавшись от RightsHelper) не хочется, т.к. при его изменении в последующих обновлениях пришлось бы постоянно переписывать замещающий модуль.
Лучшим решением казались триггеры в БД на INSERT для таблицы [SysKnowledgeBaseFolderRight]. Я использовал два курсора (один вложен в другой) для перебора записанных строк, и подгрупп для каждой группы. Но если уровень подгрупп больше 1, триггер не отработает т.к. пытается по сути объявить курсор, который уже объявлен.
Да и каким образом с помощью триггера раздавать права на статьи в группах не имею представления.
Есть ли еще варианты, или все-таки придется замещать модуль Rights (RightUtilities)?

Нравится

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

Примерный(костыльный вариант):
1) расковырять схему Rights. В методе onSaveClick

RightUtilities.applyChanges({
	"recordRights": changedRights,
	"record": {
		entitySchemaName: this.get("entitySchemaName"),
		primaryColumnValue: this.get("primaryColumnValue")
	}
}, this.onChangesApplied, this);

т.е у нас есть список прав, название схемы с фильтрами в entitySchemaName, id фильтра в primaryColumnValue.
По идее, если entitySchemaName === "KnowledgeBaseFolder", то запускаем свою логику по изменению прав записей
2) Выбираем из KnowledgeBaseFolder вложенные папки, где ParentId = Id главной папки, получаем коллекцию, бежим по каждой записи
3) Для каждого элемента вставляем/удаляем запись в таблицу SysKnowledgeBaseFolderRight. Значения берем из переменной changedRights с п1.

Для записей еще жестче:
п1. такой же
2) Выбираем из KnowledgeBaseFolder фильтр по id, который мы знаем из предыдущего пункта, нужна колонка SearchData. Там лежит мусор) Весь вопрос как этот хлам преобразовать в сериализованый(или нет) фильтр.
3) Выбираем из KnowledgeBase все записи с фильтром из п2, получаем коллекцию, бежим по каждому элементу коллекции.
4) Для каждого элемента из базы знаний вставляем/удаляем запись в таблицу SysKnowledgeBaseRight. Значения берем из переменной changedRights с п1.

как-то так :smile:

upd. Только что проверил, в п2. берем entity по id, потом

var folderFilter = Terrasoft.deserialize(result.entity.values.SearchData);

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

Спасибо за ответ :smile:
В принципе я, не найдя другого решения, делаю примерно тоже самое. Заместил модуль RightUtilities, в котором меняю вызываемый сервис на свой в методе callServiceMethod, если вызывается метод "ApplyChanges".
Далее уже на сервере проверяю имя схемы, и если это KnowledgeBaseFolder - рекурсивно прохожусь по всем подпапкам раздавая права, а также выбираю фильтры у каждой, десериализуя их и раздавая права на статьи.
Старался максимально вынести функционал на сервер. Таким образом при обновлении версии/билда если изменится RightUtilities - придется добавить в него всего одну строку. А на сервере я создаю экземпляр класса RightsHelper и вызываю у него метод ApplyChanges, как это делается в базовом RightsService (что в принципе устойчиво к обновлениям).

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

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

Нравится

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

Здравствуйте, Мария!

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

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

Добрый день, необходимо изменить тип поиска с типа «Начинается с» на «Содержит». В системных настройках в настройке "Тип сравнения для строковых колонок" установили значение по умолчанию равное “1”, перезашли в црм, кеш очистили, но все равно тип поиска не изменился, все еще необходимо искать в таком формате: %продукт%. Подскажите пожалуйста, в чем может быть проблема?

Нравится

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

Здравствуйте, Мария!

Системная настройка "Тип сравнения для строковых колонок" влияет только на поиск в быстром фильтре. В версии 7.9.0 поиск в быстром фильтре для справочных полей был доработан - при фильтрации по справочному полю система предлагает варианты, названия которых начинаются с введенного в поиске текста.

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

Спасибо за быстрый ответ :smile:, а как тогда можно поменять тип поиска в окне справочника, чтобы не осуществлять поиск с % ?

:smile:

Нужно заместить схему LookupPageViewModuleGenerator. Метод pushSelectFilters отвечает за тип поиска. В коробочной версии тип поиска START_WITH.

В замещающей схеме Вам необходимо заменить тип поиска на CONTAIN.

Поиск "%запрос%" отрабатывает значительно медленнее, чем поиск "запрос%".

Спасибо! :smile:
Возник еще такой вопрос по этой теме:
когда вбиваем текст просто в поле, то без % не находит туры:

а если через всплывающее окно, то нормально срабатывает:

Можно ли как-то реализовать, что бы и в поле поиск работал без % ?

Для изменения типа сравнения с первого скриншота, вам необходимо изменить возвращаемое значение метода "getLookupComparisonType" в файле all-combined, сделать это можно если у вас сайт on-site самостоятельно, если же на серверах bpm'online то через службу поддержки.

.

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

Добрый день!
Пытаюсь выполнить post запрос из консольного приложения к методу из wcf сервиса. GET запросы проходят без проблем. Но с POST запросами возникли проблемы. Возвращается ошибка " Удаленный сервер возвратил ошибку: (401) Несанкционированный.". Авторизацию прохожу как в документации https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-v.... Тестовый сервис:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class UsrTestService
        {
            [OperationContract]
            [WebInvoke(Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]
                public string TestMethod()
                {
                        return "test";

                }
}

Пытаюсь обратится к методу TestMethod:
"http://myserver.com/0/rest/UsrTestService/TestMethod"
При этом, если вызывать метод из интерфейса bpm - все работает. Можете подсказать что могло пойти не так, возможно, я какие то настройки не выполнила?

Нравится

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