Коллеги, здравствуйте!

Посоветуйте оптимальный вариант интеграции (двусторонний обмен) BPMonline onsite со сторонней СУБД MS SQL / Oracle?

Если правильно понимаю, варианты:
1. BPM-oData / промежуточный шлюз / СУБД
2. BPM-СУБД / СУБД

Очень важно определить "подводные камни" (работа по процессам BPM, отказоустойчивость)

Нравится

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

В данном случае возможны оба варианта, но, на мой взгляд, более приемлемым является вариант через Odata, так как в варианте с СУБД-СУБД могут сильно отличаться модели данных. Более подробную информацию о возможностях интеграции платформы bpm`online через Odata можете узнать на нашем ресурсе http://academy.terrasoft.ru/documents/?/docs/technic/SDK/7.6.0/webtoc.h…

"Адасюк Валерий Викторович" написал:на нашем ресурсе

Валерий, спасибо, только не открывается страничка (открывается общее содержание)

Дмитрий, путь перехода к нужному разделу следующий
SDK bpm`online>Рекомендуемые средства интеграции>OData

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

bpm'online sales enterprise версия 7.6.0.
В данной версии при добавлении нового товара можно ли добавить тип продукта? Допустим у меня интернет магазин и в продаже из типовых продуктов имеются крупная, мелкая бытовая техника и т.д. А в в списке имеется только антивирусы и продукты связанные только с компьютерным обеспечением. Есть ли возможность добавить туда продукты другого типа?

Нравится

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

Каким образом можно добавить встроенную (Embedded) деталь со связанного объекта? Например на одной из деталей активности вывести деталь адресов контрагента данной активности.

Нравится

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

