В статье Добавление автонумерации к полю страницы описан пример из которого не совсем понятна следующая строка UserTask1.EntitySchema = Entity.Schema;.
"Установка схемы для генерации номера." - т.е. логично предположить, что Entity.Schema - схема автонумерации? Как-то не понятно...
...тогда вопрос: какие существуют еще схемы?
А если возникнет необходимость в одном разделе, в одной таблице еще одни номер сгенерировать (т.е. в двух разных полях разные номера) тогда как?

Нравится

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

"Терещенко Алексей" написал:.е. логично предположить, что Entity.Schema - схема автонумерации? Как-то не понятно...

Ноуп.
UserTask1 - таск генерации номера (пользовательское действие вроде называется, которое вы тащите с левой панели).
.EntitySchema - входящий параметр этого генератора

Entity - экземпляр класса Entity под текущий объект
.Schema - поле со схемой объекта (таблицы)

"Варфоломеев Данила" написал:UserTask1 - таск генерации номера
- нет. генерация номера в данном ЮзерТаск1 - это значение, выбранное в поле "Действие". Как таково сам по себе ЮзерТаск1 - не производит никакой генерации.

На самом деле если Вам необходим просто итерируемый номер, логика описанная в статье - избыточна.
Он имеет смысл к реализации когда номер строится с участием "маски".
Самый простой способ - это создать свою системную переменную под каждую нумеруемую сущность.
И в своей реализации получать значение и итерировать его самостоятельно. (Или на бэкенде в БП или на фронте в JS)
на фронте

//получить значение системной переменной
//https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.core.SysSettings-method-querySysSettings
Terrasoft.SysSettings.querySysSettings(SysSettingNamesArray, callback, scope)
//установить значение системной переменной
//https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.core.SysSettings-method-updateSysSettingsValue
Terrasoft.SysSettings.updateSysSettingsValue(configurationObject, callback, scope)
Показать все комментарии

Доброго времени суток. Где можно взять установщик BPM Online? Разработка on-cloud недостаточно хороша, хотелось бы вести разработку со своей машины.

Нравится

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

Добрый день,

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

С уважением,
Наталия

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

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

Нравится

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

Первое что напрашивается это конечно же настройка прав доступа:
https://www.youtube.com/watch?v=x5C6VcOhKj4
Колонки не будут серыми и недоступными на изменение, но запись сохранить у пользователя не получится, будет соответствующее сообщение об отсутствии прав.

Другой способ же, бизнес правила по условиям на "только чтение":
https://academy.terrasoft.ru/documents/technic-sdk/7-8/pravilo-bindpara…
Работы тут больше, т.к. на каждое поле прийдется писать свое правило.

"Максим Шевченко" написал:Работы тут больше, т.к. на каждое поле прийдется писать свое правило.

А можно как-то скриптом перебрать все поля страницы и всем поставить "только чтение", как это делалось в 3.х?

Добрый день!
Можно сделать с помощью CSS. Т.е. при открытии карточки вы устанавливаете стиль.
К примеру, чтобы все читалось, но не редактировалось (правда и не кликалось), то можно добавить стиль в основной контейнер карточки: pointer-events: none;
Если же вам нужно чтобы только нужные элементы, то подход тот же, но CSS другой.
Пример:
div input,a,span,div[id*='Container_Control'],div[class='base-edit-clear-icon'] {
pointer-events: none;
}
Можно добавить opacity для визуализации :)

Просто другие варианты трудозатратны, а это простой способ

"Владимир Соколов" написал:А можно как-то скриптом перебрать все поля страницы и всем поставить "только чтение", как это делалось в 3.х?

Ну при помощи Ext.JS можно проделать вот такой "хак"

Ext.ComponentMgr.all.each(function(c){
	var cmp = Ext.ComponentMgr.all.map[c];
	if(cmp.className){
		if(cmp.className.indexOf("Edit") !== -1){
			if(cmp.setEnabled){
				cmp.setEnabled(false)
			}
                }
	}
})

Выполнение этого скрипта сделает все поля карточки недоступными для редактирования.

