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

Нравится

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нравится

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

Здравствуйте!
Пытаюсь создать преднастроенную страницу, содержащую справочники. Поля на странице относятся к разным объектам. Делал аналогично примеру из конфигурации (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: {}
		};
	});
Показать все комментарии

Возможна ли интеграция по 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…. Это серверная, на клиенте почти похожий алгоритм.

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

Настроил интеграцию с e-mail и вкачал в систему кучу ненужных писем. Теперь хочу выбрать отдельные IMAP-папки, а лишние убрать. Удаление учётки не помогло. Как быть?

Нравится

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

Виктор, или через запрос в БД или в ручную через приложение (удалять по каждой записи).

Каким именно запросом и как его применить? Не программист, к сожалению.

Необходимо создать SQL запрос примерно такой:

Delete from Activity Where Type = 'E-mail'

Но нужно проверить. Удалить запросом можно только если у Вас on-site, так как имеете доступ к БД.
Более подробно можете ознакомиться здесь - https://technet.microsoft.com/ru-ru/library/ms175544(v=sql.105).aspx

В Вашему случае рекомендую удалить записи через приложение (кнопка "Удалить").

On-demand. Там 10 000 писем, руками удалять если только тысячу индусов нанять. Какие ещё варианты? С вашей помощью можно удалить?

Я не сотрудник тех. поддержки.
Тогда Вам необходимо обратиться с данным запросом в техническую поддержку Terrasoft (support@terrasoft.ru).

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

Коллеги, просьба помочь разобраться с деталями. Версия 7.6.

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

        "Order": {
                "schemaName": "OrderDetailV2",
                "entitySchemaName": "Order",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"
                },
                "filterMethod": "OrderFilter",
                "captionName": "OrderDetailCaption" // в локализируемых строках прописано "КП"
        },
        "Order1": {
                "schemaName": "OrderDetailV2",
                "entitySchemaName": "Order",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"
                },
                "filterMethod": "Order1Filter",
                "captionName": "Образцы"
        },
        "Order2": {
                "schemaName": "OrderDetailV2",
                "entitySchemaName": "Order",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"
                },
                "filterMethod": "Order2Filter",
                "captionName": "Заказы"
        }

Вручную прописал фильтрацию на деталях:

                        OrderFilter: function() {
                                var filterGroup = new this.Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                                filterGroup.add("OrderTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrderType", "358479b6-bf4b-46ed-93ee-5a8c558a0593") // КП
                                );
                                filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Id"))
                                );
                                return filterGroup;
                        },
                        Order1Filter: function() {
                                var filterGroup = new this.Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                                filterGroup.add("OrderTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrderType", "21d5f440-ff74-4a89-8233-127facc90be4") // Образцы
                                );
                                filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Id"))
                                );
                                return filterGroup;
                        },
                        Order2Filter: function() {
                                var filterGroup = new this.Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                                filterGroup.add("OrderTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrderType", "d8e59907-2b35-4429-bd14-2f5847dbf787") // Заказ
                                );
                                filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Id"))
                                );
                                return filterGroup;
                        }

Однако нужного результата мы не получили:
1. Не изменились заголовки деталей (так и остались «Заказы»)
2. При нажатии на детали 1 и 2 разворачивается деталь 3, а нажимаемая остаётся без изменений
3. При переключении между вкладками карточки клиента произвольно меняются фильтры между деталями

Соответственно, вопросы:
1. Как изменить заголовок детали? Варианты "captionName": "OrderDetailCaption" (OrderDetailCaption – локализируемая строка) и "captionName": "Образцы" не срабатывают
2. Как сделать разворачивание / сворачивание деталей независимым друг от друга? Т.е. чтобы при разворачивании, к примеру, детали №2 разворачивалась она и только она, а детали №1 и №3 не менялись
3. Как зафиксировать условия фильтрации? Проблема в том, что при переключении вкладок карточка контрагента (Основная информация, Документы, История и т.п.) произвольно выставляются фильтры в деталях – то Образцы, то Заказ, то КП по одной и той же детали (хотя по ней жёстко прописан фильтр в коде)

Нравится

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

Чтобы не было описанной путаницы, я бы предложил сделать три разных клиентских модуля, в которых родителем указан OrderDetailV2, и прицепил бы их в качестве трех деталей. Код карточки у вас уже есть, останется только название schemaName новые прописать

