Добрый день.

Как можно перенести созданные дополнения с тест среды на продуктивную?

Нравится

1 комментарий
пропала страница
Технические вопросы
7.x

Начинаю изучать BPM'Online(Версия 7.6.0.1114). Нужно создать действие которое запускает БП в разделе лид(нужно передать параметр), поискав немного я нашел вот что:
http://www.terrasoft.ua/bpmonlinesdk/CreateActionForStandartSection.html
https://community.terrasoft.ua/forum/topic/11626
сделал все как книжка пишет, создал новый Замещающий клиентский модуль, выбрал родительский объект LeadPageV2, вставил код, сохранил.
в клиенте перезалогинился перехожу в раздел Лиды, нажимаю на лид и открыть, вот что вижу:
Думаю мой модуль чет напартачил, удаляю его, ничего не поменялось. Кто сталкивался с подобной проблемой прошу помочь.

Нравится

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

Добрый день!
Можно нажать f12 в браузере и посмотреть, что за ошибка

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

Вы использовали инструкцию по добавлению действия, которая неактуальна для версии 7.6 (она используется для версий bpm'online 7.0 - 7.2).

В более поздних версиях, в том числе и в 7.6, алгоритм создания действий претерпел изменения. Актуальную документацию по разработке в 7.6 вы можете найти на нашем сайте Академии - http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0.

В частности, инструкции по добавлению действий в раздел и на страницы редактирования расположены в блоке [SDK bpm'online] >[Примеры решения типовых задач] > [Разработка клиентского интерфейса].

Кстати, рекомендую обратить внимание на статью http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ExecutePro…, в которой как раз рассматривается Ваш кейс (запуск процесса по действию раздела).

Я воспользуюсь этими статьями. Но сейчас важно вернуть страницу

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

схемы я уже удалил, не помогло

Виталий, обновите страницу браузера с очисткой кэша страницы. Для этого нажмите F12 для открытия консоли, после чего правой кнопкой мыши нажмите на кнопке обновления страницы, выберите последний пункт.

Если данное действие не поможет, сообщите, точно ли удалена страница LeadPageV2, выполнено действие "Компилировать все" и очищен кэш страницы по инструкции выше.

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

Пример можно посмотреть в любой схеме из базовых пакетов:

define("LeadPageV2", ["LeadPageV2Resources", "BaseFiltersGenerateModule", "ProcessModuleUtilities",
		"LeadConfigurationConst", "BusinessRuleModule", "ConfigurationEnums",
		"BaseProgressBarModule", "EntityHelper", "css!BaseProgressBarModule"],
	function(resources, BaseFiltersGenerateModule, ProcessModuleUtilities, LeadConfigurationConst, BusinessRuleModule,
			enums) {
		return {
			entitySchemaName: "Lead",
...

фух, решил, перепроверил все еще раз и получилось, ошибка в коде была.
сделал все по этой инструкции: http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ExecutePro…

Добрый день!
Подскажите мне тоже, плзз!

Также пропала страница (case)... Но даже после удаления всех своих объектов и пакета кастомного, обновления редис, аппаратной очистки кэша, компиляции конфигурации страница не вернулась.

Прикрепила страницу с ошибками консоли.

подскажите, как поступить.

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

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

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

Добрый вечер,
Создал процесс добавил в него элемент "Открыть страницу редактирования" передаю туда ID записи, отрабатывало все нормально, после добавления логики в БП - процесс запускается и останавливается на шаге Открыть страницу редактирования, причем в журнале он отображается как "Выполняется"
1
Кнопка "Выполнить элемент" при этом не активна, т.е. после клика по ней ничего не происходит, никаких ошибок в консоле не появляется.
Подскажите в какой стороне вообще искать проблему? Этот элемент не изменялся с тех пор как работал нормально, что могло привести к подобному поведению?

Нравится

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

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

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

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

P.S. в принципе проблема решилась сама собой, как и возникла, сейчас вроде нормально все работает. Сутки не работало и само вернулось в норму

Скорее всего, на одном сервере развернуто несколько сайтов, которые "смотрят" на один порт. По умолчанию это 2011 порт. У каждого сайта должен быть свой уникальный порт. Указанные порты должны быть открыты в фаерволе.

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

ReadDataUserTask1.ResultEntityCollection.Count() < 1

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

попробовал поместить процесс в планировщик используя инструкцию но процесс также не запустился

попробовал поместить процесс в планировщик используя инструкцию но процесс также не запустился

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

1) Порты должны быть уникальными файле web.config приложения, а не в IIS
2) Уточните, пожалуйста, продукт и версию (по вопросу того, что процесс не запускается в указанное в таймере время).

1. в какой строке указывается порт в web.config? не смог найти
2. bpm'online Sales Версия 7.5.0.1328

Отправляю файл по корректной настройке.
Запросите у поддержки более новую версию и обновите приложение.

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

Были получены логи сервера. После изучения будет предоставлен ответ в созданном обращении 0260635.

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

Добрый день!
Есть такой процесс в ITIL - процесс наполнения очередей единого окна,
который запускается автоматически ( когда пользователь в системе) каждые 5 минут ( в соответствии с указанным интервалом-системной настройкой "интервал обновления очередей единого окна")

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

Нравится

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

Здравствуйте, Дарья!

Эта логика прописана в самом процессе - перед завершением он записывает время своего следующего выполнения в планировщик, предварительно "посмотрев" на системную настройку.

Вот такой он бессмертный!

Добрый день, Александр!
Спасибо за секрет бессмертия))
Видела элемент в процессе "актуализировать задание планировщика"
UserConnection userConnection = context.UserConnection;
Terrasoft.Configuration.QueuesUtilities.UpdateQueuesTrigger(userConnection);
return true;

Но не поняла до конца, где находится сам планировщик, что он собой представляет в bpm? - (хотела бы записывать туда время выполнения еще одного процесса)

Здравствуйте, Дарья!
Александр Вам в этом случае не поможет - будет помогать Алексей.:smile:

Добавьте в задание-сценарий код:

string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "ProcessingEmail"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 30; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Укажите в Usings Quartz.Impl.Triggers (с пустым псевдонимом), Quartz (с псевдонимом Quartz ), Terrasoft.Core.Scheduler (с пустым псевдонимом).

спасибо, Алексей))

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

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

