7.5
чтение данных
элемент БП
Технические вопросы
7.x

Добрый день,
Использую стандартный элемент БП Чтение данных, нужно выбрать звонки из Активностей, в которых начало меньше или равно текущей дате/времени, ставлю такое условие, но вытягиваются звонки у которых значение больше текущей даты/времени. Собственно вопрос в чем проблема, стандартный элемент не умеет сравнивать DateTime?
Причем дату сравнивает нормально, а вот по времени сравнение не идет.
1

Нравится

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

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

Элемент "Читать данные" умеет это делать. Проблема в другом:biggrin:

Поле "Ответственный" смотрит в [dbo].[Contact]. Значение "Текущий пользователь" берется из [dbo].[SysAdminUnit]. Поле "Ответственный" необходимо сравнивать со значением "Контакт текущего пользователя".

С этим фильтром хоть какие-то активности подтягиваются?

Как ни странно но подтягиваются по контакту текущего пользователя, так что с этим проблем нет, проблема только с датой

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

Правильно ли я понимаю, что "Текущее значение даты времени" - это параметр процесса? Каким значением заполняется этот параметр?

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

Добрый день.

Подскажите почему может быть такая ситуация:
В БП используется Таймер. Если в таймер идет один поток и из него один поток, то он работает корректно.
Но если добавить из таймера два исходящих потока или исключающее ИЛИ после таймера с двумя исходящими потоками, то БП работает некорректно.
Сделала тестовый БП:
1. В сценарии пишется лог в файл + уменьшается параметр, отвечающий за кол-во повторений БП
2. Чтение данных только для определения по какому маршруту идет процесс
3. В условном потоке идет проверка: завершить процесс (параметр Бп = 0)
Причем после первого выполнения сценария, он повторно не выполняется (то, что не выполняется знаю точно, потому что веду логирование в данном сценарии). Диаграмма БП на картинке 3.
Версия продукта 7.3.0.1910.

Нравится

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

Александра, судя по скриншотам журнала процессов, элемент «Задание-сценарий» не логируется. Пожалуйста, установите в дизайнере процессов признак «Журналировать» этому элементу.

Также, у процесса есть свойство «Максимальное количество повторений» - это количество повторений после которых процесс завершается вне зависимости от результата.

1. Устанавливала признак Журналировать. При этом в Диаграмме отмечается, что блок обрабатывался, но изменений в параметре и логах при этом нет. Такая ситуация наблюдается только со сценариями, при повторном запуске вычисления в них не срабатывают.
2. Так же пробовала другую ситуацию. Сделала два Бп:
первый состоит из таймера и подпроцесса (запуск второго БП)
второй содержит всю обработку.
При такой реализации все работает корректно. Получается каждый день будет появляться новый БП (2), созданный из БП (1). У таймера старт раз в сутки. Единственное Бп 2 содержит только один скрипт, это немного странно. Удобней было бы все реализовать в одном..
Насколько корректным будет такой вариант? Может есть какие-то "подводные камни"?
3. Так же есть вариант делать без сценария, а с использованием других элементов БП, но это сильно усложнит логику и в БП будет цикл с несколькими элементами процесса.

Максимальное число повторений при подходе 2. не сработало. Ставила 3 повторения, отработал 4, после чего пришлось выключить руками.

Александра, добрый день!

Для решения задачи предлагаем использовать планировщик, вместо цикличности процесса. Необходимо добавить в планировщик 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

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

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

Нравится

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

Виктор, добрый вечер!

Интересующий Вас функционал Вы можете реализовать по аналогии с базовыми разделами продукта Real Estate, такими как Объекты и Листинги, просмотрев объекты "Listing" или "Property", а также схемы "GalleryDetail", "ListingGalleryDetail", "PropertyGalleryDetail".

Спасибо.

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