Для этого необходимо:
1) В манифесте прописать требуемые модели с которыми мы будем работать (например "адреса контрагента"):
Models: { Activity: { RequiredModels: ["AccountAddress"...] ...

2) В карточку (например, просмотра - MobileActivityPreviewPage) добавляем примерно такой код:

*перекрываем событие loadedRecord (или дописываем в него если оно уже перекрыто)

onLoadRecord: function(loadedRecord) {
...
this.callParent(arguments); 
...
var view = this.getView();
var containerConfig = {
		xtype: "container",
		cls: "my-css",
		layout: {
			type: "vbox"
		}
};
var container = view.add(containerConfig);
var modelName = "AccountAddress";
var store = Ext.create("Terrasoft.store.BaseStore", {
	model: modelName
});
var columns = ["Address"];
var queryConfig = Ext.create("Terrasoft.QueryConfig", {
	modelName: modelName,
	columns: columns
});
var AccountId = loadedRecord.data.Account.data.Id;
var filtersConfig = {
	property: "Account",
	value: AccountId
};
store.setPageSize(Terrasoft.AllRecords);
store.loadPage(1, {
	filters: Ext.create("Terrasoft.Filter", filtersConfig),
	queryConfig: queryConfig,
	callback: function(loadedRecords, operation, success) {
		var lr = loadedRecords;
		if (success) {
			for (var i = 0, ln = lr.length; i < ln; i++) {
				var a = container.add(Ext.factory({
					xtype: "label",
					cls: "my-label-css"
				}));
				a.setHtml(lr[i].data.Address);
			}
		}
	},
	scope: this
});
...

В итоге мы увидим адреса контрагента указанного в активности

Теоретически можно добавить любые данные в любое место любой карточки.

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

Добрый день.
Ситуация: у нас (в связи с большими переделками-доработками) со временем стали по долгу отрабатывать различные кейсы. Пытались найти слабые места кода с помощью снятия трейса в SQL Profiler – сервер отрабатывает быстро, однако (толстый) клиент Terrasoft при своей работе большинство логики обрабатывает на клиенте. И пришла идея в код проблемных кейсов проставить сбор тайминга. Т.е. например кейс открытие Проекта: разбиваем код на логические части и в начале и конце частей пишем код что то типа если текущий пользователь = «Ivanov» то запиши в файлик этап=1 дата-время = 26.06.2015 14:19:10.100. – таким образом мы найдем в проблемном кейсе кусок кода который отрабатывает дольше всего и попробуем его оптимизировать.

Вопрос: Может в террасофте уже есть аналогичные штатные средства, или если нет подскажите как будет выглядеть в Terrasoft код: если текущий пользователь = «Ivanov» то запиши в файлик: этап=1, дата-время = текущая дата-время. (файл как вариант текстовый на компе у пользователя или вывод куда-нибудь строку все этапы с временем)

Отладку в Visual Studio не хотим производить, так как Visual Studio сам потребляет память и в итоге тестирование таймингов может быть не правильным.

Нравится

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

В bpm'online 7.5 обновился инструмент профилирования клиентского кода - performanceManager. Инструмент основан на использовании UserTimingApi. Для браузеров, которые не поддерживают этот стандарт, реализован эмулятор. Профилировщик находится в модуле performancecountermanager.

Включение профайлера

Чтобы не нагружать приложение, по умолчанию функциональность профайлера отключена. Сам объект performanceManager доступен, но все его методы - пустые функции. Для включения профилировщика, необходимо добавить настройку EnablePerformanceManager в секцию appSettings в файл web.config в папке Terrasoft.WebApp:

<appSettings>
    <add key="EnablePerformanceManager" value="true"/>

Профилирование
Установка меток

Профилирование осуществляется на основе временных меток с помощью методов start() и stop(). Метод start начинает профилирование метки с указанным именем. Метод stop, соответственно, завершает профилирование. Профилирование одной метки можно выполнять несколько раз. Для этого нужно вызвать метод start еще раз.

Важно!
Если вызвать метод start для метки, для которой еще не завершена предыдущая итерация профилирования (не был вызван метод stop), запрос будет отклонен.

Например, необходимо выполнить профилирование метода, который делает некий расчет:

function calculateSomething() {
    performanceManager.start("calculateSomething");
    setTimeout(function() {
        performanceManager.stop("calculateSomething");
        console.log("done");
    }, 200);
}

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

Важно!
При профилировании консоль браузера обязательно должна быть закрыта. Открытая консоль искажает замеры, т.к. выполнение javascript-кода, отображение и расчет стилей DOM-элементов замедляется в несколько раз.

Вывод результатов профилирования
Для вывода результатов профилирования используются методы getProfileInfo() и getHierarchyProfileInfo().
Метод getProfileInfo() выводит результат как есть, без дополнительной обработки.
Метод getHierarchyProfileInfo() выводит результат в иерархическом виде. Этот метод удобно использовать для профилирования сложных асинхронных объектов. Более детальная информация о функциях и их параметрах ниже.
getProfileInfo
Результатом вызова метода getProfileInfo() будет следующий вывод в консоль:
> [Имя метки 1]:
> avgDuration: [Среднее время выполнения метки 1]ms
> time: [Общее время выполнения метки 1]ms
> callsCount: [Количество итерация профилирования метки 1]

Пример вывода результата для вызова метода getProfileInfo():

function calculateSomething() {
    performanceManager.start("calculateSomething");
    setTimeout(function() {
        performanceManager.stop("calculateSomething");
        console.log("done");
    }, 200);
}
calculateSomething();
> done
calculateSomething();
> done
calculateSomething();
> done
performanceManager.getProfileInfo();
> calculateSomething:
>    avgDuration: 717ms;
>    time: 2152ms
>    callsCount: 3

Важно!
Метод setTimeout не гарантирует вызов callback-функции через переданное количество миллисекунд, этот метод гарантирует, что код выполнится не раньше чем заданный промежуток времени. Этим и объясняется большее время выполнения функции.
Для вывода полной информации о каждой итерации профилирования, нужно вызвать метод getProfileInfo() с параметром showAllCalls:
performanceManager.getProfileInfo({ showAllCalls: true });
> calculateSomething:
> avgDuration: 717ms;
> time: 2152ms
> callsCount: 3
> call №0
> duration: 523ms
> startTime: 24 m : 24 s : 367 ms
> endTime: 24 m : 24 s : 890 ms
> call №1
> duration: 763ms
> startTime: 24 m : 26 s : 128 ms
> endTime: 24 m : 26 s : 891 ms
> call №2
> duration: 866ms
> startTime: 24 m : 28 s : 30 ms
> endTime: 24 m : 28 s : 896 ms

Более подробно о выводе профайлера далее.

getHierarchyProfileInfo

Метод getHierarchyProfileInfo() выводит результат в иерархическом виде. Иерархия меток строится на основе имени метки и разделителя (по умолчанию "_"). Т.е. имена меток интерпретируются как полное имя с указанным пространством имен (namespace).
Например есть метка с именем "MyCommonModule_MySectionModule_MyModule". Профайлер будет интерпретировать это имя так: в пространстве имен "MyCommonModule" есть пространство имен "MySectionModule" в котором есть метка "MyModule". Будет построена следующая структура:
MyCommonModule = {
MySectionModule: {
MyModule: Метка
}
}
Если при профилировании встретится другая метка с именем "MyCommonModule_MySectionModule2_MyModule3", структура перестроится следующим образом:
MyCommonModule = {
MySectionModule: {
MyModule: Метка 1
},
MySectionModule2: {
MyModule3: Метка 2
}
}
Количество пространств имен не ограничено.
Таким образом можно визуально отобразить вложенность вызова меток. Пример - загрузка модулей приложения.
В файле core.js уже установлены метки для профилирования процесса загрузки модулей. Приложение bpm'online при загрузке модулей формирует идентификаторы модулей путем добавления нижнего подчеркивания к идентификатору родительского модуля и имени загружаемого модуля (moduleId = ownerModule.id + "_" + module.name). Вывод информации о профилировании загрузки модулей удобно делать в иерархическом виде.
Пример вывода результатов при вызове метода getHierarchyProfileInfo():

 performanceManager.getHierarchyProfileInfo();
>    ViewModuleWrapper
>        loadModule
>            avgDuration: 10392ms
>            time: 10392ms
>            callsCount: 1
>    ViewModule
>        loadModule
>            avgDuration: 10691ms
>            time: 10691ms
>            callsCount: 1
>        NavigationModule
>            loadModule
>                avgDuration: 618ms
>                time: 618ms
>                callsCount: 1
>        ProcessModuleV2
>            loadModule
>                avgDuration: 4538ms
>                time: 4538ms
>                callsCount: 1

Метод так же поддерживает опцию showAllCalls, которая выводит информацию о всех итерациях профилирования для каждой метки.

API
performanceManager имеет следующее API:

  • start(markName) - Начинает профилирование метки.
  • stop(markName) - Завершает профилирование метки.
  • clear(markName) - Удаляет метку
  • clearAll() - Удаляет все метки.
  • getProfileInfo(config) - Выводит результаты профилирования в плоском виде.
  • getHierarchyProfileInfo(config) - Выводит результаты профилирования в иерархическом виде.
  • setLogObject(logObbject) - Устанавливает объект логирования.

Методы, которые остались от старого профайлера и не поддерживаются больше в версиях выше 7.5.0:

  • startCounter
  • stopCounter
  • startAsyncCounter
  • stopAsyncCounter
  • setTimeStamp
  • getTimeStamp
  • getTimeSpan
  • clearTimeStamp
  • clearAllTimeStamps
  • start(markName)

start(markName)
Начинает профилирование метки с переданным именем.. Если метки не существует - она создается. Если метка существует и для нее предыдущая итерация профилирования не закончена, запрос на профилирование отклоняется.
stop(markName)
Завершает профилирование метки с переданным именем.. Если метки нет или предыдущая итерация профилирования уже завершена, запрос отклоняется.
clear(markName)
Удаляет метку с переданным именем.
clearAll()
Удаляет все метки.
setLogObject(logObbject)
Устанавливает объект логирования.
getProfileInfo(config) / getHierarchyProfileInfo(config)
Выводит результаты профилирования. Разница между этими методами лишь в форме вывода результата. В качестве аргумента, методы принимают конфигурационный объект, с помощью которого можно настраивать или фильтровать результат.
Параметры конфигурационного объекта
filter
Фильтр для вывода меток. Фильтр применяется для каждой метки при выводе результата. Может быть одним из двух типов:
Функция - фильтр должен возвращать булево значение, в качестве аргумента передается копия метки.
Строка - Выполняется проверка соответствия строки регулярному выражению avgDurationLimit:\s*(\d+)\s* (avgDurationLimit: Number)
Строка соответствует регулярному выражению - выводится результат только для тех меток, среднее время выполнения которых превышает лимит.
Строка не соответствует регулярному выражению - выводится результат только для тех меток, в имени который содержится переданная подстрока.
showFlat
Признак вывода результата в плоском виде. Является предустановленным значением для метода getProfileInfo(), методом getHierarchyProfileInfo() не используется.
showByNamespace
Признак вывода результата в иерархическом виде. Является предустановленным значением для метода getHierarchyProfileInfo(), методом getProfileInfo() не используется.
namespaceSeparator
Разделитель для построения иерархии меток. Значение по умолчанию "_". Используется только методом getHierarchyProfileInfo().
showAllCalls
Признак того, что надо выводить все итерации замеров. Значение по умолчанию false.
hightlightDurationOverflow
Признак того, что надо подсвечивать значения, которые превышают лимит заданный настройкой durationLimit. Значение по умолчанию false.
Проверяется как время профилирования каждой итерации, так и среднее время профилирования метки.
durationLimit
Лимит значения для подсветки результатов. используется в связке с настройкой hightlightDurationOverflow.

Настройки hightlightDurationOverflow и durationLimit работает не во всех браузерах. Поддерживаемые браузеры: Chrome, FireFox, Safari.

Механизм performanceManager
В основе механизма работы performanceManager-а лежит W3C-стандарт UserTimingApi. Браузеры реализуя этот стандарт предоставляют объект window.performance. Для performanceManager важно наличие следующих методов:
now - возвращает количество миллисекунд прошедших с момента начала загрузки страницы. Использует DOMHighResTimeStamp.
mark - сохраняет временную метку и сохраняет ее с параметром startDate равным now().
measure - выполняет расчет количества миллисекунд между двумя временными метками.
getEntriesByName - возвращает массив временных меток с указанным именем.
clearMeasures - удаляет сохраненный результат расчета с указанным именем. Если имя не передано, удаляет все результаты.
clearMarks - удаляет временную метку с указанным имеем. Если имя не передано, удаляет все метки.
Не все браузеры поддерживают UserTimingApi, поэтому был реализован эмулятор, который работает на основе объекта Date. При инициализации, performanceManager проверяет наличие объект performance, а также наличие перечисленных методов у этого объекта. Если какого-либо метода нет, либо нет объекта performnce - подключается эмулятор.
Далее вводится внутренний класс Mark (метка), который может хранить в себе несколько замеров.

Свойства класса Mark:

  • name - имя метки.
  • measurements - массив замеров метки.
  • requiredCalculateProperties - массив свойств, необходимых для расчета показателей.
  • durationOverflowHighlightStyle - стиль для подсветки результатов при выводе.
  • Методы класса Mark:
  • clear - Удаляет все временные метки и сохраненные результаты расчета для метки (mark и measure).
  • isCalculated - Возвращает признак того, что все показатели для метки расcчитаны (рассчитано время замера и среднее время замера метки).
  • isMeasureCalculatable - Возвращает признак того, переданный замер уже расcчитан (рассчитано время замера endTime - startTime).
  • isCalculatable - Возвращает признак того, что метка рассчитываемая (При фильтрации выводимого результата передается копия метки из которой удаляются имена временных меток, что бы случайно не удалить результаты вызовом метода calculate(). Метод проверяет наличие этих свойств.).
  • calculate - Выполняет расчет показателей метки и ее замеров.
  • copy - Возвращает Копию метки и ее замеров.
  • createMeasure - Создает объект замера для метки и возвращает его (Для созданного замера генерируются имена временных меток для времени старта замера, времени завершения замера и результата расчета).
  • getLastMeasure - Возвращает последний объект замера для метки.
  • isStopped - Возвращает признак того, что для метки в данный момент закончено профилирование и установлены все временные метки.
  • log - Выполняет логирование метки и ее замеров.
  • logMeasurements - Выполняет логирование замеров метки.
  • logMetric - Выполняет логирование метрики метки или замера.

Чтобы профилирование не влияло на работу приложения, расчет всех показателей выполняется при выводе результата. При вызове метода start() устанавливается временная метка начала замера, а при вызове метода stop - устанавливается временная метка завершения замера. Другими словами вызов методов start и stop создают объект класса Mark и устанавливают временный метки.
При вызове метода getProfileInfo() либо метода getHierarchyProfileInfo() выполняется расчет показателей всех меток, для которых завершено профилирование. После, анализируется переданный конфигурационный объект и происходит вывод результатов.
Метод getProfileInfo() перебирает все метки, применяя фильтр, и выводит результат.
Метод getHierarchyProfileInfo() сначала строит объект иерархии меток, в процессе построения которого выполняет фильтрацию, после чего выводит результат.

Не понял - это похоже для web-клиента? У нас толстый-клиент.

Толстого клиента для 7.X нет (кроме Mobile). У вас Terrasoft 3.X? Об отладке для неё есть статья с описанием более лёгких аналогов Студии.

В конфигурации также есть стандартный скрипт scr_DebugUtils. Тут некоторое обсуждение. И ещё есть такая сторонняя разработка scr_ScriptExecutionAnalysis.

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

Толстого клиента для 7.X нет (кроме Mobile). У вас Terrasoft 3.X? Об отладке для неё есть статья с описанием более лёгких аналогов Студии.

В конфигурации также есть стандартный скрипт scr_DebugUtils. Тут некоторое обсуждение. И ещё есть такая сторонняя разработка scr_ScriptExecutionAnalysis.


Добрый день, предложенные функции из скрипта scr_ScriptExecutionAnalysis не отрабатывали корректно в нашем случае. С помощью отладчика было установлено при вызове какой функции самое большое время ожидания. При попытке разместить данный вызов между вызовами StartTiming() и EndTiming() в результате получалось значение в 0 ms.

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

Всем доброго дня!

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

К примеру в Рабочее место "Продажи" добавить справочник Должности и модуль дизайнера системы "Импорт данных из Excel"?

Нравится

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

Добрый день!

Какую задачу Вы хотите решить таким добавлением?

Импорт данных Вы можете произвести из Главное меню -> Дизайнер системы -> Импорт данных из Excel. По умолчанию, импорт доступен пользователям с ролью "Системный администратор". Однако такой доступ может быть расширен правами доступа на операции, операции "Импорт из Excel".

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

"Демьяник Алексей Олегович" написал:Какую задачу Вы хотите решить таким добавлением?

Алексей, спасибо за ответ. Задача в получении быстрого доступа для ролей обладающих правами на доступ к данной функциональности. То есть роль имеющая права корректировки категорий продуктов, при этом не пользующаяся продуктовой базой, должна иметь возможность быстро добавить какую-либо новую категорию. Для этой роли (фактически) справочники категорий товаров являются Рабочим местом! То есть переход в один клик (находясь в любом разделе системы) к ежедневно редактируемому справочнику весьма важный элемент (в отличие от Дизайнер -> Справочники -> Категория)!

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

В Вашем случае, по сути, запрашиваемый функционал уже реализован. При добавлении справочного значения, в случае отсутствия оного, его можно добавить по нажатию на соответствующую кнопку вверху области реестра. Если значения в справочном поле отображаются в виде списка, то необходимо в разделе нажать кнопку [Вид]-[Открыть мастер раздела] и открыть нужное нам справочное поле. В открытой карточке убрать чекбокс на против значения [Отображать в виде списке]. В таком случае мы сможем переходить в нужное нам представление при нажатии на lookup. Если при переходе у Вас не будет отображаться кнопка [Добавить], то ознакомится с решением можно здесь http://www.community.terrasoft.ru/forum/topic/12071#comment-52199

"Адасюк Валерий Викторович" написал:запрашиваемый функционал уже реализован

Валерий, видимо мы друг друг не поняли. Сотруднику корректирующему Категории товаров нужно рабочее место, где вместо Контакты, контрагенты, Лента и пр. написано Категории товаров, Типы товаров и т.п. И в 1 клик сотрудник перемещается в данный справочник

"AlexLS" написал:И в 1 клик сотрудник перемещается в данный справочник

а в чем тогда проблема, если сотрудник работает с данным полем в конкретной карточке какого-нибудь раздела, то он и так в 1 клик по нажатию на лукапное поле переходит в этот справочник, где можно добавлять новые или удалять уже существующие записи. Если речь идет о том, чтоб выводить как отдельный раздел, то базовая логика работы системы не дает такой возможности перехода в 1 клик. Также, доступен раздел [Справочники] в в главном меню системы, где можно открыть нужный справочник, но тут уже 3 клика выходит правда.

"Адасюк Валерий Викторович" написал: то базовая логика работы системы не дает такой возможности перехода в 1 клик

Спасибо, Валерий.
Хотел услышать обратное, но главное, что вердикт получил!

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

Коллеги, добрый день!

Только начинаю осваивать BPM (и уже на версии 7.6).

Подскажите, как поле ProcessListeners нужно использовать?

Есть ли какое-то описание как оно используется?

Нравится

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

Добрый день!

Данное поле является служебным, поэтому не рекомендуется его изменять. В нем хранится информация о процессах, которые могут быть запущены при:
1) изменении записи
2) удалении записи

