Доброго дня!
В стандартном типе(когда еще не создавал своих) на карточке Контакта был такой элемент: PhotoContainer.
При нового типа его вставить с мастера разделов нельзя.
Начальство очень хочет. Как можно его вставить?
Я еще новичок, поэтому буду очень рад если ответите подробно как сделать.

Нравится

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

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

Пример, как создать поле, в которое можно вставить фото:

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

{

"operation": "insert",

"name": "PhotoContainer",

"values": {

"itemType": 7,

"wrapClass": [

"image-edit-container"

],

"layout": {

"column": 0,

"row": 0,

"rowSpan": 3,

"colSpan": 2

},

"items": []

},

"parentName": "Header",

"propertyName": "items",

"index": 7

},

{

"operation": "insert",

"name": "Photo",

"values": {

"getSrcMethod": "getSrcMethod",

"onPhotoChange": "onPhotoChange",

"beforeFileSelected": "beforeFileSelected",

"readonly": false,

"defaultImage": "http://PHOTO_PHOTO_PHOTO.PHOTO",

"generator": "ImageCustomGeneratorV2.generateCustomImageControl"

},

"parentName": "PhotoContainer",

"propertyName": "items",

"index": 0

}

methods: {

getSrcMethod: function() {

var primaryImageColumnValue = this.get(this.primaryImageColumnName);

if (primaryImageColumnValue) {

return this.getSchemaImageUrl(primaryImageColumnValue);

}

return this.Terrasoft.ImageUrlBuilder.getUrl(resources.localizableImages.DefaultPhoto);

},

onPhotoChange: function(photo) {

if (!photo) {

this.set(this.primaryImageColumnName, null);

return;

}

this.Terrasoft.ImageApi.upload({

file: photo,

onComplete: this.onPhotoUploaded,

onError: this.Terrasoft.emptyFn,

scope: this

});

},

onPhotoUploaded: function(imageId) {

var imageData = {

value: imageId,

displayValue: "Photo"

};

this.set(this.primaryImageColumnName, imageData);

},

У меня в конфигурации есть:
Схема страницы редактирования раздела "Контакты" с типом "Физическое лицо"

Это сюда вставлять?

пока удалил

Нашел статью: ВОТ
Где все описано. Столкнулся вот с чем:
У меня для Контакта есть 6 страниц(схем), они сгенерились когда я создавал типы.
Для одной из них(Схема страницы редактирования раздела "Контакты" с типом "Физическое лицо"), мне надо вывести фото.
Как я понял, надо создать замещающую схему страницы, так как при сохранении чего нить на оригинале вылазят ошибки JS на каждую строку. Но столкнулся вот с чем. По стандарту bpm создал схемы в пакете Custom, и создать в этом же пакете замещающую страницу я не могу(пишет нельзя создать в одном пакете). Я создал новый пакет, но не могу его унаследовать от Custom, а ведь там мои схемы.
Как мне поступить?

Плиз хэлп!

Виктиор, пакет Custom, как раз содержит в себе все замещающие схемы и объекты. Именно в них можно вносить корректировки.

"Липатов Юрий Сергеевич" написал:

Виктиор, пакет Custom, как раз содержит в себе все замещающие схемы и объекты. Именно в них можно вносить корректировки.


Тогда очень странно. При попытке сохранить схему, вываливаются js ошибки на все строки.
вот скрин: картинко
Кругами обвел вставленый код и ошибки.

Виктор, это предупреждения.
Вы проверили функциональность кода, он работает?

В данном случае я сделал чисто для примера.
Не знал что error это предупреждение)
И так я сделал все по мануалу.
При попытке загрузить новое фото ничего не происходит. Висит дальше дефолтовая картинка.
Прилаживаю скриншоты. И код.
1
2