спасибо, все получилось)

Добрый день, при использовании следующего кода

string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "ProcessingEmail"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 30; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

В 7.5 все работает нормально, в 7.7 выдает следующую ошибку
1
В чем может быть ошибка и как ее исправить?

Добрый день!

Пример добавления триггера в планировщик для версии 7.7:
var userConnection = Get("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "UsrTestScheduler"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 20; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Добрый день!
При попытке использовать следующий код, который привел Олег

var userConnection = Get("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "UsrTestScheduler"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 20; //- Количество секунд до старта
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Выдает следующую ошибку:
1

Олег,

Извиняюсь, глаз замылился;) Текст в треугольных скобках в комментах опускается.

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

"Зарицкий Олег" написал:Пример добавления триггера в планировщик для версии 7.7:

Пора в документацию вставлять

Владимир, скоро появится.

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

Владимир, скоро появится.

Здравствуйте! Каким образом можно в бизнес-процессе не только создавать триггер в планировщик, но и во всех активностях, где Завершение < DateTime.Now, устанавливать “Просроченная активность” = true?
(чекбокс “Просроченная активность” - пользовательское поле, созданное нами)

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

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

В фильтре укажите "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня".

"Демьяник Алексей" написал:

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

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

В фильтре укажите "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня".

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

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

"Демьяник Алексей" написал:

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

Планировщик на каждые, допустим, 5 минут + описанный вами процесс - единственно возможное решение кейса, Алексей? Или можете подсказать еще какое-то решение?

Здравствуйте!
Не получается в sales team 7.8 реализовать в бизнес-процессе, чтобы активности отмечались просроченными, если Завершение <= Текущие дата и время.

Бизнес-процесс состоит из элемента "Задание-сценарий" (там размещен код планировщика) и из элемента "Изменить данные активности", где Данные какого объекта изменить: Активность, а в фильтре указано, что менять нужно активности, у которых Состояние не равно "Завершена" И Завершение <=Текущие дата и время (Текущие дата и время - это параметр процесса со значением "[#Системная переменная.Текущее значение даты и времени#]").

Проблема: планировщик запускается с нужным интервалом, но меняет все незавершенные активности, игнорируя фильтр по дате завершения в элементе "Изменить данные активности". Что делаю неправильно?
Предложенный Алексеем вариант условия "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня" также не работает.

Также пробовали в элементе "Изменить данные активности" в фильтре указывать условия:

Состояние не равно Завершена
И
Завершение<Текущие дата и время (где Текущие дата и время - параметр процесса со значением "[#Системная переменная.Текущее значение даты и времени#]").

С данными настройками процесс вообще перестал менять активности.

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

Добрый день!

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

В системе есть объект Product (Продукт) и Tax (Налог). У продукта есть поле "Тип" (Type), и у налога тоже "Тип продукта" (UsrTypeProduct). То есть налог зависит от типа продукта.

Нам нужно, чтобы при выборе продукта с определенным типом, в поле-справочник (Налог) подставлялся налог, соответствующий этому типу продукции.

Я попробовала сделать следующим образом (с помощью кода подстановки):

                attributes: {
                       
                        "Tax": {
                dependencies: [
                   {
                        columns: ["Product"],
                        methodName: "changeTax"
                   }
                ]
            },
                        "Product": {
                                 lookupListConfig: {
                                        columns: ["Type"]
                                }
                        }
                },
                methods: {
                       
                        changeTax: function() {
                                var Product = this.get("Product");
                                if (Product.Type.displayValue === "Спермопродукция") {
                                        var ProductType=Product.Type;
                                        var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                                                rootSchemaName: "Tax"
                                        });
                                        var self = this;
                                        esq.addColumn("Id");
                                        esq.addColumn("UsrTypeProduct");
                                        esq.filters.add("Id", Terrasoft.createColumnFilterWithParameter(
                                                Terrasoft.ComparisonType.EQUAL, "UsrTypeProduct", ProductType.value));
                                        esq.getEntityCollection(function(result) {
                                                if (result.success) {
                                                        Terrasoft.each(result.collection.getItems(), function(item) {
                                                                self.set("Tax", item.get("Id"));
                                                        });
                                                }
                                        });
                                }
                        }
                }