"Демьяник Алексей Олегович" написал:поле является служебным

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

Доброе утро!

Для понимания, как обрабатывается данное поле, Вы можете просмотреть в BaseEntity методы TryProcessComplete и ProcessCompleteExecuting.

"Демьяник Алексей Олегович" написал:в BaseEntity методы TryProcessComplete и ProcessCompleteExecuting.

Алексей, добрый день! В пакете Base нашел объект BaseEntity, являющийся структурой базового объекта, где нет никаких методов

Добрый день!

В базовом объекте есть два вида свойств:
1) свойства объекта
2) процессы, запускаемые по событиям в объекте

Кнопки переключения между режимами отмечены желтым цветом:

Для того, чтобы просмотреть исходный код объекта, Вам необходимо в правом верхнем углу нажать "Дополнительно" -> "Открыть исходный код":

В открывшемся окне введите в строку поиска запрашиваемые методы.

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

...   [ProcessListeners] >= 0 ...

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

Разбираясь с нюансами работы bpm'online, создал SVN хранилище, затем создал свой пакет.
Дальше - немного начудил :)
Удалил хранилище. Теперь хочу удалить пакет - не получается. Система ругается "хранилище не зарегистрировано".
Подскажите, как удалить пакет?

Нравится

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

Добрый день, Николай.