define('UsrContactType3Page', ['UsrContactType3PageResources', 'GeneralDetails'],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: 'Contact',
		details: /**SCHEMA_DETAILS*/{
	"PropertyCon": {
		"schemaName": "PropertyConDetail",
		"entitySchemaName": "PropertyCon",
		"filter": {
			"detailColumn": "Contact",
			"masterColumn": "Id"
		}
	}
}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "Name",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			}
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "Type",
		"values": {
			"layout": {
				"column": 12,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Type",
			"caption": {
				"bindTo": "Resources.Strings.TypeCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "Owner",
		"values": {
			"layout": {
				"column": 12,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Owner",
			"caption": {
				"bindTo": "Resources.Strings.OwnerCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 2
	},
	{
		"operation": "insert",
		"name": "Job",
		"values": {
			"layout": {
				"column": 0,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Job",
			"caption": {
				"bindTo": "Resources.Strings.JobCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 3
	},
	{
		"operation": "insert",
		"name": "UsrDepartment",
		"values": {
			"layout": {
				"column": 0,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "UsrDepartment",
			"caption": {
				"bindTo": "Resources.Strings.UsrDepartmentCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 4
	},
	{
		"operation": "insert",
		"name": "UsrCustomerTypeField",
		"values": {
			"layout": {
				"column": 12,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "UsrCustomerTypeField",
			"caption": {
				"bindTo": "Resources.Strings.CustomerTypeFieldCaption"
			},
			"textSize": 0,
			"contentType": 3,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 5
	},
	{
		"operation": "insert",
		"name": "UsrStatus",
		"values": {
			"layout": {
				"column": 12,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "UsrStatus",
			"caption": {
				"bindTo": "Resources.Strings.StatusCaption"
			},
			"textSize": 0,
			"contentType": 3,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 6
	},
	{
		"operation": "insert",
		"name": "DescMain",
		"values": {
			"layout": {
				"column": 0,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "DescMain",
			"caption": {
				"bindTo": "Resources.Strings.DescMainCaption"
			},
			"textSize": 0,
			"contentType": 0,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 7
	},
	{
		"operation": "insert",
		"name": "Account",
		"values": {
			"layout": {
				"column": 0,
				"row": 4,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Account",
			"caption": {
				"bindTo": "Resources.Strings.AccountCaption"
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 8
	},
	{
		"operation": "insert",
		"name": "PersonContactId",
		"values": {
			"layout": {
				"column": 12,
				"row": 4,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "PersonContactId",
			"caption": {
				"bindTo": "Resources.Strings.PersonContactIdCaption"
			},
			"textSize": 0,
			"contentType": 1,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 9
	},
	{
		"operation": "insert",
		"name": "GeneralInfoTab",
		"values": {
			"caption": {
				"bindTo": "Resources.Strings.GeneralInfoTabCaption"
			},
			"items": []
		},
		"parentName": "Tabs",
		"propertyName": "tabs",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "group",
		"values": {
			"itemType": 15,
			"caption": {
				"bindTo": "Resources.Strings.groupCaption"
			},
			"items": [],
			"controlConfig": {
				"collapsed": false
			}
		},
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "group_gridLayout",
		"values": {
			"itemType": 0,
			"items": []
		},
		"parentName": "group",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "MobilePhone",
		"values": {
			"layout": {
				"column": 0,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "MobilePhone",
			"caption": {
				"bindTo": "Resources.Strings.MobilePhoneCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "Email",
		"values": {
			"layout": {
				"column": 12,
				"row": 0,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Email",
			"caption": {
				"bindTo": "Resources.Strings.EmailCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "Phone",
		"values": {
			"layout": {
				"column": 0,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "Phone",
			"caption": {
				"bindTo": "Resources.Strings.PhoneCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 2
	},
	{
		"operation": "insert",
		"name": "UsrOtherEmail",
		"values": {
			"layout": {
				"column": 12,
				"row": 1,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "UsrOtherEmail",
			"caption": {
				"bindTo": "Resources.Strings.OtherEmailCaption"
			},
			"textSize": 0,
			"contentType": 1,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 3
	},
	{
		"operation": "insert",
		"name": "UsrHomePhone",
		"values": {
			"layout": {
				"column": 0,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "UsrHomePhone",
			"caption": {
				"bindTo": "Resources.Strings.HomePhoneCaption"
			},
			"textSize": 0,
			"contentType": 1,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 4
	},
	{
		"operation": "insert",
		"name": "BirthDate",
		"values": {
			"layout": {
				"column": 12,
				"row": 2,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "BirthDate",
			"caption": {
				"bindTo": "Resources.Strings.BirthDateCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 5
	},
	{
		"operation": "insert",
		"name": "UsrOtherPhone",
		"values": {
			"layout": {
				"column": 0,
				"row": 3,
				"colSpan": 12,
				"rowSpan": 1
			},
			"bindTo": "UsrOtherPhone",
			"caption": {
				"bindTo": "Resources.Strings.OtherPhoneCaption"
			},
			"textSize": 0,
			"contentType": 1,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 6
	},
	{
		"operation": "insert",
		"name": "DoNotUseEmail",
		"values": {
			"layout": {
				"column": 12,
				"row": 3,
				"colSpan": 6,
				"rowSpan": 1
			},
			"bindTo": "DoNotUseEmail",
			"caption": {
				"bindTo": "Resources.Strings.DoNotUseEmailCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 7
	},
	{
		"operation": "insert",
		"name": "DoNotUseCall",
		"values": {
			"layout": {
				"column": 18,
				"row": 3,
				"colSpan": 6,
				"rowSpan": 1
			},
			"bindTo": "DoNotUseCall",
			"caption": {
				"bindTo": "Resources.Strings.DoNotUseCallCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 8
	},
	{
		"operation": "insert",
		"name": "UsrRegAdress",
		"values": {
			"layout": {
				"column": 0,
				"row": 4,
				"colSpan": 24,
				"rowSpan": 1
			},
			"bindTo": "UsrRegAdress",
			"caption": {
				"bindTo": "Resources.Strings.RegAdressCaption"
			},
			"textSize": 0,
			"contentType": 1,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 9
	},
	{
		"operation": "insert",
		"name": "Address",
		"values": {
			"layout": {
				"column": 0,
				"row": 5,
				"colSpan": 24,
				"rowSpan": 1
			},
			"bindTo": "Address",
			"caption": {
				"bindTo": "Resources.Strings.AddressCaption"
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 10
	},
	{
		"operation": "insert",
		"name": "UsrCurrentLoans",
		"values": {
			"layout": {
				"column": 0,
				"row": 6,
				"colSpan": 24,
				"rowSpan": 1
			},
			"bindTo": "UsrCurrentLoans",
			"caption": {
				"bindTo": "Resources.Strings.CurrentLoansCaption"
			},
			"textSize": 0,
			"contentType": 0,
			"labelConfig": {
				"visible": true
			},
			"enabled": true
		},
		"parentName": "group_gridLayout",
		"propertyName": "items",
		"index": 11
	},
	{
		"operation": "insert",
		"name": "PropertyCon",
		"values": {
			"itemType": 2
		},
		"parentName": "GeneralInfoTab",
		"propertyName": "items",
		"index": 1
	},
                // Контейнер-обертка, в который будет размещен логотип контрагента.
                {
                    "operation": "insert",
                    "parentName": "Header",
                    "propertyName": "items",
                    "name": "PhotoContainer",
                    "values": {
                        // Тип элемента - контейнер.
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        "wrapClass": ["image-edit-container"],
                        "layout": { "column": 0, "row": 0, "rowSpan": 4, "colSpan": 4 },
                        "items": []
                    }
                },
                // Поле [Picture] — поле с логотипом контрагента.
                {
                    "operation": "insert",
                    "parentName": "PhotoContainer",
                    "propertyName": "items",
                    "name": "Picture",
                    "values": {
                        // Наименование метода, который получает изображение по ссылке.
                        "getSrcMethod": "getAccountImage",
                        // Наименование метода, который вызывается при изменении изображения.
                        "onPhotoChange": "onPhotoChange",
                        // Свойство, которое определяет возможность редактирования (изменения, удаления) изображения.
                        "readonly": false,
                        // Изображение, которое будет отображаться по умолчанию.
                        "defaultImage": Terrasoft.ImageUrlBuilder.getUrl(resources.localizableImages.DefaultPhoto),
                        // Генератор элемента управления.
                        "generator": "ImageCustomGeneratorV2.generateCustomImageControl"
                    }
                }
]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {
                // Возвращает url логотипа контрагента по ссылке, сохраненной в объекте.
                getAccountImage: function () {
                    // Получаем ссылку на изображение из колонки объекта.
                    var imageColumnValue = this.get("PhotoClient");
                    // Если ссылка установлена, то возвращает url файла с изображением.
                    // Если нет, то вызывает метод, возвращающий изображение по умолчанию.
                    if (imageColumnValue) {
                        return this.getSchemaImageUrl(imageColumnValue);
                    }
                    return this.getAccountDefaultImage();
                },
                // Возвращает url логотипа контрагента по умолчанию.
                getAccountDefaultImage: function () {
                    return this.Terrasoft.ImageUrlBuilder.getUrl(this.get("Resources.Images.DefaultPhoto"));
                },
                // Обрабатывает изменение логотипа контрагента. В качестве параметра принимает файл с изображением.
                onPhotoChange: function (photo) {
                    if (!photo) {
                        this.set("PhotoClient", null);
                        return;
                    }
                    // Выполняется загрузка файла в базу данных. По окончании загрузки вызывается метод, который
                    // сохраняет ссылку на измененное изображение в колонке [Логотип] объекта [Контрагент].
                    this.Terrasoft.ImageApi.upload({
                        file: photo,
                        onComplete: this.onPhotoUploaded,
                        onError: this.Terrasoft.emptyFn,
                        scope: this
                    });
                },
                // Метод, который сохраняет ссылку на измененное изображение. В качестве параметра передается Id 
                // сохраненного файла из базы данных.
                onPhotoUploaded: function (imageId) {
                    var imageData = {
                        value: imageId,
                        displayValue: "Image"
                    };
                    // Полю с изображением присваивается ссылка на изображение.
                    this.set("PhotoClient", imageData);
                }
 
		},
		rules: {},
		userCode: {}
	};
});

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

Например, убедитесь, что в колонке «Изображение» объекта «Контакт» выбрана пользовательская колонка (например, "PhotoClient"), а не базовая. Должно помочь. См. пикчу

Спасибо!

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

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

Подскажите как в замещающей схеме удалить бизнес правила на примере раздела активности.
Есть две предустановленные схемы Document.ActivityPageV2 и DocumentInOpportunity.ActivityPageV2 (замещают UIv2.ActivityPageV2) в них содержаться бизнес правила фильтрации по контрагенту, контакту и продаже.
Эти правила нужно убрать, вернее оставить только фильтрацию по контрагенту. Пока мои попытки ничего не дали, пробовал в своей замещающей схеме добавить бизнес правило с существующем названием и другим фильтром, но оно просто добавилось к остальным.

Нравится

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

Попробуйте заместить бизнес-правило, которое хотите отключить и проставить свойство enabled: false.

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

Попробуйте заместить бизнес-правило, которое хотите отключить и проставить свойство enabled: false.

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

"Document": {
	"FiltrationDocumentByAccount": {
		"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
		"autocomplete": true,
		"autoClean": true,
		"baseAttributePatch": "Account",
		"comparisonType": Terrasoft.ComparisonType.EQUAL,
		"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		"attribute": "Account"
	},
	"FiltrationDocumentByContact": {
		"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
		"autocomplete": true,
		"autoClean": true,
		"baseAttributePatch": "Account",
		"comparisonType": Terrasoft.ComparisonType.EQUAL,
		"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		"attribute": "Account"
	},
	"FiltrationDocumentByOpportunity": {
		"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
		"autocomplete": true,
		"autoClean": true,
		"baseAttributePatch": "Account",
		"comparisonType": Terrasoft.ComparisonType.EQUAL,
		"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		"attribute": "Account"
	}
}

Т.е. фильтры по контакту и продажи изменил на фильтр по контрагенту, после этого они перестали работать. В принципе получилось то что нужно, но способ мне не нравиться, жаль нет атрибута enabled или что то вроде.

А если вместо правила надо вписать attributes с lookupListConfig, то у бизнес-правила всё равно приоритет выше :(
Как удалить бизнес-правило, чтобы срабатывал attributes?

Здравствуйте, Владимир!

Попробуйте следующий вариант:

getFilters: function() {
       var filters = this.callParent(arguments);
       filters.removeByKey("FiltrationDocumentByOpportunity");
       return filters;
}

спасибо, работает!

Кстати, только мне кажется нелогичным то, что в bpm есть отличная деталь ContactCareer, а повсюду Контакт фильтруется не по записям этой детали, а по полю Контрагент?

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

ContactCareer - развязочная таблица. У одного контакта может быть несколько работ. По этой причине не совсем логично фильтровать именно по этой таблице.

"Демьяник Алексей" написал:ContactCareer - развязочная таблица. У одного контакта может быть несколько работ. По этой причине не совсем логично фильтровать именно по этой таблице.

В том-то и дело. И если один контакт работает у двух контрагентов, то вы его никогда не сможете привязать к заданию/счету/продаже и т.п., связанному с неосновным контрагентом

"Владимир Соколов" написал:

В том-то и дело. И если один контакт работает у двух контрагентов, то вы его никогда не сможете привязать к заданию/счету/продаже и т.п., связанному с неосновным контрагентом

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

В таком случае, можно отключить базовые правила:smile:

"Демьяник Алексей" написал:Попробуйте следующий вариант:
getFilters: function() {
       var filters = this.callParent(arguments);
       filters.removeByKey("FiltrationDocumentByOpportunity");
       return filters;
}

знаете, как-то я поспешил... не работает это. поставил debugger - вижу, что функция getFilters совсем не вызывается

Здравствуйте, Владимир!

"Владимир Соколов" написал:

знаете, как-то я поспешил... не работает это. поставил debugger - вижу, что функция getFilters совсем не вызывается

Вы добавили данный код код в секцию methods: {}?

"Демьяник Алексей" написал:Вы добавили данный код код в секцию methods: {}?

Да. Он должен срабатывать при открытии карточки?

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

onEntityInitialized: function() {
   this.callParent(arguments);
   delete this.rules.Document.FiltrationDocumentByOpportunity;
   delete this.rules.Document.FiltrationDocumentByAccount;
   delete this.rules.Document.FiltrationDocumentByContact;
},

"Щиголь Максим" написал:delete this.rules.Document.FiltrationDocumentByOpportunity;

Как я понимаю, Document - это название поля.

В моём случае
this.callParent(arguments);
delete this.rules.Contact.FiltrationContactByAccount;

ошибок никаких не получил, но и правило не деактивизировалось...

Здравствуйте, Владимир! Попробуйте способ:

 

"#название правила#": {
    "ruleType": 999
}

 

"Демьяник Алексей" написал:Попробуйте способ, описанный в этом комментарии.

Да, так правило отключается. Вроде, всё работает правильно :)

Можно заносить в Knowledge base

Владимир Соколов пишет:

Да, так правило отключается. Вроде, всё работает правильно :)Можно заносить в Knowledge base

Можно где то увидеть решение?  Ссылка на комментарий по которому автор узнал решение не работает. В данной теме решение из комментария не продублировано.

Вот эта тема.

Добавить комментарий

Evgi1980 пишет:

Можно где то увидеть решение?  Ссылка на комментарий по которому автор узнал решение не работает. В данной теме решение из комментария не продублировано.

 

//Удаление\отключение бизнес правил:
"#название правила#": {
    "ruleType": 999
}
//Пример:
"Opportunity":{
   "FiltrationOpportunityByContact": {
       "ruleType": 999
   }
}

 

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

Добрый день!
Подскажите пожалуйста, как сделать доступ на детали таким же как и на родительские записи?
Права раздаются на каждую род. запись процессом.
В тройке для этого были группы, а в нет.
BPM 7.6

Нравится

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

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

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

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

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

Создал отдельную тему, но здесь тоже спрошу - как скопировать права из родительской записи скопировать в объект детали?

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

После включения администрирования по записям, в системе появится объект SysDetailObjectNameRights.
Права на записи раздела хранятся в таблице SysSectionObjectNameRights.

Задача: при изменении записи в разделе перенести права на записи детали.

Решение:
1) Определите Id записей деталей:

select Id from SysDetailObjectName where SectionObjectNameId = 'Id измененной записи'

2) Удалите права на эти записи:

delete from SysDetailObjectNameRights
where RecordId in
(select Id from SysDetailObjectName where SectionObjectNameId = 'Id измененной записи')

3) Теперь Вам необходимо скопировать записи из таблицы SysSectionObjectNameRights в таблицу SysDetailObjectNameRights, изменив RecordId на Id записи детали.

"Демьяник Алексей" написал:После включения администрирования по записям, в системе появится объект SysDetailObjectNameRights.
Права на записи раздела хранятся в таблице SysSectionObjectNameRights.

А кроме того в системе есть таблицы SysAccountRight и SysAccountAddressRight. Их не трогать?

SysAccountRight - таблица, которая хранит права на записи в объекте Account (Контрагент).
SysAccountAddressRight - таблица, которая хранит права на записи в объекте AccountAddress (Адреса контрагента).

При раздаче прав необходимо переносить права с SysAccountRight в SysAccountAddressRight.

ЗЫ. Прошу прощения - в предыдущем посте указал некорректное название таблиц.

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

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

Нравится

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

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

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

Для решения Вашей задачи Вы также можете использовать следующую последовательность элементов:
1) Страница редактирования.
2) Изменить данные (меняем состояние задачи на "Не начата").
3) Промежуточный обрабатывающий сигнал - ожидаем изменение состояния активности на конечное.

Второе решение - использовать элемент "Задача".

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

Как запретить создание записи определенного типа (например, Контрагента) из Lookup, которое появилось в 7.6? Но при этом оставить возможность создавать из раздела.

lookup

Нравится

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

Такой возможности нет, но вы можете посмотреть в сторону пользовательских css стилей, и скрыть от глаз пользователя нужные вам div-ы. Единственное что нужно будет подумать над css селекторами, что бы не задеть другие элементы страницы.

"Щиголь Максим" написал:Такой возможности нет

Это же насоздают пустых записей...

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

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

Создал деталь: Объект унаследован от базового (2 поля: связь с разделом, поле справочник), схема детали унаследована от "Базовая схема детали с реестром ( NUI )". Зарегестрировал ее в SysDetail, через мастер разделал добавил в раздел. Все работает.
Целью было создать деталь с редактируемым реестром, реализацию и зависимости смотрел в детали "Продукт в заказе", деталь отображается как обычная, видимо что то упустил.

Что нужно сделать что бы создать деталь с редактируемым реестром?

Нравится

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

"Продукт в заказе" (ContractProductDetailV2) обычная деталь с реестром и парой дополнительных методов для пересчета суммы, в которой возможность редактировать объект детали реализована в отдельной, ее собственной карточке, по нажатию кнопки "изменить", как собственно и в большинстве деталей.

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

Но если же вопрос просто в том, что у вас не работает кнопка "изменить" для обычной детали, с целью редактирования ее объекта в отдельном окне, то причиной этого, вероятно, является то, что у вас нет схемы страницы редактирования для вашего объекта.
И для того что бы не делать это все вручную, вы можете создать с помощью мастера раздела, новый раздел (объект + страницы редактирования и списков) для вашей детали, настроить его страницу, и тогда у вас будут созданы все средства для его редактирования. После чего уже можно создавать в мастере деталей, деталь на основе вашего нового объекта, и использовать ее в дизайнере страниц.

P.S.
Всю информацию по использованию мастеров и дизайнеров вы можете найти в SDK
http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0

Нет, вопрос в том "Как создать деталь с редактируемым реестром?" с обычными деталями проблем нет и про изменить я ничего не писал, страницу регестрировал что бы проверить работает ли сама деталь, потом ее удалил (и из БД) так как нужна именно деталь с редактируемым реестром.
Так подскажите как создать деталь с редактируемым реестром? На примере детали "Продукт в заказе" (смотрел в omnichanel) не разобрался.

С версии продукта и стоило начинать, да, в omnichanel эту деталь сделали редактируемой.
Для того, чтобы сделать реестр детали редактируемым, в соответствующей схеме необходимо:
- добавить зависимости от модулей ConfigurationGrid (Конфигурационный реестр), ConfigurationGridGenerator, ConfigurationGridUtilities,
- подключить "миксин" ConfigurationGridUtilites,
- установить аттрибут IsEditable в значение true
- базовому реестру указать свойства:
className: "Terrasoft.ConfigurationGrid",
generator: "ConfigurationGridGenerator.generatePartial",
generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
changeRow: {bindTo: "changeRow"},
unSelectRow: {bindTo: "unSelectRow"},
onGridClick: {bindTo: "onGridClick"},
initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
для добавления действий активной записи добавить:
activeRowActions: [...],
activeRowAction: {bindTo: "onActiveRowAction"}

Зависимости нужно указать не только параметром requirejs но и в настройках схемы, в конфигураторе.
Итоговый код простейшей редактируемой детали будет выглядеть следующим образом:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
		"ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "Contact",
		attributes: {
			"IsEditable": {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: true
			}
		},
		details: {},
		diff: [
				{
					"operation": "merge",
					"name": "DataGrid",
					"values": {
						"className": "Terrasoft.ConfigurationGrid",
						"generator": "ConfigurationGridGenerator.generatePartial",
						"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
						"changeRow": {"bindTo": "changeRow"},
						"unSelectRow": {"bindTo": "unSelectRow"},
						"onGridClick": {"bindTo": "onGridClick"},
						"activeRowActions": [
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "save",
								"markerValue": "save",
								"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "cancel",
								"markerValue": "cancel",
								"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "remove",
								"markerValue": "remove",
								"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
							}
						],
						"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
						"activeRowAction": {"bindTo": "onActiveRowAction"},
						"multiSelect": false
					}
				}
			],
		mixins: {
			ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",
			OrderUtilities: "Terrasoft.OrderUtilities"
		},
		methods: {}
	};
});

Максим, спасибо, получилось.

"Щиголь Максим" написал:

Здравствуйте, Максим. Подскажите пожалуйста в процессе к детали нужно просто вписать код и всё она заработает, конечно изменив при этом версию схемы детали? Просто в программировании не разбираюсь, пока что. Создал деталь и у неё реестр должен быть редактированным. По возможности схожим с деталью график поставок и оплаты.
Версия bpm'online sales enterprise 7.6

Не совсем понятно, что вы подразумеваете под фразой "в процессе к детали", возможно, вы хотели сказать "в схеме детали". Код конечно, нельзя взять прямо из этой темы, но можно писать по примеру и подобию.
Как минимум на строчке
entitySchemaName: "Contact",
вместо контакта, вам нужно будет указать ваш объект, на основе которого сделана схема вашей детали.

В общем, да, алгоритм достаточно прост, но знания по разработке в bpm'online все же понадобятся. Хотя бы на уровне реализации более простых кейсов из академии. Если в процессе реализации у вас возникнут другие вопросы, пишите, постараемся ответить.

"Щиголь Максим" написал:

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

Как минимум на строчке

entitySchemaName: "Contact",

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

В общем, да, алгоритм достаточно прост, но знания по разработке в bpm'online все же понадобятся. Хотя бы на уровне реализации более простых кейсов из академии. Если в процессе реализации у вас возникнут другие вопросы, пишите, постараемся ответить.


Да ошибся, извините. Нашёл схему и прописал код, который вы прикрепляли и нужные изменения сделал. Всё заработало спасибо!

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

define("LeadProductDetailV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities", "configurationEnums"],
function(configurationEnums, ConfigurationGrid, ConfigurationGridGenerator, ConfigurationGridUtilities) {
return {
entitySchemaName: "LeadProduct",
attributes: {
"IsEditable": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
details: {},
diff: [
{
"operation": "merge",
"name": "DataGrid",
"values": {
"className": "Terrasoft.ConfigurationGrid",
"generator": "ConfigurationGridGenerator.generatePartial",
"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
"changeRow": {"bindTo": "changeRow"},
"unSelectRow": {"bindTo": "unSelectRow"},
"onGridClick": {"bindTo": "onGridClick"},
"activeRowActions": [
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "save",
"markerValue": "save",
"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "cancel",
"markerValue": "cancel",
"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "remove",
"markerValue": "remove",
"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
}
],
"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
"activeRowAction": {"bindTo": "onActiveRowAction"},
"multiSelect": false
}
}
],
mixins: {
ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",
OrderUtilities: "Terrasoft.OrderUtilities"
},
//данный кусочек был добавлен:smile:
methods: {
/**
* Возвращает колонки, которые всегда выбираются запросом
* @return {Object} Возвращает массив объектов-конфигураций колонок
*/
getGridDataColumns: function() {
return {
"Id": {path: "Id"},
"Product": {path: "Product"},
"Product.Name": {path: "Product.Name"}
};
},

/**
* Открывает справочник продуктов
* @private
*/
openProductLookup: function() {
var config = {
entitySchemaName: "Product",
multiSelect: true,
columns: ["Name", "Price", "Currency"]
};
var leadId = this.get("MasterRecordId");
if (this.Ext.isEmpty(leadId)) {
return;
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
esq.addColumn("Id");
esq.addColumn("Product.Id", "ProductId");
esq.filters.add("filterLead", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Lead", leadId));
esq.getEntityCollection(function(result) {
var existsProductsCollection = [];
if (result.success) {
result.collection.each(function(item) {
existsProductsCollection.push(item.get("ProductId"));
});
}
if (existsProductsCollection.length > 0) {
var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
existsProductsCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
existsFilter.Name = "existsFilter";
config.filters = existsFilter;
}
this.openLookup(config, this.addCallBack, this);
}, this);
},

/**
* @overridden
*/
onCardSaved: function() {
this.openProductLookup();
},

/*
* Открывает справочник продуктов в случае если карточка лида была ранее сохранена
* @overridden
* */
addRecord: function() {
var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
var isNewRecord = (masterCardState.state === configurationEnums.CardStateV2.ADD ||
masterCardState.state === configurationEnums.CardStateV2.COPY);
if (isNewRecord === true) {
var args = {
isSilent: true,
messageTags: [this.sandbox.id]
};
this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
return;
}
this.openProductLookup();
},

/*
* Добавление выбраных продуктов
* @private
* */
addCallBack: function(args) {
var bq = this.Ext.create("Terrasoft.BatchQuery");
var leadId = this.get("MasterRecordId");
this.selectedRows = args.selectedRows.getItems();
this.selectedItems = [];
this.selectedRows.forEach(function(item) {
item.LeadId = leadId;
item.ProductId = item.value;
bq.add(this.getProductInsertQuery(item));
this.selectedItems.push(item.value);
}, this);
if (bq.queries.length) {
this.showBodyMask.call(this);
bq.execute(this.onProductInsert, this);
}
},

/*
* Возвращает запрос на добавление продукта
* @param item {Object} идентификатор лида и выбранный в справочнике продукт {LeadId, value}
* @private
* */
getProductInsertQuery: function(item) {
var insert = Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: this.entitySchemaName
});
insert.setParameterValue("Lead", item.LeadId, this.Terrasoft.DataValueType.GUID);
insert.setParameterValue("Product", item.ProductId, this.Terrasoft.DataValueType.GUID);
return insert;
},

/*
* Загрузка добавленых продуктов в реестр
* @private
* */
onProductInsert: function(response) {
this.hideBodyMask.call(this);
this.beforeLoadGridData();
var filterCollection = [];
response.queryResults.forEach(function(item) {
filterCollection.push(item.id);
});
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
this.initQueryColumns(esq);
esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
esq.getEntityCollection(function(response) {
this.afterLoadGridData();
if (response.success) {
var responseCollection = response.collection;
this.prepareResponseCollection(responseCollection);
this.getGridData().loadAll(responseCollection);
}
}, this);
},

/*
* Удаление выбранных записей
* @overridden
* */
deleteRecords: function() {
var selectedRows = this.getSelectedItems();
if (selectedRows.length > 0) {
this.set("SelectedRows", selectedRows);
this.callParent(arguments);
}
},

/**
* @inheritdoc Terrasoft.BaseGridDetailV2#getCopyRecordMenuItem
* @overridden
*/
getCopyRecordMenuItem: Terrasoft.emptyFn,

/**
* @inheritdoc Terrasoft.BaseGridDetailV2#getEditRecordMenuItem
* @overridden
*/
getEditRecordMenuItem: Terrasoft.emptyFn,

/**
* @inheritdoc Terrasoft.GridUtilitiesV2#getFilterDefaultColumnName
* @overridden
*/
getFilterDefaultColumnName: function() {
return "Product";
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"rowDataItemMarkerColumnName": "Product"
}
},
{
"operation": "merge",
"name": "AddRecordButton",
"values": {
"visible": {"bindTo": "getToolsVisible"}
}
}
]/**SCHEMA_DIFF*/
};
}
);

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

Во вторых миксин OrderUtilities: "Terrasoft.OrderUtilities" тут наверно лишний.
Вот у меня получилось в лидах сделать эту деталь редактируемой, почитайте:

define("LeadProductDetailV2", ["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator",
		"ConfigurationGridUtilities"],
	function(configurationEnums) {
		return {
			entitySchemaName: "LeadProduct",
			methods: {
			},
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
			},
			attributes: {
         		"IsEditable": {
            	dataValueType: Terrasoft.DataValueType.BOOLEAN,
            	type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            	value: true
         		}
      		},
			diff: /**SCHEMA_DIFF*/[
		{
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
			]/**SCHEMA_DIFF*/
		};
	}
);

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

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

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

подробнее про добавление детали по ссылке:
http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/t…

создание детали:
http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/t…

Это мне нужно создать новую деталь? Просто в "Колонка детали" нету "Контакт"...

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

"Липатов Юрий Сергеевич" написал:

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

Не совсем понимаю про какой обьект детали идет речь? Можете написать более детальнее?

Пожалуйста, обратите внимание на ссылки, которые я Вам написал выше:

"Липатов Юрий Сергеевич" написал:

создание детали:

http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/team/7.7.0/BPMonlineHelp/chapter_detail_wizard/chapter_detail_wizard.htm

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

Доброго дня!
Не смог найти нужного мануала. Прочитал в доках про: Создание замещающих классов в пакетах bpm'online но там не вся информация.

Можно ли создавать свои страницы используя html верстку? Можно ли присоединить к ней свой контролер?
К примеру мне надо сделать вот такую страницу(см. скрин)
Продукт: реалстейт

Нравится

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

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

Создать аналог страницы по скриншоту возможно только стандартными средствами мастера разделов или в конфигурации.
Так же, Вы можете добавить самостоятельно Ваши стили CSS на выбранный раздел:

http://www.community.terrasoft.ru/forum/topic/11520

Мне не надо изменить что то стандартное. Мне надо сделать полностью кастомною красивую страницу. Как css так и верстку.
Как можно это сделать через конфигурацию?
Если нажимаю на создать страницу в конфигурации, то открывается убогий "мастер форм" куда можно перетаскивать нужные блоки. Мне же это не совсем подходит.

Кто нить может мне подсказать?

Виктор,
"bpm'online не является программой для верстки сайта.
В конфигурации Вы можете использовать мастер раздела для создания собственных и редактирования существующих разделов, а также добавлять собственные стили:
http://www.community.terrasoft.ru/forum/topic/11520

Если Вам необходимо реализовать страницу, как на указанном Вами скриншоте, Вы можете использовать для этого любую общедоступную программу для верстки, на основе данной страницы "поднять" сайт, а затем реализовать обмен данными между Вашим сайтом и bpm'online при помощи протокола OData:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/Integratio…

Спасибо за ответ!

Вопрос такой.
Я сделаю допустим я сделал необходимую страницу стандартными средствами.
Как юзеры могут ее использовать? Возможно ли ее вставить в боковую панель где находятся разделы?

В боковой панели расположить можно только разделы.
Страницы редактирования для этого не предназначены

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

1) Cоздать новый раздел.
2) В Схеме страницы нового раздела (UsrNewSection) добавить метод в секцию методов:

methods: {
init: function() {
      window.location.replace("http://stackoverflow.com");
   }
},
Показать все комментарии
автозапуск
интервал
процесс
Технические вопросы
7.x

Добрый день!

Для того, чтобы процесс автоматически запускался раз в N минут, необходимо в процесс поместить элемент Сценарий вида:

string schedulerJobGroupName = "MyProcessGroupMyEmail1";//- Любое имя
string jobProcessName = "UsrProcess"; //- Название процесса
string schedulerJobName = "MyJobNameMyEmail1"; //- Любое имя
int startOffset = 3600; // интервал в секундах
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;

Это работает.

Скажите, пожалуйста, а можно ли сделать так, чтобы он запускался только в определенные часы
(например, с 8.00 до 20.00)

т.е. как можно здесь применить такую формулу ?
Если 20:00 - текущее время T (интервал запуска) то запуск установить в T+12 часов

Нравится

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

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

Пример использования планировщика в указанном интервале.

string schedulerJobGroupName = "ScheduleTest";
string jobProcessName = "UsrScheduleTest";
string schedulerJobName = "ScheduleTestJob";
TimeSpan start = TimeSpan.Parse("11:31");
TimeSpan end = TimeSpan.Parse("11:46");
TimeSpan currentTime = DateTime.Now.TimeOfDay;

if ((currentTime > start) && (currentTime < end))
{
int startOffset = 30;
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);
} else {
int startOffset = 12;
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.AddHours(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
}
return true;

Спасибо

а можно как-то посмотреть, что записано в планировщике? какие задания когда стоят на автозапуске?

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

Вы можете проверить существующие тригера выполнив запрос в БД:
select * from QRTZ_TRIGGERS
select * from QRTZ_SIMPLE_TRIGGERS

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

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

Как отправить письмо контакту по заданному шаблону - с изображением, вложением и макросами (персонализацией)?

Нравится

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

Здравствуйте, Виктор!

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

Для решения Вы можете задать значение по умолчанию полю "html body" объекта "Активность". Более подробно читайте здесь. Правда это решение будет создавать email без персонификации.

Вторым решением будет создание собственного шаблона в процессе. Это решение описано здесь.

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

Виктор,

Алексей предоставил Вам решение по второму пункту. Вот ссылка - http://www.community.terrasoft.ua/blogs/12527

Илья, это я читал. Как прикрепить вложение во втором варианте?

Второй вариант не предусматривает прикрепления вложений - элемент "Отправить email" не умеет с ними работать.

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

На форуме не нашел, решил написать.
Проблема такая:
-В расширенном модуле AccountSectionV2 нужно по нажатию кнопки еще проставлять true на галку.
При создание нового account(а именно на page) все без проблем "завелось", проблема встала именно на section, при редактирование из клиентской части уже имеющегося юр.лица.

Как я понял нужно использовать esq, т.к. this.set("bool",true); не работает, но не нашел как устанавливать значения через esq. Быть может надо по другому. Помогите пожалуйста.

define("AccountSectionV2", [],
        function() {
        return {
                entitySchemaName: "Account",
            // Коллекция методов модели представления страницы редактирования.
            methods: {
                                getChainCardModuleSandboxId: function(typeColumnValue) {
                                        return this.getCardModuleSandboxId() + "_chain" + typeColumnValue;
                                },
                                showExistingRecordSaveButton: function() {
                                        this.set("IsSendToFlextera", true);
                                        return this.get("IsCardInEditMode") && this.get("ShowSaveButton");
                                       
                                },
                                onClickSaveToFlex: function() {
                                   this.set("IsSendToFlextera", true);
                                        var tag = arguments[0] || arguments[3];
                                        this.sandbox.publish("OnCardAction", tag, [this.getCardModuleSandboxId()]);
                                       
                                }
                        },
                               
                        diff: [
                {
                                        "operation": "insert",
                                        "name": "FlexsaveRecordButton",
                                        "parentName": "CombinedModeActionButtonsCardLeftContainer",
                                        "propertyName": "items",
                                        "values": {
                                                "itemType": Terrasoft.ViewItemType.BUTTON,
                                                "caption": {"bindTo": "Resources.Strings.SaveToFlexteraCaption"},
                                                "click": {"bindTo": "IsSendToFlextera"},//"onClickSaveToFlex"},
                                                "visible": {"bindTo": "showExistingRecordSaveButton"},
                                                "classes": {"textClass": ["actions-button-margin-right"]},
                                                "tag": "save"
                                        }
                                }
            ]
                 
         };
        });

Нравится

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

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

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

var activeRow = this.getActiveRow();
activeRow.set("YourColumnName", columnValue);
activeRow.saveEntity();

Для работы этого кода необходимо, чтобы в коллекции activeRow.columns была колонка с названием YourColumnName и типом Terrasoft.ViewModelColumnType.ENTITY_COLUMN (данная константа равняется 0).

Также обновление значения можно выполнить через запрос примерно так:

var updateQuery = this.Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "EntitySchemaName"
});
var filters = updateQuery.filters;
filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	this.Terrasoft.ComparisonType.EQUAL, "Id", currentRecordId));
updateQuery.setParameterValue("YourColumnName", columnValue);
updateQuery.execute(callbackFunction, this);
Показать все комментарии