Александр, честно говоря, не совсем понял, как это сделать. Но Ваша подсказка натолкнула на идею, которая сработала - просто создал 3 детали на основе объекта Заказ через мастер деталей, и разместил их на странице контрагента, далее прописал фильтры на каждую из них - и всё заработало! Спасибо

"Антон Кравченко" написал:просто создал 3 детали на основе объекта Заказ

Ну я это и предложил :)
Только вручную создать, хотя и с помощью мастера тоже можно

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

Добрый день!
Подскажите, пожалуйста синтаксис запрос COUNT на C#

Например, такой запрос
var select =
new Select(userConnection)
.Column("SysUserInRole","SysUserId")
.From("SysUserInRole")
.Join(JoinType.Inner, "SysAdminUnit").On("SysUserInRole", "SysUserId").IsEqual("SysAdminUnit", "Id")
.Where("SysUserInRole", "SysRoleId").IsEqual(new QueryParameter(ownerGroup))
as Select;

Как здесь правильно прописать COUNT?

Нравится

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

.Column(Func.Count("TableName", "FieldName")).As("ColumnAlias")

что то вроде такого

Спасибо

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

к String, например, так
(String)dataReader.GetColumnValue("NameGroup")

к Guid, например, так
(Guid)dataReader.GetColumnValue("NameId")

а к целому типу как?

Int32.Parse()
к примеру:
Int32.Parse((String)dataReader.GetColumnValue("NameCount"))

а если NameCount - это и так число?

я, наверное, не так выразилась
- хочу обратиться, результату значения из запроса
dataReader.GetColumnValue("NameCount")
NameCount"- это число (кол-во записей)

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

Попробуйте так:

dataReader.GetColumnValue<int>("NameCount")
Показать все комментарии

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

Возможно ли тип данных дробное число сделать с точностью 0 или что бы на клиенте не отображалась дробная часть.
И есть ли более подробная информация о типе колонки "Деньги", в чем смыл этого типа?
В SDK написано Деньги - Числовые данные с точностью до сотых, (Тип колонки “Деньги” выделен в качестве отдельного на случай, если точность фиксации финансовых расчетов в вашей компании отличается от точности, с которой, например, компания предлагает продукты.) но есть тип Дробное число (0,01) так зачем тип Деньги? возможно его точностью можно манипулировать?

Нравится

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

Добрый день!

Для того, чтобы дробная часть вообще не отображалась в карточке редактирования, можно установить в блоке diff для соответствующего контрола тип "dataValueType": Terrasoft.DataValueType.INTEGER. Если Вам необходимо изменить отображаемое количество знаков после запятой, установите

"controlConfig": {
	"decimalPrecision": 1
}

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

Что касается типа "Деньги" - фактически он ничем не отличается от типа "Дробное число (0,01)", просто на клиенте для этого типа создаётся контрол с указанием точности 2 (до сотых), а в случае дробных типов точность не указывается (она вычисляется по колонке объекта). Данный тип создан для облегчения понимания.

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

Добрый день.
Есть задача отобразить рабочий телефон отвтетственного по продаже в ПФ Word. Телефон хранится в детали Средства связи контакта. Как мне получить данные детали Ответственного и отфильтровать их по типу.
Пытался добавить:
1. Через вкл. "Поля печатной формы" -> Системные связи. Однако, там отображается только агрегированные данные (количество, сумма).
2. Через вкладку "Табличные части печатной формы", но добавить туда новые объекты не представляется возможным (ошибка:Невозможно обновить представление или функцию "dbo.VwSysSchemaInfo", так как изменение влияет на несколько базовых таблиц.)

Подскажите, есть ли реальныйй механизм осуществить указанные действия?
И если да, то как это сделать?
спасибо.

Нравится

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

Игорь, а какая используется версия системы?

Я использую BPMOnline Cargo 5.4.0.1555. Но данная проблема является общей для всех версий BPMOnline в части формирования отчётов Word

Может, стоит пойти другим путём?
В карточке контакта есть поле «рабочий телефон»?
Если есть, брать оттуда.
Если нет — добавить поле в объект «контакт» (можно в карточку не выводить) и заполнять его при добавлении-изменении-удалении средства связи на уровне объекта детали или триггером.

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