Добрый день, Использую стандартный элемент БП Чтение данных, нужно выбрать звонки из Активностей, в которых начало меньше или равно текущей дате/времени, ставлю такое условие, но вытягиваются звонки у которых значение больше текущей даты/времени. Собственно вопрос в чем проблема, стандартный элемент не умеет сравнивать DateTime?
Причем дату сравнивает нормально, а вот по времени сравнение не идет.
Элемент "Читать данные" умеет это делать. Проблема в другом:biggrin:
Поле "Ответственный" смотрит в [dbo].[Contact]. Значение "Текущий пользователь" берется из [dbo].[SysAdminUnit]. Поле "Ответственный" необходимо сравнивать со значением "Контакт текущего пользователя".
С этим фильтром хоть какие-то активности подтягиваются?
Подскажите почему может быть такая ситуация:
В БП используется Таймер. Если в таймер идет один поток и из него один поток, то он работает корректно.
Но если добавить из таймера два исходящих потока или исключающее ИЛИ после таймера с двумя исходящими потоками, то БП работает некорректно.
Сделала тестовый БП:
1. В сценарии пишется лог в файл + уменьшается параметр, отвечающий за кол-во повторений БП
2. Чтение данных только для определения по какому маршруту идет процесс
3. В условном потоке идет проверка: завершить процесс (параметр Бп = 0)
Причем после первого выполнения сценария, он повторно не выполняется (то, что не выполняется знаю точно, потому что веду логирование в данном сценарии). Диаграмма БП на картинке 3.
Версия продукта 7.3.0.1910.
Александра, судя по скриншотам журнала процессов, элемент «Задание-сценарий» не логируется. Пожалуйста, установите в дизайнере процессов признак «Журналировать» этому элементу.
Также, у процесса есть свойство «Максимальное количество повторений» - это количество повторений после которых процесс завершается вне зависимости от результата.
1. Устанавливала признак Журналировать. При этом в Диаграмме отмечается, что блок обрабатывался, но изменений в параметре и логах при этом нет. Такая ситуация наблюдается только со сценариями, при повторном запуске вычисления в них не срабатывают.
2. Так же пробовала другую ситуацию. Сделала два Бп:
первый состоит из таймера и подпроцесса (запуск второго БП)
второй содержит всю обработку.
При такой реализации все работает корректно. Получается каждый день будет появляться новый БП (2), созданный из БП (1). У таймера старт раз в сутки. Единственное Бп 2 содержит только один скрипт, это немного странно. Удобней было бы все реализовать в одном..
Насколько корректным будет такой вариант? Может есть какие-то "подводные камни"?
3. Так же есть вариант делать без сценария, а с использованием других элементов БП, но это сильно усложнит логику и в БП будет цикл с несколькими элементами процесса.
Для решения задачи предлагаем использовать планировщик, вместо цикличности процесса. Необходимо добавить в планировщик job, который будет запускать процесс с необходимой периодичностью. Для этого следует:
1. В БП добавить элемент “Задание сценарий”.
2. В сценарии прописать следующий код :
string schedulerJobGroupName = "ScheduleTest"; // произвольное название
string jobProcessName = "UsrScheduleTest"; // название бизнес-процесса
string schedulerJobName = "ScheduleTestJob"; // произвольное название
int startOffset = 60; // периодичность запуска (в секундах)
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;
3. Сохранить сценарий.
4. В пространство имен (Usings) процесса добавить:
- Quartz.Impl
- Quartz
- Quartz.Impl.Triggers
- Terrasoft.Core.Scheduler
5. Опубликовать процесс.
В результате процесс, который записывает лог в файл, будет запускаться каждый раз в новом экземпляре с указанной периодичностью. При включенном журналировании, ПБ будет логироваться в журнале процессов, легче отследить некорректное поведение на каждом из этапов.
Спасибо за предоставленные комментарии.
Сделала еще один процесс с таймером и сценарием и сценарий стал отрабатывать. В чем была причина проблемы отработки сценария в предыдущем ТМ так и не выяснила.
По поводу решения через Quartz, я верно понимаю, что необходимо предварительно настроить планировщик?
Здравствуйте, Александра! Планировщик в системе уже существует и настроен. Процесс создает Job, который запускается в указанное время. Запускаемые Job можно найти в таблице dbo.qrtz_triggers
Интересующий Вас функционал Вы можете реализовать по аналогии с базовыми разделами продукта Real Estate, такими как Объекты и Листинги, просмотрев объекты "Listing" или "Property", а также схемы "GalleryDetail", "ListingGalleryDetail", "PropertyGalleryDetail".
Доброго дня! Создал я раздел, залил туда n-ое количество записей.
Захожу в bpm обычным юзером и не могу видеть созданные от админа записи. Новые создать могу.
Как это можно решить? К сожалению требование начальства такие, что все должны видеть всё(.
Добрый день! Как можно отформатировать текст в вопросе для пользователя из бизнес процесса.
А также, как можно в вопросе добавить ссылку, например на список статей в базе знаний?
Возможность форматирования текста доступна только в элементе “Отправка e-mail”. Изменить базовый элемент “Вопрос пользователю” и добавить в него дополнительное поле/контейнер не представляется возможным.
Для решения задачи рекомендуем использовать элемент “Автогенерируемая страница”. Тут Вы можете отобразить вопрос пользователю, варианты ответов, дополнительные поля (например ссылки на статьи из базы знаний).
Подскажите, плзз, есть ли база в примерами использования объектов бизнес-процессов.
Например, как использовать автогенерируемую страницу, чтоб получилась ссылка на базу знаний.
К сожалению, базы примеров нету. Для того, чтобы на автогенерируемой странице получилась ссылка на базу знаний Вам необходимо добавить поле с типом "Справочник", указав справочником справочник "База знаний".
В значение этого поля элементом "Формула" мы подставляем Id статьи в базе знаний.
К сожалению, просто открыть реестр записей раздела не получится - возможно открыть только какую-то запись. Для этого Вам необходимо использовать элемент "Страница редактирования".
Есть стандартная деталь средства связи, при открытия карточки контрагента нужно что бы она всегда отображалась "свернутой", т.е. что бы пользователь смог увидеть информацию ему нужно, нажатием на деталь, "развернуть" ее. Также нужно подписаться на событие "нажатия-открытия детали средства связи" из карточки контрагента (или создать такое событие если его нет).
Подскажите пожалуйста как реализовать вышеописанное.
Здравствуйте! Пытаюсь создать преднастроенную страницу, содержащую справочники. Поля на странице относятся к разным объектам. Делал аналогично примеру из конфигурации (PreconfiguredPageV2)
При открытии справочник не получает верный конфиг.
При использовании примера из конфигурации ситуация в точности повторяется.
Подскажите пожалуйста, как побороть данную проблему?
Возник еще один вопрос. Как сделать,чтобы в преднастроенной странице работала вся логика справочных полей?
Не работает фильтрация "на лету", когда пишешь в поле справочника и подтягиваются отфильтрованные данные (именно на странице, а не в окне лукапа)
Прикрепите пожалуйста скриншот внешнего вида того, что вы пытаетесь сделать, и код схемы. Не до конца понятно какую проблему вы пытаетесь решить. Возможно есть типовые решения, без необходимости прибегать к написанию кода.
Думаю, что по картинке станет понятна задача.
В БП используется преднастроенная страница. Кажется, что в ней не выполнилась подписка на базовые события для полей типа LOOKUP, либо я не подключил какой-то базовый модуль. Не могу понять, что именно. В обычных страницах при нажатии стрелок или начав писать текст в поле справочника мы получаем подсказку по наполнению, а в моем случае такой функционал не работает.
Посмотрите в сторону схемы автогенерируемой страницы (AutoGeneratedPageV2) и ее реализаций loadVocabulary и остальных.
В автогенерируемых страницах фильтрация происходит.
Александр, а то, что на SDK описано не подходит? Если вы хотите не в шапке страницы реализовать, то возможно для примера подходит страница "Отчет о проделанной работе" (раздел "Активности").
Илья, за ссылку спасибо! Посмотрел, но это не мой вариант, так как у меня не раздел (и соответственно нет базовой логики, способной подцепить предлагаемый модуль). А в преднастроенной странице (наследуемой от страницы редактирования) такой блок просто так не добавится... надо писать именно контролы и именно ручками, а еще обработчики событий на них... либо как то уж очень исхитриться и прицепить готовый модуль, но методика должна быть более изощренная, чем в sdk
А страница фильтра отчета о проделанной работе не подходит, так как в ней добавить два блока фильтров по периоду (ну вот нужно мне по двум датам разным иметь возможность фильтровать...) нельзя без переписывания ReportFilterModule, поэтому решил, что легче сделать свою страницу с параметрами. Ну и для самообразования полезно :)
Илья, за ссылку спасибо! Посмотрел, но это не мой вариант, так как у меня не раздел (и соответственно нет базовой логики, способной подцепить предлагаемый модуль). А в преднастроенной странице (наследуемой от страницы редактирования) такой блок просто так не добавится... надо писать именно контролы и именно ручками, а еще обработчики событий на них... либо как то уж очень исхитриться и прицепить готовый модуль, но методика должна быть более изощренная, чем в sdk
А страница фильтра отчета о проделанной работе не подходит, так как в ней добавить два блока фильтров по периоду (ну вот нужно мне по двум датам разным иметь возможность фильтровать...) нельзя без переписывания ReportFilterModule, поэтому решил, что легче сделать свою страницу с параметрами. Ну и для самообразования полезно :)
Но фильтры же правильней использовать для раздела или детали :wink:
Если уже для самообразования. то можно попробовать следующий алгоритм:
1. Модуль фильтров можно подключить как обычный модуль. Другой вопрос, что в раздел и деталь это сделать можно легко.
2. Как это примерно сделать – загрузить модуль и поддержать сообщения для работы с ним.
Сперва нужно поддержать сообщения
Потом на них сделать такую логику:
Для добавления фиксированных фильтров нужно сообщение
this.sandbox.loadModule("QuickFilterModuleV2", {
renderTo:"SectionFiltersContainer",// куда рисовать, контейнер в diff
id:this.getQuickFilterModuleId()// тут уникальный id модуля});
Для получения фильтров нужно подписаться на сообщение:
Попробуйте добавить свойство usLookup к атрибуту Contact:
isLookup: true,
Не помогло. Проблема возникает при нажатии на лупу. Если использовать выпадающий список, то проблема не возникает.
Аналогичная проблема со справочными полями наблюдается и в других базовых преднастроенных страницах.
Игорь, для исправления данного поведения, необходимо добавить зависимость от LookupUtilities. А также переопределить метод loadVocabulary аналогично схеме AutoGeneratedPageV2.
Полный листинг кода схемы:
define("UsrSome", ["LookupUtilities", "CustomProcessPageV2Utilities"],
/**
* @class Terrasoft.configuration.PreconfiguredPageV2
* Пример преднастроенной страницы без EntitySchema по процессу
*/
function(LookupUtilities){return{
mixins:{},
attributes:{"UsrContact":{
dataValueType:this.Terrasoft.DataValueType.LOOKUP,
type:this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
isLookup:true,
referenceSchemaName:"Contact",
},
},
rules:{},
details:/**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
methods:{
findEntityColumn: function(columnName){
var column =this.callParent(arguments);if(!column){
column =this.getColumnByName(columnName);}return column;},
loadVocabulary: function(args, tag){
var column =this.findEntityColumn(tag);if(!column ||!column.isLookup){return;}
var entitySchemaName = column.referenceSchemaName;
var config ={
entitySchemaName: entitySchemaName,
multiSelect:false,
columnName: tag,
columnValue:this.get(tag),
searchValue: args.searchValue};
var handler = function(args){
var columnName = args.columnName;
var collection = args.selectedRows.collection;if(collection.length>0){this.set(columnName, collection.items[0]);}};
LookupUtilities.Open(this.sandbox, config, handler, this, null, false, false);},
init: function(){this.callParent(arguments);
document.scope=this;},
},
diff:/**SCHEMA_DIFF*/[{"operation":"remove",
"name":"TextParameter1"},
{"operation":"insert",
"parentName":"GeneralInfoBlock",
"propertyName":"items",
"name":"UsrContact",
"values":{
caption:"UsrContact",
contentType: Terrasoft.ContentType.LOOKUP,
bindTo:"UsrContact",
layout:{column:0, row:0, colSpan:12}}}]/**SCHEMA_DIFF*/,
userCode:{}};});
//получить значение системной настройки
var ss=Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SysSettingsName");//Установить значение системной настройки
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, "SysSettingsName","SysSettingsValue");//Установить значение системной настройки без учета прав
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, UserConnection.RootAdminUnitGroupId,
"SysSettingsName", "SysSettingsValue");
На клиенте:
//значение системной настройки
Terrasoft.SysSettings.querySysSettingsItem("MaxDayTransitionCount", function(value){
maxDayTransitionCount = value;}, this);//Часто возникает задача получить контакт текущего пользователя
var userContact=Terrasoft.SysValue.CURRENT_USER_CONTACT.value,
Задача установить значение системной настройки на клиенте возникает крайне редко, поэтому при необходимости можно написать Update для таблицы SysSettingsValue
через раздел системные настройки изменить значение не получается (под админом), сохранение происходит без ошибок в консоли, но открыв заново - значение остается тем же. Системная настройка целочисленного типа.
UPD: В таблице SysSettingsValue добавляется второе значение для системной настройки (с полем IsDef = 0) измененной командой выше, когда пользователь меняет значение через раздел оно изменяться у настройки с параметром IsDef=1. Как сделать что бы пользователь(администратор) мог менять значение системной настройки, а не значение по умолчанию.
А не делал ли кто случаем возможность экспорта данных из abbyy bcr в bpmonline?
В расширениях не нашел такого модуля, но идея то в общем на поверхности...
Вариант с созданием "кнопочки" в bpmonline, которая загружает в систему данные из готового .csv файла, созданного с помощью bcr понятен, но он некрасивый и не особо удобный.