Есть несколько НО:
1) ререндер карточки - это состояние сбросит.
(в основном это создает проблемы, при переходе из карточки в карточку по Chain, что кстати было бы возможно предусмотреть и исправить, если бы на мой вопрос вот здесь, кто ни будь нашел/дал ответ)
2) это не касается каких либо элементов управления кнопок, пунктов меню и т.д. только поля.

"Владимир Соколов" написал:
Максим Шевченко пишет:

Работы тут больше, т.к. на каждое поле прийдется писать свое правило.

А можно как-то скриптом перебрать все поля страницы и всем поставить "только чтение", как это делалось в 3.х?

Собрал замещающий модуль для BasePageV2. Перебирает все поля и проставляет атрибут Enabled = False. Управляется всё дефолтным параметром "CardState" который передаётся в схему.

define("BasePageV2", ["ConfigurationEnums"], function (enums) {
return {
messages: {

},
methods: {
disableControls: function (item, callback) {
if (item.item) {
this.disableControls(item.item)
} else
if (item.className === "Terrasoft.Container" || item.className === "Terrasoft.GridLayout" || item.className === "Terrasoft.ControlGroup") {
for (item of item.items) {
this.disableControls(item)
}
} else
if (this.isEditClassname(item.className)) {
item.enabled = false;
}
else
console.log(item.className);

if (callback)
callback.call(this);
},
isEditClassname: function (name) {
return this.getEditControlsClassNames().indexOf(name) != -1;
},
getEditControlsClassNames: function () {
var EditControlsClassNames = ["Terrasoft.Label","Terrasoft.DateEdit", "Terrasoft.LookupEdit", "Terrasoft.TextEdit",
"Terrasoft.ListView", "Terrasoft.RadioButton", "Terrasoft.TimeEdit", "Terrasoft.FloatEdit",
"Terrasoft.CheckBoxEdit", "Terrasoft.ComboBoxEdit", "Terrasoft.InlineTextEdit", "Terrasoft.ImageEdit", "Terrasoft.IntegerEdit", "Terrasoft.MemoEdit"]
return EditControlsClassNames;
},
getCardState: function () {
return this.getDefaultValueByName("CardState");
},
init: function () {
var cardState = this.getCardState();
if (cardState && cardState === enums.CardState.View) {
var parentMethod = this.getParentMethod();
var arg = arguments;
this.disableControls(arguments[1].viewConfig[0], function () {
parentMethod.apply(this, arg);
});
}
else {
this.callParent(arguments);
}
}
},
diff: /**SCHEMA_DIFF*/[

]/**SCHEMA_DIFF*/
};
});

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

Скриншот ошибки

Возникает ошибка TypeError: Cannot read property 'name' of undefined в месте на скриншоте (скрипт ProfileUtilities.js) при переходе на страницу созданого мной раздела. Прошу подсказки о возможной причине возникшей ошибки, так как уважаемые создатели данной чудо-системы не сочли нужным позаботиться о разработчиках и сделать проверки входных данных и выкидывания человеческих ошибок с понятными объяснениями проблем.

Нравится

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

Вроде как пытается из профиля пользователя вытащить настройки колонок для реестра, но фейлится.
Можно попробовать настроить колонки заново или сбросить профиль пользователя.

"Варфоломеев Данила" написал:

Вроде как пытается из профиля пользователя вытащить настройки колонок для реестра, но фейлится.

Можно попробовать настроить колонки заново или сбросить профиль пользователя.


Спасибо. А где настройки колонок нужно прописать, если не секрет? А то у меня есть еще один раздел, на котором работает все ок, и вроде как я делал все так же само

"Франчук Виталий" написал:прописать, если не секрет?

Либо ручками настроить через вид-настройка колонок.
Либо кодом в diff(взял первый попавшийся пример из конфигурации):