Доброго дня!
Создал я раздел, залил туда n-ое количество записей.
Захожу в bpm обычным юзером и не могу видеть созданные от админа записи. Новые создать могу.
Как это можно решить? К сожалению требование начальства такие, что все должны видеть всё(.

Нравится

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

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

Вероятнее всего, Вы включили, но не настроили администрирование по записям (Скриншот 1).

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

"Кто создает: Все сотрудники - Кому дано право: Все сотрудники." (Скриншот 2).

Если же необходимо изменить права доступа на конкретную запись, то Вам необходимо:

1) Открыть запись
2) Нажать кнопку "Действия"
3) Нажать кнопку "Настроить права доступа" (скриншот 3)

Также, рекомендуем Вам ознакомиться с информацией по настройке прав доступа в нашем видео-уроке:

https://www.youtube.com/watch?v=x5C6VcOhKj4&feature=youtu.be&list=PLDp-…

Спасибо!

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

Добрый день!
Как можно отформатировать текст в вопросе для пользователя из бизнес процесса.
А также, как можно в вопросе добавить ссылку, например на список статей в базе знаний?

Нравится

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

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

Возможность форматирования текста доступна только в элементе “Отправка e-mail”. Изменить базовый элемент “Вопрос пользователю” и добавить в него дополнительное поле/контейнер не представляется возможным.
Для решения задачи рекомендуем использовать элемент “Автогенерируемая страница”. Тут Вы можете отобразить вопрос пользователю, варианты ответов, дополнительные поля (например ссылки на статьи из базы знаний).

Спасибо, Олег!

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

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

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

Да с этим разобралась, спасибо!
Но мне нужна ссылка на весь справочник? можно ли так? Просто переход с раздел База знаний?

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

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

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

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

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

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

Нравится

2 комментария
преднастроенная страница
справочник
Технические вопросы
7.x

Здравствуйте!
Пытаюсь создать преднастроенную страницу, содержащую справочники. Поля на странице относятся к разным объектам. Делал аналогично примеру из конфигурации (PreconfiguredPageV2)
При открытии справочник не получает верный конфиг.
При использовании примера из конфигурации ситуация в точности повторяется.
Подскажите пожалуйста, как побороть данную проблему?

Нравится

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

Уже разобрался.
Если кому-то понадобится, то необходимо переопределить 2 метода: LoadVocabulary и getLookupPageConfig

 loadVocabulary: function(args, tag) {
                        var column = this.getColumnByName(tag);
                        args.schemaName = column.referenceSchemaName;
                        this.callParent(arguments);
                    },
 
                    /**
                     * Возвращает настройки страницы выбора из справочника.
                     * @private
                     * @param {Object} args Параметры.
                     * @param {String} columnName Название колонки.
                     * @return {Object} Настройки страницы выбора из справочника.
                     */
                    getLookupPageConfig: function(args, columnName) {
                        var config = {
                            entitySchemaName: args.schemaName,
                            multiSelect: false,
                            columnName: columnName,
                            columnValue: this.get(columnName),
                            searchValue: args.searchValue,
                            filters: this.getLookupQueryFilters(columnName)
                        };
                        this.Ext.apply(config, this.getLookupListConfig(columnName));
                        return config;
                    }

Возник еще один вопрос. Как сделать,чтобы в преднастроенной странице работала вся логика справочных полей?
Не работает фильтрация "на лету", когда пишешь в поле справочника и подтягиваются отфильтрованные данные (именно на странице, а не в окне лукапа)

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

Думаю, что по картинке станет понятна задача.
В БП используется преднастроенная страница. Кажется, что в ней не выполнилась подписка на базовые события для полей типа LOOKUP, либо я не подключил какой-то базовый модуль. Не могу понять, что именно. В обычных страницах при нажатии стрелок или начав писать текст в поле справочника мы получаем подсказку по наполнению, а в моем случае такой функционал не работает.

Полный код во вложении
preconfuguredpage.txt

Посмотрите в сторону схемы автогенерируемой страницы (AutoGeneratedPageV2) и ее реализаций loadVocabulary и остальных.
В автогенерируемых страницах фильтрация происходит.
/

И еще одну старую тему попробую оживить...

Может приходилось кому делать преднастроенную страницу с набором кнопок быстрого выбора даты, как в фильтре раздела активности (см аттач)?

"Александр Кудряшов" написал:

И еще одну старую тему попробую оживить...