Но в поле "Налог" подставляется undefined, он не может однозначно определить налог как я понимаю.

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

Нравится

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

Настя, попробуйте добавить в esq вместо колонки "UsrTypeProduct" колонку "Name". Колонку типа продукта добавлять нет необходимости, так как она нужна Вам только для фильтрации.

Результат запроса попробуйте сохранять в атрибут схемы в виде:

self.set("Tax", {
	value: item.get("Id"),
	displayValue: item.get("Name")
});

Спасибо! Так все работает!)

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

Добрый день!
Скажите, пожалуйста, где в 7.6 itil заполняется контактом текущего пользователя при создании карточки обращения поле ответственный
в 7.5. было непосредственно в объекте case, а где в 7.6?

Нравится

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

Проставляется значение по умолчанию из системной переменной [Контакт текущего пользователя].
Пакет CaseITIL, объект Case, колонка Owner. Это и по умолчанию, и при сохранении.

это в 7.5 было так
в 7.6 по-другому
в 7.6 - только по умолчанию, и где проставляется - не могу найти

В 7.6 логика на объекте была убрана.
Сейчас логика присутствует на карточке CasePage пакета CaseService в методе setOnwer:
/**
* Устанавливает ответственного для нового обращения.
* @protected
*/
setOwner: function() {
var isPortalUser = Terrasoft.CurrentUser.userType === Terrasoft.UserType.SSP;
if (this.isNew && !isPortalUser) {
this.set("Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT);
}
}

спасибо

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

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

EXEC [dbo].[tsp_RegisterSection]
@ModuleCaptionRus = N'[Значение для колонки Caption в русской локализации]',
@ModuleCaptionEng = N'[Значение для колонки Caption в английской локализации]',
@ModuleName = N'SectionModule',
@ModuleSchemaName = N'[Название страницы раздела]',
@ModuleEntityName = N'[Название объекта раздела]',
@ModuleHeaderRus = N'[Заголовок страницы раздела в русской локализации]',
@ModuleHeaderEng = N'List of [Заголовок страницы раздела в английской локализации]',
@ModulePosition = -1,
@TypeColumnName = '[Название колонки типа объекта]'

Здесь, если я не добавляла страницу раздела и не создавала новый объект для раздела что мне следует писать в @ModuleSchemaName = N'[Название страницы раздела]',
@ModuleEntityName = N'[Название объекта раздела]',

Спасибо!

Нравится

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

Здравствуйте, Сабина!

Эта процедура предназначена для регистрации в системе простого раздела без страниц редактирования. В случае, если у Вас нет страницы раздела и объекта, что Вы пытаетесь зарегистрировать?

Нет, раздел есть. Объекта нету.
Этому разделу при открытии передаются Id.
А в разделе отображаются и контакты и активности.
Как на прикрепленной картинке.

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

Спасибо

Сабина, раздел это и есть страница редактирования.
У каждого раздела/страницы редактирования/детали есть объект. У одного объекта может быть несколько страниц редактирования.

Если судить по картинке, то это участники активностей с Вашей стороны и со стороны клиента, а также все активности, которые были. (это на уровне предположения)
В системе уже реализованы подобные детали - "Участники активности" ("Участники продажи") и деталь "Активности" в разделе "Продажи".

Что должен отображать созданный раздел?

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

Здравствуйте, Сабина!

Для изменения прав доступа в системе реализован соответствующий элемент бизнес-процесса "Изменение прав доступа".

Вашу задачу попробуйте реализовать процессом.

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

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

Нравится

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

Здравствуйте.
Добавление кнопки на примере кнопки позвонить описан на форуме:
http://www.community.terrasoft.ru/forum/topic/11933#comment-51756

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

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

Добавление кнопки на примере кнопки позвонить описан на форуме:

http://www.community.terrasoft.ru/forum/topic/11933#comment-51756


Но ведь там описано добавление кнопки в раздел на активную строку?
У меня же добавление справа от поля в карточке раздела

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

В противном случае проще добавить кнопку в требуемый Вам контейнер путем добавления стандартного кода:
diff: {

{
"operation": "insert",
"name": "UsrCommentButton",
"values": {
"caption": "Button",
"click": "call",
"itemType": Terrasoft.ViewItemType.BUTTON,
"style": Terrasoft.controls.ButtonEnums.style.BLUE,
"layout": {"column": 0, "row": 0, "colSpan": 2}
},
"parentName": "Header",
"propertyName": "items",
},

}

Пример использования нажатия кнопки можно посмотреть в CTIBaseCommunicationViewModel функцией onLinkClick: function() которая отправляет сообщение "CallCustomer", c параметрами: номер, идентификатор абонента и название объекта (Контакт или Контрагент).
Данное описание было Вам предоставлено ранее:
http://www.community.terrasoft.ua/forum/topic/12519

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

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

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

Поразмыслив, решили, что это получается отрэндеренный раздел но только по сути на вкладке другого раздела. На данном этапе это не связанные объекты по колонкам, но в перспективе по "Маршрутам" будут создаваться "Активности".

Как мы думаем, это создание дублирующего клиентского модуля BaseSectionV2 с его функционалом, но как избежать нарушений в мэсэджах и ивэнтах стандартного BaseSectionV2.

Буду признателен за совет! Возможно кто-то уже сталкивался с подобного рода задачами.
Спасибо!!!

Нравится

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

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

Если в дальнейшем Вам придется создавать активности по маршрутам, следует создать отдельно раздел маршруты который будет работать с объектом маршрут. Далее добавить кнопку в тот раздел из которого будет выполняться переход в раздел Маршруты (например в ActivitySectionV2). Представления привязаны к объекту. Следует учитывать, что кнопка будет выполнять исключительно функцию перехода, так как будет работать с другим объектом.

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

Дайте, пожалуйста ссылку на описание того, как создавать ЗАМЕЩАЮЩИЕ объекты. Заранее благодарен.

Нравится

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