Уважаемые коллеги!

Прошу Вас помочь решить проблему сравнения дат в бизнес-процессе по наступлению события.
Пытаюсь описать в формуле БП условие ветвления при наступлении события - система выдает ошибку (см. вложенный файл)

Нравится

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

Юрий,

1. Ошибка связна с конструкцией условия. В потоке “Время напоминания наступило” следует указать [Param1] == [Param2] (добавить еще один знак “=”).
2. По поводу задачи. Сравнение параметров с типом Дата/Время выполняется с точностью до секунд. Поэтому шанс, что выполнится условие [Дата напоминания] == [Текущая дата/время] стремится к нулю.
Как вариант можно воспользоваться свойством .TotalMinutes - https://msdn.microsoft.com/en-us/library/system.timespan.totalminutes(v… :
- создать параметр процесса [Дата напоминания] – передать значение из чтения данных
- создать параметр процесса [Текущая дата] – указать значение DateTime.Now
- в условном потоке указать [Дата напоминания] .TotalMinutes == [Текущая дата]. TotalMinutes

Большое спасибо, Олег!

Однако, возникла другого типа ошибка:

[Ошибка при выполнении выражения "ProcessSchemaParameter7.TotalMinutes==ProcessSchemaParameter6.TotalMinutes": No property or field 'TotalMinutes' exists in type 'DateTime' (at index 24)..].

(см. также вложенный файл)

Поправочка! Свойство .TotalMinutes есть только у TimeSpan (у DateTime нет) и возвращает значение с типом дробное.
Т.е. необходимо проверить, что [разница 2 параметров].TotalMinutes = 0.
Результат будет выглядеть как на скриншоте.

"Зарицкий Олег" написал: По поводу задачи. Сравнение параметров с типом Дата/Время выполняется с точностью до секунд.

А не может ли произойти такого, что что-то зависнет, и даже это сравнение не сработает.
Возможно, лучшее будет условие

([Дата напоминания] < [Текущая дата/время] ) && ([Напоминание еще не сработало])

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

Большое спасибо, коллеги!

К сожалению такая конструкция напоминания неэффективная, процессс зацикливатеся и выполняется практически бесконечно.
Предлагается другая конструкция БП (см. вложенный файл):
1. Вычислить разность дат - между датой напоминания и текущей датой, получим количество секунд.
2. Вставляем в обработку таймера полученное время в секундах и через это время происходит отправка e-mail напоминание ответственному.

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

"Ифутин Юрий Борисович" написал: Вставляем в обработку таймера полученное время в секундах

в таком варианте всегда возникает вопрос - а что, если дату напоминания поменяют?

"Ифутин Юрий Борисович" написал:Уважаемые коллеги, помогите пжл. правильно написать в формуле БП разность дат - сколько ни пробовал, сколько ни тренировался, ничего не получилось.

1. Создать 2 параметра процесса с типом Дата/Время
2. Замапить значение параметров процесса на чтение данных.
3. В формуле указать ([Param1] - [Param]).TotalSeconds. Учитывать, что тип возвращаемого значения - Дробное.

в таком варианте всегда возникает вопрос - а что, если дату напоминания поменяют?

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

2. Замапить значение параметров процесса на чтение данных.

Коллеги, подскажите, что значит "замапить" - я этот слэнг пока не понимаю... Если можно, напишите конкретно как это сделать...