{
	"operation": "merge",
	"name": "DataGrid",
	"values": {
		"type": "listed",
		"listedConfig": {
			"name": "DataGridListedConfig",
			"items": [
				{
					"name": "RelatedObjectListedGridColumn",
					"bindTo": "RelatedObjectName",
					"position": {"column": 0, "colSpan": 12},
					"type": Terrasoft.GridCellType.TITLE,
					"caption": resources.localizableStrings.RelatedObjectName
				},
				{
					"name": "RelationTypeListedGridColumn",
					"bindTo": "RelationType",
					"position": {"column": 13, "colSpan": 12}
				}
			]
		},
		"tiledConfig": {
			"name": "DataGridTiledConfig",
			"grid": {"columns": 24, "rows": 3},
			"items": [
				{
					"name": "RelatedObjectTiledGridColumn",
					"bindTo": "RelatedObjectName",
					"position": {"row": 1, "column": 0, "colSpan": 12},
					"type": Terrasoft.GridCellType.TITLE,
					"caption": resources.localizableStrings.RelatedObjectNameCaption
				},
				{
					"name": "RelationTypeTiledGridColumn",
					"bindTo": "RelationType",
					"position": {"row": 1, "column": 13, "colSpan": 12}
				}
			]
		}
	}

"Варфоломеев Данила" написал:
Франчук Виталий пишет:

прописать, если не секрет?

Либо ручками настроить через вид-настройка колонок.

Либо кодом в diff(взял первый попавшийся пример из конфигурации):

{

        "operation": "merge",

        "name": "DataGrid",

        "values": {

                "type": "listed",

                "listedConfig": {

                        "name": "DataGridListedConfig",

                        "items": [

                                {

                                        "name": "RelatedObjectListedGridColumn",

                                        "bindTo": "RelatedObjectName",

                                        "position": {"column": 0, "colSpan": 12},

                                        "type": Terrasoft.GridCellType.TITLE,

                                        "caption": resources.localizableStrings.RelatedObjectName

                                },

                                {

                                        "name": "RelationTypeListedGridColumn",

                                        "bindTo": "RelationType",

                                        "position": {"column": 13, "colSpan": 12}

                                }

                        ]

                },

                "tiledConfig": {

                        "name": "DataGridTiledConfig",

                        "grid": {"columns": 24, "rows": 3},

                        "items": [

                                {

                                        "name": "RelatedObjectTiledGridColumn",

                                        "bindTo": "RelatedObjectName",

                                        "position": {"row": 1, "column": 0, "colSpan": 12},

                                        "type": Terrasoft.GridCellType.TITLE,

                                        "caption": resources.localizableStrings.RelatedObjectNameCaption

                                },

                                {

                                        "name": "RelationTypeTiledGridColumn",

                                        "bindTo": "RelationType",

                                        "position": {"row": 1, "column": 13, "colSpan": 12}

                                }

                        ]

                }

        }


Большое спасибо, уже не раз помогаешь)

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

Добрый день.

Где хранить аутентификационные данные для внешних веб сервисов, если учетные данные общие для всех пользователей?

У меня есть 2 варианта:
1) Хранить из непосредственно в исходниках сервиса

var client = new Namespace.SomeService();
client.Credentials = new NetworkCredential("login", "pass", "domain");

2) Хранить их в системных настройках, для этого придется создать 3 настройки и при вызове сервиса постоянно обращаться к ним.

Возможно есть еще какие то варианты которые я упускаю.
Так же меня интересуют вопросы касательно безопасности и быстродействия каждого из вариантов.

Нравится

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

Рекомендую использовать первый вариант, т.к. при втором варианте будет обращение к БД (если настройки не кэшируются).
Если планируется изменение учетных данных, то использовать второй вариант, но установив признак кэшируется.

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

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

При изменении стилей и сохранении обращения, в тему обращения попадают html-теги:

Как можно запретить использование стилей или сделать так, чтобы в тему попадал только текст без html-тегов?

Нравится

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

Антон, попробуйте найти в схеме и убрать атрибут
"contentType": Terrasoft.ContentType.RICH_TEXT - это атрибут который добавляет инструменты редактирования текста.

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

Антон, попробуйте найти в схеме и убрать атрибут

"contentType": Terrasoft.ContentType.RICH_TEXT - это атрибут который добавляет инструменты редактирования текста.

