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

Нравится

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

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

Добрый день!

Для решения задачи можно использовать свойства и методы DateTime (в данном случае .AddDays()). Подробней можно найти в документации msdn - https://msdn.microsoft.com/ru-ru/library/system.datetime(v=vs.110).aspx
Предположим есть дата проведения презентации [dd.mm.yyyy]
Создавать активность с помощью “Добавить данные”. Установить значение:
Начало = [dd.mm.yyyy].AddDays(-1)

Воспользовался Вашим советом. В моем случае нужно запустить цикл добавления записей +2 дня начиная с сегодня. Выходит в параметр я выбираю текущую дату [#Системная переменная.Текущее значение даты#].AddDays(-2)

Но если я к выбранному параметра уже добавляю 2 дня, при сохранении БП выдает ошибку.

Схема содержит ошибки: AddDataUserTask1.RecordDefValues.UsrDateDelivey [Невозможно вычислить выражение "[#[IsOwnerSchema:false].[IsSchema:false].[Element:{6b480f6c-2178-466d-9795-c8c615a5bf89}].[Parameter:{5a11f02a-3da8-417f-9f7e-0e264134e07d}].[EntityColumn:{d9be5aff-6fa8-4739-982f-881cfb12ec0e}]#].AddDays(-2)", ошибка: Exception has been thrown by the target of an invocation.].

Если дело в «Exception has been thrown by the target of an invocation», то это может быть связано с настройками компьютера, где происходит компиляция, а не в цифре 2.

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

Здравствуйте. Уже создавал тему на подобии. Нужна помощь в создании строки расчёта с функцией "итоги". В строке будет рассчитываться общий закуп всех товаров в одном заказе.
Создана строка "Сумма закупа" (UsrTotal) с типом данных "Деньги". Она должна считать общую сумму затрат на покупку всех товаров в заказе.
Для этого созданы две строки "Покупная цена" (UsrPrice), где рассчитывается стоимость одного товара и "Итого дил." (UsrTotalDil), тут рассчитывается сумма закупа в зависимости от кол-ва товаров в строке.

В предыдущем посту писали, что итог рассчитывается из этой схемы:

Guid currencyId = Entity.GetTypedColumnValue("CurrencyId");
decimal currencyRate = Entity.GetTypedColumnValue("CurrencyRate");
var currencyEntity = UserConnection.EntitySchemaManager.GetInstanceByName("Currency").CreateEntity(UserConnection);
currencyEntity.FetchFromDB(currencyEntity.Schema.GetPrimaryColumnName(), currencyId, new[] { "Division" });
decimal division = currencyEntity.GetTypedColumnValue("Division");
decimal currencyFromPrimaryFactor = division!= 0? currencyRate / division : 0;
var update = new Update(UserConnection, "OrderProduct")
.Set("CurrencyId", Column.Parameter(currencyId))
.Set("CurrencyRate", Column.Parameter(currencyRate))
.Set("Price", Column.Parameter(currencyFromPrimaryFactor) * Column.SourceColumn("PrimaryPrice"))
.Set("Amount", Column.Parameter(currencyFromPrimaryFactor) * Column.SourceColumn("PrimaryAmount"))
.Set("DiscountAmount", Column.Parameter(currencyFromPrimaryFactor) * Column.SourceColumn("PrimaryDiscountAmount"))
.Set("TaxAmount", Column.Parameter(currencyFromPrimaryFactor) * Column.SourceColumn("PrimaryTaxAmount"))
.Set("TotalAmount", Column.Parameter(currencyFromPrimaryFactor) * Column.SourceColumn("PrimaryTotalAmount"))
.Where("OrderId").IsEqual(Column.Parameter(Entity.GetTypedColumnValue("Id"))) as Update;
update.Execute();

Буду весьма благодарен за помощь

Нравится

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

Здравствуйте,
А где вы пишите данный код, событийный бизнес-процесс объекта, какого объекта? по событию во время сохранения, после сохранения? И что не так с кодом? Что не получается, в чем трудность?

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

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

А где вы пишите данный код, событийный бизнес-процесс объекта, какого объекта? по событию во время сохранения, после сохранения? И что не так с кодом? Что не получается, в чем трудность?

Здравствуйте, Максим.
Бизнес-процесс объекта "Orders". После добавления продуктов в заказе. С кодом всё так. Это код от итогов в том же процессе объекта "Orders". Не получается написать код для нужного мне процесса. Как правильно подставить туда все данные, чтобы всё работало корректно?

"Ануфриев Дмитрий Юрьевич" написал:Не получается написать код для нужного мне процесса.

Это отдельная схема БП созданная в конфигурации? Схема БП со стартовым сигналом?
Если да, то читаете элементами чтения данных, считаете формулами или скрипт тасками, и пишите изменением или добавлением данных.
Не обязательно все делать кодом, дизайнер БП предоставляет много более удобных механизмов, подробнее:
https://academy.terrasoft.ua/documents/technic-bpms/7-8/obzor-vozmozhno…

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

Добрый день! Есть карточка «Продажи». На данной карточке отображается в виде шкалы рис. 1 справочник «Стадии». Подскажите возможно ли убрать переключения стадии по "линейки стадий". Добавть кнопку "Далее". Логика - переключает стадию сделки на следующую.

Нравится

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

Добрый день!

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

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

Реализовать кнопку конечно же можно - разработчик может сделать почти все :) Однако, ввиду того, что действие данной кнопки должно быть завязано на все стадии процесса, легче было бы просто отключить доступный переход по стадиям (см. абзац 1)