Есть два решения данной задачи.
1) Создать новое хранилище и указать к нему путь. Удалить пакет и зафиксировать изменения в хранилище.

2) В файле Web.config приложения (находится в папке WebApp на сервере приложения) изменить:

  <appSettings>
    <add key="UseSvn" value="true" />

на

  <appSettings>
    <add key="UseSvn" value="false" />

После, очистить Редис и удалить ненужный пакет.

Алексей, спасибо! Получилось :)

Андрей, данный комментарий, вероятно, уже устарел.

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

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

Добрый день!
Такая ситуация:

1) Настроена синхронизация с LDAP, пользователи и контакты добавляются, лицензии назначены, но в систему войти под доменныйм паролем не удается. Неверное имя пользователя, причем если через базу сделать update пароля для LDAP-пользователя (ну взять от suervisor например), то система радостно запускает сотрудника.

2) Для импортируемых иp LDAP пользователей контрагент автоматически проставляется, а должность и тип "Сотрудник" нет.

Подскажите, в какую сторону копать?
Спасибо

Нравится

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

Здравствуйте.
1) При LDAP-авторизации BPM'online проверяет пароль не в базе данных, а обращается к домену и если получает ответ, что учётные данные пользователя корректны - разрешает вход в систему. Для возможности LDAP-авторизации нужно кроме настройки синхронизации, добавить в конфигурационный файл web.config (находится в корне директории с файлами сайта) провайдер авторизации - Ldap (важен регистр).
Пример:

 <auth providerNames="InternalUserPassword,Ldap"