Илья добрый день!
Нашел замещающую схему PortalMessagePublisherPage и добавил в неё блок замещения объекта PortalMessageBody:

diff: /**SCHEMA_DIFF*/[
  {
   "operation": "merge",
   "name": "PortalMessageBody",
   "values": {
   "bindTo": "Message",
   /*"contentType": this.Terrasoft.ContentType.RICH_TEXT,*/
   "generator": "InlineTextEditViewGenerator.generate",
   "labelConfig": {
   "visible": true
   },
   "markerValue": "PortalMessageBody",
   "placeholder": {
      "bindTo": "PortalEditControlHintText"
   }
  },
 "parentName": "BodyContainer",
 "propertyName": "items"
 }
 ]/**SCHEMA_DIFF*/

Закомментировал строку
"contentType": this.Terrasoft.ContentType.RICH_TEXT
но инструмент для редактирования текста остался доступен.
Подскажите пожалуйста, что я делаю не так?

"Молчанов Антон Сергеевич" написал:Подскажите пожалуйста, что я делаю не так?

Можно так попробовать:

diff: /**SCHEMA_DIFF*/[
{
   "operation": "remove",
   "name": "PortalMessageBody"
},
  {
   "operation": "insert",
   "name": "PortalMessageBody",
   "values": {
   "bindTo": "Message",
   "contentType": this.Terrasoft.ContentType.LONG_TEXT, //для того, чтобы текст растягивался в ширину
   "labelConfig": {
   "visible": true
   },
   "markerValue": "PortalMessageBody",
   "placeholder": {
      "bindTo": "PortalEditControlHintText"
   }
  },
 "parentName": "BodyContainer", //в идеале в контейнер вставить GRID_LAYOUT и прописать layout в values (растянуть окошко с текстом на пару рядов)
 "propertyName": "items"
 }
 ]/**SCHEMA_DIFF*/

"Варфоломеев Данила" написал:Можно так попробовать:

Как только я убираю строчку:

"generator": "InlineTextEditViewGenerator.generate",

Текстовая строка исчезает (нельзя набрать текст)

а в консоле браузера возникают ошибки которых ранее не было

Если я убираю строчку

"contentType": this.Terrasoft.ContentType.RICH_TEXT

Панель для редактирования текста остается доступной

Может быть можно просто запретить отображение этой панели?

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

Сначала необходимо добавить блок удаления PortalMessageBody:
{
"operation": "remove",
"name": "PortalMessageBody"
}

Затем добавить его заново, изменив contentType на "this.Terrasoft.ContentType.LONG_TEXT" и удалив generator:
{
"operation": "insert",
"name": "PortalMessageBody",
"values": {
"bindTo": "Message",
"contentType": this.Terrasoft.ContentType.LONG_TEXT,
"labelConfig": {
"visible": true
},
"markerValue": "PortalMessageBody",
"placeholder": {
"bindTo": "PortalEditControlHintText"
}
},
"parentName": "BodyContainer",
"propertyName": "items"
}

После этого поле будет выглядеть стандартно без возможности редактирования стилей/шрифтов.

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

Собственно вопрос в заголовке.
Дело в том, что в лиде это отдельные схемы контейнеров LeadAccountProfileSchema и LeadContactProfileSchema.
А мне нужно вывести список контактов выбранного контрагента.
Как организовать данный фильтр? Пробовал замещать карточку лида и в ней указывать но не работает.
Да и не понятно какие колонки они используют? Такие: Account и Contact? Или что-то другое?

Можете дать готовое решение или хотя-бы объяснить всё понятно.

Нравится

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

Добрый день, Максим!

Думаю, самый простой вариант - добавить бизнес-правило. Если у Вас 7.10 - можно через мастер, если нет - то в карточке. Поля, которые Вам нужно - QualifiedContact и QualifiedAccount, это можно подсмотреть в объекте. Просто Contact и Account - это текстовые поля, а не справочные. Насколько я понимаю, потому что в момент создания лида не всегда они известны, да и можно написать название с ошибками.

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