"Мария Ватулина" написал:

Добрый день!

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

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

Реализовать кнопку конечно же можно - разработчик может сделать почти все :) Однако, ввиду того, что действие данной кнопки должно быть завязано на все стадии процесса, легче было бы просто отключить доступный переход по стадиям (см. абзац 1)


Прошу не отвечать безкорсним текстом на сообщения. Я спросил разработчиков, как это можно реализовать. Много текста и я могу написать.

Добрый день! Можно убрать переключение стадий в продаже по шкале стадий. За данную функциональность отвечает в первую очередь ActionsDashboardModule. Можете заместить схему Страница редактирования продажи (OpportunityPageV2) в пакете Opportunity. В замещенной клиентской схеме удалить в секции diff: [...] элемент ActionsDashboardModule примерно следующим кодом:
{
"operation": "remove",
"name": "ActionsDashboardModule",
"parentName": "ActionDashboardContainer",
"propertyName": "items",
"values": {
"classes": {wrapClassName: ["actions-dashboard-module"]},
"itemType": Terrasoft.ViewItemType.MODULE
}
} и далее добавить кнопку "Добавить", по клику на которую должен будет срабатывать обработчик, вызывающий перегрузку карточки в связи с переходом на новую стадию. Для этого потребуется переопределить метод subscribeSandboxEvents: function() {...} и все связанные с ним методы, вызываемые через механизм посылки сообщений.

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

Коллеги, можете уточнить, как правильно подключать VisaNotificationProvider в sales enterprice 7.8? Добавила в конфигурацию исходный код для OpportunityVisaNotificationProvider, по примеру кода для счетов и заказов, но после этого визирование всех сущностей перестало работать, хотя в Журнале процессов вижу, что процессы визирования запускаются.
Что еще может потребоваться, чтобы правильно создать провайдер, кроме создания исходного кода в конфигурации для OpportunityVisaNotificationProvider?

Нравится

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

Добрый день, Анастасия!

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

"Злыднева Анастасия Сергеевна" написал:Добавила в конфигурацию исходный код для OpportunityVisaNotificationProvider, по примеру кода для счетов и заказов

Также, предоставьте, пожалуйста, указанный код для анализа

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

Добрый день! В sales enterprice 7.8 необходимо в зависимости от значения в справочной колонке "Валюта" показывать одну печатную форму и скрыть другую. Как управлять видимостью печатных форм в таком случае?

Нравится

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

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

За функционал печатных форм отвечает миксин PrintReportUtilities. Генерация коллекции печатных форм происходит в методах initCardPrintForms и initSectionPrintForms. События клика на печатных формах в секции и карточке редактирования обрабатываются в методах generateCardPrintForm и generateSectionPrintForm. Для изменения логики стандартных печатных форм необходимо заместить данные методы с добавлением пользовательской логики(фильтрации).

Как альтернативное решение, Вы можете добавить пользовательскую кнопку печати и при клике обращаться к вэб сервису напрямую. Реализацию обращения к вэб сервису для печати "Печатных форм", Вы можете посмотреть в методе generatePrintForm схемы PrintReportUtilities (NUI).

Также вопрос обсуждался здесь.

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

Добрый день!
Коллеги , есть поле Summa тип - дробное число, обязательное
почему то при указании там значения 0 (ноль) система все равно просит заполнить поле , сохраняет если значение кроме 0, обязательность указывал в обьекте через конфигуратор и пробовал через код в Атрибутах.
как быть, может где то есть настройки диапазона значений??
мне нужно чтобы было либо 0 либо другое число.

Нравится

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

Если нужно хранить или ноль, или ненулевое число, то поле нужно сделать необязательным. В базе числовые дробные поля хранятся как decimal not null и нельзя отличить изначально незаполненное поле с «0» от значения «0», которое ввёл пользователь.

"Зверев Александр" написал:

Если нужно хранить или ноль, или ненулевое число, то поле нужно сделать необязательным. В базе числовые дробные поля хранятся как decimal not null и нельзя отличить изначально незаполненное поле с «0» от значения «0», которое ввёл пользователь.


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

А как Вы отличите незаполненное от заполненного нулём?
Контролы для ввода чисел не умеют отображать null.

но ведь 0 это совсем не NULL , тем более если это поле далее участвует в формулах и расчетах,
поэтому оно должно быть обязательно заполненным.

Все числовые поля идут со свойством not null, поэтому null в этой ячейке не бывает.

Мы делали рядом CheckBox, который снимался, когда вводили в поле 0

"Владимир Соколов" написал:

Мы делали рядом CheckBox, который снимался, когда вводили в поле 0


Владимир можете чуть подробнее, если не сложно то с примерами кодов?

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