Создал параметры дата/время: "Текщуая Дата" и "Дата напоминания ответственному".
Создал параметр дробное число: "Время до напоминания".
В формуле БП написал следующее выражение:
([#Дата напоминания ответственному#]-[#Текущая дтата#]).TotalSeconds
поместил в параметр "Время до напоминания"
В формулу БП "Обработка таймера" написал: [#Время до напоминания#]
При сохранении процесса получил ошибку:
Невозможно преобразовать тип "Decimal" в "Int32" для элемента или параметра "IntermediateCatchTimer1.StartOffset"

И вот так уже второй день - ни фига не получается...

Процес заработал...
Для этого переделал параметр "Время до напоминания" как целое число.
В формуле БП для разности дат написал:
ОкруглитьВниз(([#Дата напоминания ответственному#]-[#Текущая дтата#]).TotalSeconds)

Процесс работает достаточно точно по времени...

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

Как думаете коллеги, как это сделать?

"Ифутин Юрий Борисович" написал:Однако, как и предполагал Владимир Соколов, если поменять дату напоминания, предыдущий процесс надо как-то отменять, так как предыдущий процесс работает до первой даты напоминания и также напоминает по e-mail как и измененная дата ...

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

И стартует этот же процесс на добавление/изменение уведомления.

А если рассмотреть другой алгоритм:

1. Фиксируем "Текущую дату1" при запуске 1-го напоминания
2. Фиксируем "Текущую дату2" при запуске 2-го напоминания
3. Если "Текущая дата2">"Текущая дата1" и (Состояние не равно "Завершена" или Состояние не равно"Отменена"), то Процесс№1 отменить

"Ифутин Юрий Борисович" написал:

А если рассмотреть другой алгоритм

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

Алгоритмов реализации может быть много - главное, чтобы работало.

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

В продукте sales 7.8 добавляю в карточку раздела Продажи новую кнопку, но она видна на странице только после перезагрузки страницы: каждый раз, когда заходишь в карточку, нужно перезагружать страницу, чтобы увидеть новую кнопку.
Как видеть кнопку без перезагрузки страницы?

Нравится

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

Здравствуйте, дело в том, что карточки функционируют в нескольких режимах:
1. Комбинированный режим – это когда по центру карточка, а с боку виден реестр, или даже спрятан, но остается стрелочка для показа кусочка реестра слева.
2. Режим карточки, это именно тот режим после F5 в котором вам видна ваша кнопка.
В первом режиме за панель с кнопками отвечает секция SectionV2, во втором карточка PageV2
Вот в этой теме этот нюанс уже обсуждался http://www.community.terrasoft.ru/forum/topic/13848
Так же почитайте академию:
https://academy.terrasoft.ua/documents/technic-sdk/7-6-0/kak-dobavit-kn…
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-dobavit-knop…
https://academy.terrasoft.ru/documents/technic-sdk/7-8/dobavlenie-knopk…

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

Добрый день.

Подскажите, а в какой таблице в БД указывается связь детали и объекта.
А то добавил деталь, не знаю как связать с основным объектом. Заранее спасибо.

Нравится

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

Здравствуйте,
Во-первых, лучше всегда, когда это возможно, для создания детали, использовать мастер деталей.
https://academy.terrasoft.ua/documents/marketing/7-7-0/master-detaley
Так же, воспользовавшись мастером детали, к примеру, в чистом пакете, на закладке «Данные» данного пакета, вы сможете увидеть какие именно связи в бд создаются для функционирования детали.
А это следующие записи:
Для схемы объекта (таблица SysSchema) создается развязочная запись в SysModuleEntity, далее Id развязочной записи фигурирует для связи объекта с страницей его редактирования (та страница что откроется по нажатию + на детали) в таблице SysModuleEdit
Ну и в таблице SysDetail регистрируется

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

Добрый день.

Создали в "Средствах связи" в карточке контакта новый тип средства связи - "Доп.email".
В профиле карточки контакта создали поле "Доп. email" куда хотим выводить доп.email из средств связи.
Но, как видно из прикрепленного скриншота, в профиль контакта в поле "Доп. email" ничего не выводится, хотя в средствах связи указан "Доп.email" контакта.
Как подтягивать в профиль контакта "Доп.email" из средств связи, аналогично другим средствам связи?

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

Нравится

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

Здравствуйте,
Дело в том, что деталь, это отдельный объект в системе. В вашем случае объект детали "средства связи контакта": «ContactCommunication». А сама карточка контакта, другой объект (таблица в бд): "Contact", в которой самые основные средства связи продублированы, к примеру, как вы продублировали, создав поле "Доп. email". Но что бы оно заполнялось, необходимо написать соответствующую логику. К примеру, вы можете создать бизнес-процесс для этой цели, по событию создания экземпляра ContactCommunication, и в связанный контакт при этом, элементом «изменение данных», записывать сохраняемый дополнительный E-mail из детали в контакт. Подробнее про БП читайте в цикле статей на академии:
https://academy.terrasoft.ua/documents/technic-bpms/7-8/obzor-vozmozhno…

Максим Шевченко пишет:

Но что бы оно заполнялось, необходимо написать соответствующую логику

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

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

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

Добрый день! Подскажите, пожалуйста, как убрать возможность создания нового продукта с карточки "Продукт в продаже". рис.1.

Нравится

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

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

Вариант 1:
Для тех пользователей, которым нужно запретить наполнять раздел [Продукты] из лукапного поля в карточке "Продукт в продаже" или др. можно убрать право на системную операцию с кодом "CanManageLookups". Для этого нужно на детали "Доступ к операции" удалить нужного пользователя или роль, в которую он входит. Ниже прикреплен скриншот 1. Недостатком такого решения является тот факт, что данный пользователь не сможет наполнять никакие справочники (но в этом есть логика, так как наполнение справочных значений рекомендовано все же выполнять администратору системы).

Вариант 2.
Установить запрещающие права на добавление записей в разделе [Продукты] для нужного пользователя или роли. Данное решение позволит пользователю наполнять другие объекты системы через справочное поле, но не даст права на добавление в продукты. Ниже прикреплен скриншот 2.

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

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

Нравится

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

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

Используйте бизнес процесс. Общая структура бизнес процесса:
1) Стартовый сигнал по событию добавления записи в созданный вами раздел
2) Используйте элемент "Чтение данных" для получения значений добавленной записи
3) Используйте элемент "Формула" для подстановки в параметр элемента "Таймер" разницы между текущем временем (System.DateTime.Now) и значением в поле с типом "Дата время", сконвертированных к секундам.
Общая структура будет выглядеть где-то так:
((System.DateTime.Now).Subtract([#Параметр даты#])).TotalSeconds()
4) Используйте "Таймер"
5) Используйте "Отправить email" для отправки
6) Конец процесса

Это общая структура. Где-то еще должно быть получение email адреса получателя, и как вариант, формирование тела и темы письма.

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

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

Нравится

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

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

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

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

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

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


Есть деталь продуктов в карточке «Продажы» рис.1.(в документе)
Сделал деталь редактируемым реестром.
На странице поля заблокированы рис. 2.(в документе)
Но все равно на детали поля разблокированы рис.3.

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

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

Доброго времени суток.

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

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

Возможно ли это сделать?

Нравится

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

Информация о том, как добавлять кнопки есть на академии:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-dobavit-knop…
Посмотреть как по нажатию кнопки переходить в импорт можете в схеме SystemDesigner
Там для этого есть метод:
navigateToImportFromExcel: function() {
var url = this.Terrasoft.workspaceBaseUrl + ConfigurationConstants.ApplicationPage.ExcelImport;
window.open(url, "_blank", "height=" + this.get("WindowHeight") + ",width=" + this.get("WindowWidth"));
},
Что касается предзаполения объекта, необходимо изучить как данный механизм работает в самой странице импорта: схема FileImportStartPage
В замещающей схеме FileImportStartPage реализовать метод который будет заполнять объект импорта на нужным вам. И средствами песочницы sandbox, узнавать что вы перешли в импорт из нужной вам страницы нужной вам кнопкой, выполнять его. Подробнее про песочницу: http://www.community.terrasoft.ru/forum/topic/15210

Илья, большое спасибо!

Не находил, что есть ещё такой вариант страницы импорта.

"Мотков Илья" написал:Что касается предзаполения объекта, необходимо изучить как данный механизм работает в самой странице импорта: схема FileImportStartPage

Это метод setImportObject, как я понимаю? Только запускать при открытии окна.

Разобрался с основным, кроме одного момента:

"Мотков Илья" написал:И средствами песочницы sandbox, узнавать что вы перешли в импорт из нужной вам страницы нужной вам кнопкой, выполнять его.

Сообщения использовал неоднократно, но ведь тут страница открывается на соседней вкладке (окне), будет ли там работать сандбокс?

Например, я передаю сообщение по клику на кнопку:

this.sandbox.publish("StartImportFlag", { date: "test" }, ['FileImportModule_FileImportStartPage']);

В замещающей схеме FileImportStartPage есть соответственно:

this.sandbox.subscribe("StartImportFlag", function(arg) {
	console.log(arg); //Это пока просто для примера - должно вывести test
}, this, [this.sandbox.id]); //Тут this.sandbox.id равен FileImportModule_FileImportStartPage, у этих страниц они слишком различаются между собой.

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

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

Добрый день.

Прошу помощи, т.к. сама не сильно разбираюсь в данном вопросе. Если код корявый, подскажите как поправить, я новичок в этом.
Задача была поставлена следующая, в разделе "Обращения" выделить записи просроченные по реакции или по разрешению. Я добавила в методы схемы Section page schema - Cases, код:

                prepareResponseCollectionItem: function(item) {
                        this.callParent(arguments);
                        item.customStyle = null;
                        //var running = item.get("ResponseOverdue");
                        if (item.values.ResponseOverdue) {
                                item.customStyle = {"background": "#EB3D51"};
                        }
                        //var running = item.get("SolutionOverdue");
                        if (item.values.SolutionOverdue) {
                                item.customStyle = {"background": "#EB3D51"};
                        }
                }

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

У нас стоит service enterprise версии 7.8.1

Нравится

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

Пускай другие пользователи почистят кеш браузера и перезайдут на сайт ;)

Максим, спасибо, Вы навели меня на мысль, что записи подсветятся только если эти колонки выведены в реестр. Это подтвердилось.
У пользователей, колонки Просрочен по реакции и по разрешению не выведены в реестр, можно сделать выделение, не зависящем от отображения этих колонок в реестре?

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

Добрый день.
У меня колонки выведены, далее не делала.

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

1) Заместить схему секции.
2) Переопределить метод initQueryColumns.
3) В замещающем методе в параметр esq добавлять нужную колонкую

Пример:

initQueryColumns: function(esq) {
	this.callParent(arguments);
        // проверка на присутствие необходимой колонки в esq
	entitySchemaQuery.addColumn("имя колонки");
},
Показать все комментарии

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

Нравится

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

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

Права на поиск и объединение дублей ограничены системной операцией "Поиск дублей"
Для решения:
1) Перейдите в "Дизайнер системы"
2) Перейдите в "Права доступа на операции"
3) Найдите операцию "Поиск дублей"
4) Выдайте права нужным пользователям.

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