Добрый день, Максим!

Думаю, самый простой вариант - добавить бизнес-правило. Если у Вас 7.10 - можно через мастер, если нет - то в карточке. Поля, которые Вам нужно - QualifiedContact и QualifiedAccount, это можно подсмотреть в объекте. Просто Contact и Account - это текстовые поля, а не справочные. Насколько я понимаю, потому что в момент создания лида не всегда они известны, да и можно написать название с ошибками.

Спасибо. Помогло с этими полями - QualifiedContact и QualifiedAccount!

"Сазонов Максим" написал:А мне нужно вывести список контактов выбранного контрагента.

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

Ответьте мне на эти вопросы, и я помогу Вам реализовать Ваш кейс.

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

Такое есть?

Нравится

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

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

Где именно Вы хотите видеть автонумерацию в мобильном приложении?

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

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

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

Только есть один момент.
1. В онлайн режиме если поле выведено поле с автонумерацией, то оно будет пустое при создании записи. Его не нужно заполнять (иначе логика не отработает). Номер отобразиться только после сохранения записи и при рефреше реестра. Мы рекомендуем скрыть данное поле для избежание путаницы.
2. В офлайн режиме номер присвоится только после синхронизации с сервером, так как логика реализована на серверной части. До синхронизации номер будет пустой.

Данные действия были протестированы на версии 7.10.2 (режим офлайн и онлайн).

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

Обнаружил некорректное поведение при отправке esq запроса, формируемого на стороне клиента.
Мне необходимо отфильтровать значения, выпадающие в Lookup поле.
Для этого в конфиге лукапа я устанавливаю значение свойству filters, в котором указываю, какие условия должны выполняться (ЛИБО поле не должно равняться определенному значению, ЛИБО поле может быть равно null).
Чтобы выполнялось условие "либо" - я указываю logicalComparisonTypes объекта Terrasoft.FilterGroup равное Terrasoft.LogicalOperatorType.OR (1).
Но фильтрация почему-то происходит, как будто я указываю условие не "либо", а "и".

Проверяю через tcpdump - какой именно запрос летит на сервер после формирования на клиенте, и к моему удивлению в запрос лепится "and" вместо "or".

001

Может кто сталкивался с подобной проблемой на 7.7, 7.8 или 7.10 - подскажите, пожалуйста, как боролись!

Нравится

3 комментария
Terrasoft.createFilterGroup().logicalOperation

возвращает по-умолчанию 0.

Ну собственно да, ответ выше, пишите
var filtersCollection = Terrasoft.createFilterGroup();
filtersCollection.logicalOperation = Terrasoft.LogicalOperatorType.AND;
при создании группы

Спасибо!
По ошибке использовал logicalComparisonTypes вместо logicalOperation

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

В разделе заказы при создании счета в детали график поставок и оплаты, добавляем доступные продукты, а потом эти продукты выбрать уже нельзя. Можно ли сделать так что бы выбранные продукты добавлять несколько раз. (т.к. необходимо создавать несколько счетов с теми же продуктоми но с разной скидкой или количеством)"

Нравится

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

Добрый день!

Насколько я понимаю, Вы имеете ввиду, распределение продуктов в графике поставок и оплат.
В данном окне Вы можете выбрать продукты одного типа, только если он имеет количество >1.
Создать несколько счетов связанных с графиком поставок и оплат, в которых будет один и тот же продукт (с количеством 1) пользовательскими средствами возможности нет.
Прикрепил скриншоты для наглядности.

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

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

Привет!

Думаю, реализовать это можно, если ознакомиться с самим графиком поставок и оплат, а также его структурой и принципом реализации.

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

Может Вам удобнее будет создавать счета из "Истории"?

Если нужно создать несколько счетов с разным количеством продуктов - просто сделайте это :)
Например, если нужно создать два счета с количеством яблок по 2 шт в каждом, то в заказе их должно быть 4.

Все ведь просто.

Алёна, вероятно решение Марии будет для Вас самым оптимальным - просто не работайте с графиком поставок и оплат, а создавайте счета из действия.

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