2) Для того, что бы проставлялась должность, точно такое же название должно быть в справочнике должностей. Что касается тип "Сотрудник" у контакта пользователя, то это не является обязательным условием для возможности авторизации.

Спасибо, Александр.
Добавление auth providerNames="InternalUserPassword,Ldap" решило все вопросы.

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

Добрый день,

Каким образом можно удалить Обращения, если при их удалении пишется о том, что "Удаление элементов, используемых в других объектах невозможно".

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

Нравится

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

Маргарита, здравствуйте!

Данное сообщение означает, что у записи присутствует связь с другими объектами. Например, запись задействована в БП или присутствует на детали у другого объекта.

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

Если же необходимо удалить такие записи, то это возможно только через БД.

Необходимо выполнить скрипт на удаление, например:

Delete from "Case"
Where Number=’CR-1

Но выполнив скрипт запись не удалиться, а выдаст результат с ошибкой, что данная запись присутствует в конкретной таблице/колонке.
В результате необходимо с начала удалить запись (по ID записи) с связанных таблиц, а затем саму запись.

Спасибо Дмитрий за ваш ответ)

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

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

В примере ниже проверяется, что leftExpression равно value, одному value. Можно ли проверить, что leftExpression равно одному из многих значений, указанных в value, т.е. чтобы value был массивом значений? Пробовал писать что-то подобное "value": ["bla1", "bla2"] но, видимо, чего-то не хватало..

"UsrCandforVac": {
        "BindParameterVisibleUsrCandforVacByUsrCandGlobalStatus": {
                ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                property: BusinessRuleModule.enums.Property.VISIBLE,
                logical: Terrasoft.LogicalOperatorType.AND,
                "conditions": [{
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrCandGlobalStatus"
                        },
                        "comparisonType": Terrasoft.ComparisonType.EQUAL,
                        "rightExpression": {
                                "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                "value": "5fc83e17-0996-4642-bb22-1f93869c6ebc"
                        }
                }]
        }
}

Спасибо

Нравится

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

Добрый день!

К сожалению, значение "Value" не принимает массив. "Value" может принимать значение булево или один элемент значения.

Если Вам необходимо несколько значений, то Вы можете в массиве conditions добавлять необходимо количество раз код, который ниже:

{
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrCandGlobalStatus"
                        },
                        "comparisonType": Terrasoft.ComparisonType.EQUAL,
                        "rightExpression": {
                                "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                "value": "5fc83e17-0996-4642-bb22-1f93869c6ebc"
                        }
                }

но с разными значениями value.

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

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