Может приходилось кому делать преднастроенную страницу с набором кнопок быстрого выбора даты, как в фильтре раздела активности (см аттач)?

Прикрепленный файлРазмер

filter.jpg10.46 кб

Александр, а то, что на SDK описано не подходит? Если вы хотите не в шапке страницы реализовать, то возможно для примера подходит страница "Отчет о проделанной работе" (раздел "Активности").

"Мотков Илья" написал:то, что на SDK описано

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

А страница фильтра отчета о проделанной работе не подходит, так как в ней добавить два блока фильтров по периоду (ну вот нужно мне по двум датам разным иметь возможность фильтровать...) нельзя без переписывания ReportFilterModule, поэтому решил, что легче сделать свою страницу с параметрами. Ну и для самообразования полезно :)

"Александр Кудряшов" написал:
Мотков Илья пишет:

то, что на SDK описано

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

А страница фильтра отчета о проделанной работе не подходит, так как в ней добавить два блока фильтров по периоду (ну вот нужно мне по двум датам разным иметь возможность фильтровать...) нельзя без переписывания ReportFilterModule, поэтому решил, что легче сделать свою страницу с параметрами. Ну и для самообразования полезно :)

Но фильтры же правильней использовать для раздела или детали :wink:
Если уже для самообразования. то можно попробовать следующий алгоритм:

1. Модуль фильтров можно подключить как обычный модуль. Другой вопрос, что в раздел и деталь это сделать можно легко.
2. Как это примерно сделать – загрузить модуль и поддержать сообщения для работы с ним.

Сперва нужно поддержать сообщения

Потом на них сделать такую логику:

Для добавления фиксированных фильтров нужно сообщение

Его код должен возвращать конфиг, из статьи - http://www.academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/AddFix…

Загрузка самого модуля фильтров стандартная -

this.sandbox.loadModule("QuickFilterModuleV2", {
               renderTo: "SectionFiltersContainer",// куда рисовать, контейнер в diff
               id: this.getQuickFilterModuleId()// тут уникальный id модуля
});

Для получения фильтров нужно подписаться на сообщение:

На 7.8 необходимо на преднастроенную страницу добавить справочное поле.
Добавляю в attributes:

 "Contact": {
                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                referenceSchemaName: "Contact",
            },

Добавляю элемент в diff.
Поле появляется, но при нажатии на лупу появляется ошибка:
Ошибка
на строчке:

 args.schemaName = this.model.attributes[tag].referenceSchemaName;

в методе:

loadVocabulary: function(args, tag) {
  args.schemaName = this.model.attributes[tag].referenceSchemaName;
  this.callParent(arguments);
},

Здравствуйте, Игорь.

Попробуйте добавить свойство usLookup к атрибуту Contact:

isLookup: true,

"Мотков Илья" написал:Здравствуйте, Игорь.

Попробуйте добавить свойство 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: {}
		};
	});
Показать все комментарии
Технические вопросы
7.x

Возможна ли интеграция по OData c BPM On-demand или только с On-site?

Нравится

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

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

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

Нравится

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

Добрый день.
На сервере:

//получить значение системной настройки
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

После установки значения системной настройки методом

Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, UserConnection.RootAdminUnitGroupId,
"SysSettingsName", "SysSettingsValue")

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

UPD: В таблице SysSettingsValue добавляется второе значение для системной настройки (с полем IsDef = 0) измененной командой выше, когда пользователь меняет значение через раздел оно изменяться у настройки с параметром IsDef=1. Как сделать что бы пользователь(администратор) мог менять значение системной настройки, а не значение по умолчанию.

Версия 7.7.0.2325

Можете попробовать воспользоваться ESQ - http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/UsingEntit…. Это серверная, на клиенте почти похожий алгоритм.

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

Доброго дня!

А не делал ли кто случаем возможность экспорта данных из abbyy bcr в bpmonline?
В расширениях не нашел такого модуля, но идея то в общем на поверхности...

Вариант с созданием "кнопочки" в bpmonline, которая загружает в систему данные из готового .csv файла, созданного с помощью bcr понятен, но он некрасивый и не особо удобный.

Нравится

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