В sales enterprice 7.8 в новом кастомном разделе нужно разместить деталь Email.
Делаем по примеру детали Email в разделе Контрагенты, но после добавления к детали фильтра по типу Активности "Email" деталь исчезла со страница:

details: /**SCHEMA_DETAILS*/{
"EmailDetailV2b2a8a790": {
"schemaName": "EmailDetailV2",
"entitySchemaName": "Activity",
"filter": {
"detailColumn": "UsrEmailRequest",
"masterColumn": "Id"
},
"filterMethod": "emailDetailFilter"
}
}

methods: {
emailDetailFilter: function() {
var recordId = this.get("Id");
var filterGroup = new this.Terrasoft.createFilterGroup();
filterGroup.add("UsrRequestNotNull", this.Terrasoft.createColumnIsNotNullFilter("UsrRequest"));
filterGroup.add("UsrRequestConnection", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "UsrRequest", recordId));
filterGroup.add("ActivityType", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Type", ConfigurationConstants.Activity.Type.Email));
return filterGroup;
},
}

Нравится

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

Откройте F12 и покажите консольную ошибку что возникает, без нее сложно понять что пошло не так.

последняя ошибка полностью https://yadi.sk/i/y9p6VWJDwhYmm

Коллеги, отмена, спасибо! Нужно было в схеме объявить зависимость от модуля ConfigurationConstants

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

Всем доброго времени суток!

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

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

Версия 7.8 sales.

Нравится

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

Как вариант

Подобная функциональность уже есть в OktellCtiProvider и WebitelCtiProvider.
Что нужно сделать:
1. Создать свой cti-провайдер - наследний MsgServiceCtiProvider. Например, AsteriskCtiProvider. Прописать этот провайдер в таблице SysMsgLib для Asterisk;
2. В методе getCapabilities провайдера вернуть для agentCapabilities фичу Terrasoft.AgentFeaturesSet.CAN_GET_CALL_RECORDS;
3. Реализовать метод получения записей звонка по идентификатору в методе queryCallRecords провайдера.

Прослушивание в коробке не все АТС могут - https://academy.terrasoft.ru/documents/sales-enterprise/7-8/sravnenie-v…

Илья, здравствуйте!

Работа с АТС - в процессе, но ей занимаюсь немного не я.. меня интересует именно клиентская реализация проигрывателя.

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

<audio>

Есть контрол AudioPlayer, судя по всему, входящий в пакет CTI Base. Как его подключить на страницу?

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

Примеры реализации, которые используются например при интеграции с Oktell есть в пакете CTIBase, в частности схемы AudioPlayer и CallRecordUtilities.

"Мотков Илья" написал:в пакете CTIBase, в частности схемы AudioPlayer

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

В объекте страницы (entitySchemaName) по сути есть колонка со строкой-ссылкой на аудиофайл, которая подставляется в нужное место внутрь тега.

Но есть ещё одна задача, возможно, не совсем в рамках вопроса - нужно тот же элемент отобразить на странице с реестром. Возможно где-то были примеры добавления элементов не на страницу, а в список (см. скриншот)?

Денис, в базовой функцитональности мы тоже выводим плеер в реестр. Скриншоты прикрепил. Реализация есть в CallSectionV2 также в пакете CTIBase.

Илья, спасибо, всё добавили.

Добрый день! Можете скинуть пример реализации плеера на странице?

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

Примеры реализации Вы можете посмотреть в конфигурации bpm'online в пакете CTIBase в следующих схемах:
CallSectionV2.js - тут Вам необходимы методы getPlayer: function(), getSourceId: function(), requestCallRecords: function(autoStartPlay)
AudioPlayer.js - схема реализации аудиоплеера
allSectionGridRowViewModel - класс модели представления строки реестра звонков

Мотков Илья,

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

AudioPlayer но в ответ получаю лишь 'AudioPlayer' is not defined.

Мотков Илья,

Здравствуйте, подскажите пожалуйста, возможно ли реализовать прослушивание аудио не в разделе, а в карточке звонков? И если да, то как именно. Пробовал подключить 

AudioPlayer, но получаю подобную ошибку "'AudioPlayer' is not defined.", хотя модуль же есть в системе. 

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

Здравствуйте! Продукт sales enterprice 7.8
В карточке счета нужно считать сумму значений колонки Итого продуктов на детали "Продукты" и сохранять в колонку Итого в карточке счета.

Нравится

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

Добрый день! На странице «Продажи» при добавлении продуктов срабатывает базовый бизнес процесс расчета Суммы рис. 1.
Вид БП рис. 2
В нем вызывается базовый метод «CalckOpportunityAmount», который обновляет поле Сумма на странице Продажи рис 3.
Подскажите пожалуйста, как можно заменить (изменить метод расчета CalckOpportunityAmount) базового бизнес процесса.

Нравится

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

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

Вам необходимо:
1) Заместить объект "OpportunityProductInterest"
2) Открыть процесс замещенного объекта
3) Среди методов процесса выделить метод "CalckOpportunityAmount"
4) Проставить признак "Переопределен"
5) Реализовать нужную логику без вызова родительского метода.

Демьяник Алексей. Большое спасибо!

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