Подскажите как добавить набор полей на страницу "Обращения", ниже кейса и выше панели вкладок?Изображение удалено.

Нравится

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

Добрый день, Сергей.



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

 

define("ContactPageV2", [],
	function() {
		return {
			entitySchemaName: "Contact",
			details: /**SCHEMA_DETAILS*/{
				"ConfItem": {
					"schemaName": "ConfItemInContactDetail",
					"entitySchemaName": "ConfItemUser",
					"filter": {
						"masterColumn": "Id",
						"detailColumn": "Contact"
					}
				}
			}/**SCHEMA_DETAILS*/,
			diff: /**SCHEMA_DIFF*/[
				{
				"operation": "insert",
				"parentName": "TabsContainer",
				"propertyName": "items",
				"index":0,
				"name": "TestContainer",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"layout": {
						"column": 0,
						"row": 0,
						"colSpan": 24
					},
					"items": []
				}
			},
				{
				"operation": "insert",
				"name": "UsrTest",
				"parentName": "TestContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"caption": "Test",
					"layout": {"column": 1, "row": 1},
					"items": []
					}
				}
			]/**SCHEMA_DIFF*/
		};
	});

 

Mykhailo Storozhuk, Спасибо!

Mykhailo Storozhuk,

А как их сгруппировать в 2 колонки? Пытаюсь менять column, row. Но ничего не получается. 

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

Также если вы хотите разместить колонки на одной строке, необходимо указывать один и тот же row.

{
				"operation": "insert",
				"parentName": "GeneralInfoTab",
				"name": "ContactGeneralInfoControlGroup",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTROL_GROUP,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "ContactGeneralInfoControlGroup",
				"propertyName": "items",
				"name": "ContactGeneralInfoBlock",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": [],
					"collapseEmptyRow": true
				}
			},

 

Mykhailo Storozhuk,

Спасибо!

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

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

Изображение удалено.

Нравится

3 комментария
Лучший ответ

Посмотрите BaseOpportunityPage в пакете Opportunity поле OpportunityClient

 

 

"Client": {
	"caption": {"bindTo": "Resources.Strings.Client"},
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": true
}
....
 
{
	"operation": "insert",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"name": "OpportunityClient",
		"values": {
	    	"bindTo": "Client",
			"layout": {"column": 0, "row": 1, "colSpan": 24},
			"tip": {
				"content": {"bindTo": "Resources.Strings.ClientTip"}
			},
			"controlWrapConfig": {
				"classes": {"wrapClassName": ["client-edit-field"]}
			},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		},
		"alias": {
			"name": "Client",
			"excludeProperties": ["layout"],
			"excludeOperations": ["remove", "move"]
		}
	}





 

Посмотрите BaseOpportunityPage в пакете Opportunity поле OpportunityClient

 

 

"Client": {
	"caption": {"bindTo": "Resources.Strings.Client"},
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": true
}
....
 
{
	"operation": "insert",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"name": "OpportunityClient",
		"values": {
	    	"bindTo": "Client",
			"layout": {"column": 0, "row": 1, "colSpan": 24},
			"tip": {
				"content": {"bindTo": "Resources.Strings.ClientTip"}
			},
			"controlWrapConfig": {
				"classes": {"wrapClassName": ["client-edit-field"]}
			},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		},
		"alias": {
			"name": "Client",
			"excludeProperties": ["layout"],
			"excludeOperations": ["remove", "move"]
		}
	}





 

Владимир Соколов,

Хорошо я вроде понял щас попробую

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

Добрый день, мне надо. что бы при создании записи в разделе копировались значения и родительской записи, так как полей больше 70

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

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

Нравится

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

Да, возможно. Сделайте БП, запуск по записи. Читать родительскую запись, далее добавить запись в раздел и открыть страницу на редактирование только что созданной записи. У меня так реализовано добавление доп.соглашения к договору. 

Можно развить дальше и сделать отдельную кнопку для запуска процесса.

Алексей Следь,

мне надо что бы все 100+ полей копировались одной коллекцией, добавлять вручную такое мне не особо по душе

Dima Avdoshin,

Не понял. Один раз настроить в БП элемент добавить данные и все. Все 100+ полей будут копировать автоматически при создании новой записи. Если сложно настроить элемент добавить данные, то можно все сделать добавление данных скриптом в том же процессе. Можно через InsertSelect

Алексей Следь,

InsertSelect не вызвет событийную модель, что не есть хорошо.

Dima Avdoshin,

Как вариант можно заместить логику нажатия по плюсу на детале.

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

А все колонки из родительской скопирует базовая логика системы:

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

Владислав Литвинчук пишет:

InsertSelect не вызвет событийную модель, что не есть хорошо.

Если проблема только в этом, можно создавать Entity, наполнять её поля и затем вызывать Save. Или, как изначально предложили, средствами стандартных элементов БП для работы с данными.

 

По изначальному вопросу темы:

Вы хотите копировать из одноимённых полей одного объекта в другой?

А то, если просто создать копию записи, то в реестре есть кнопка копирования записи, при нажатии на неё создаётся новая запись с заполненными полями, у которых в объекте включена галка «Копировать данные при копировании записи».

Зверев Александр,

то в реестре есть кнопка копирования записи, при нажатии на неё создаётся новая запись с заполненными полями, у которых в объекте включена галка «Копировать данные при копировании записи».

Да именно это мне нужно, каким образом я могу вызвать ее программно?

Зверев Александр,

можно пример пожалуйста

Сходу нашёлся пример только из интерфейса 5.Х в базовой карточке. От него можно отталкиваться, выкинув лишнее.

row = dataSource.Rows[0].Clone() as Terrasoft.Core.Entities.Entity;
Guid currentUserContactId = Page.UserConnection.CurrentUser.ContactId;
EntityPrimaryColumnValue = Guid.NewGuid();
row.SetColumnValue(primaryColumnName, EntityPrimaryColumnValue);
row.SetColumnValue("CreatedOn", DateTime.Now);
row.SetColumnValue("CreatedById", currentUserContactId);
row.SetColumnValue("ModifiedOn", DateTime.Now);
row.SetColumnValue("ModifiedById", currentUserContactId);
var columnNames = new List<string>();
foreach (var column in row.Schema.Columns) {
	if (column.HasDefValue && 
		((column.IsLookupType || column.IsMultiLookupType) &&
		column.ReferenceSchema.PrimaryDisplayColumn != null) &&
		!columnNames.Contains(column.Name)) {
		columnNames.Add(column.Name);
	}
}
row.LoadLookupDisplayValues(columnNames);
dataSource.Insert(row);

У объекта Entity есть метод .Clone() (или вызываемый им же конструктор Entity(Entity source)). Запускаем его, получаем новый объект в памяти. При необходимости заполняем текущими датой и пользователем стандартные 4 поля, затем те поля, значения которых в Вашей логике нужно поменять относительно образца. Все остальные поля, у которых в дизайнере есть галочка, скопировались автоматически. Id, естественно, будет уже новый.

Цикл из примера не нужен, ведь поля для отображения справочников нас сейчас не интересуют. И в конце запускаем у своего Entity метод .Save(), чтобы эта запись из памяти попала в базу. Кажется, ничего не упустил.

 

Но это всё на уровне C#-скрипта в процессе. Если надо в JS-логике, подобно кнопке копирования, нужно смотреть, как она устроена.

 

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

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

Проблема в том что не могу отследить событие добавление файла на деталь "Файлы и ссылки".

"KtFilesConfirmingDiscountDetail": {
	"schemaName": "KtFilesConfirmingDiscountDetail",
	"entitySchemaName": "KtFilesConfirmingDiscount",
	"filter": {
		"detailColumn": "KtOpportunityProductInterest",
		"masterColumn": "Id"
	},
	"subscriber": {
		"methodName": "discountValueEnable"
	}
}

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

Нравится

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

Александр, в стандартной системе нет объекта KtFilesConfirmingDiscount и схемы детали KtFilesConfirmingDiscountDetail, не видя её кода сложно сказать, почему оно так реализовано. Если это часть партнёрского дополнения, лучше будет уточнить у его автора.

 

Если нужно разработать свою логику со срабатыванием на добавление, можно в обычном БП или встроенном БП объекта файла в этом разделе завязаться на событие добавления.

 

Например, в CaseFile есть такая логика:

Зверев Александр,

 

Код детали

define("KtFilesConfirmingDiscountDetail", ["css!KtFilesConfirmingDiscountDetailCssModule"],
	function() {
	return {
		methods: {
			/**
			 * Initializes parent entity.
			 */
			initParentEntity: function() {
				this.parentEntity = {};
				const entitySchemaName = this.entitySchema && this.entitySchema.name || "";
				const parentSchemaName = entitySchemaName.replace("KtFilesConfirmingDiscount", "KtOpportunityProductInterest");
				const masterRecordId = this.get("MasterRecordId");
				this.parentEntity.EntityName = parentSchemaName;
				this.parentEntity.RecordId = masterRecordId;
			},
			/**
			 * ############## ####### "drag" # "drop" ##########.
			 * @private
			 */
			initDropzoneEvents: function() {
				const dropZone = document.getElementById("DragAndDropContainerOpportunityProductInterest");
				if (!dropZone) {
					return;
				}
				if (this.Terrasoft.Features.getIsEnabled("CheckMasterRecordEditRights") &&
						!this.get("CanEditMasterRecord")) {
					return;
				}
				this.Terrasoft.ConfigurationFileApi.initDropzoneEvents(dropZone, function(over) {
					if (over) {
						dropZone.classList.add("dropzone-hover");
					} else {
						dropZone.classList.remove("dropzone-hover");
					}
				}, function(files) {
					this.onFileSelect(files);
				}.bind(this));
			},
			getAddRecordButtonVisible: function() {
				return this.getToolsVisible() && this.get("CanEditMasterRecord") && this.get("IsEnabled");
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "DragAndDrop Container",
				"parentName": "Detail",
				"propertyName": "items",
				"values": {
					"id": "DragAndDropContainerOpportunityProductInterest",
					"selectors": {"wrapEl": "#DragAndDropContainerOpportunityProductInterest"},
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"wrapClass": ["dropzone"],
					"items": [
						{
							"labelClass": ["DragAndDropLabel"],
							"itemType": Terrasoft.ViewItemType.LABEL,
							"caption": {"bindTo": "Resources.Strings.DragAndDropCaption"}
						}
					]
				}
			}
		]
		/**SCHEMA_DIFF*/
	};
});

Родительский объект "FileDetailV2 ( UIv2 )". Думаю CSS нет смысла прикладывать, он стандартный.

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

По рекомендации поддержки просмотрел методы сохранения и решил остановится на onFileComplete

 

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

messages: {
	"DiscountValueEnable": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.PUBLISH
	}
},
onFileComplete: function() {
	this.callParent(arguments);
	this.sandbox.publish("DiscountValueEnable", null, [this.sandbox.id]);
}

на стороне страницы:

messages: {
	"DiscountValueEnable": {
		mode: this.Terrasoft.MessageMode.PTP,
		direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
	}
},
methods: {
	init: function() {
		this.callParent(arguments);
		this.sandbox.subscribe("DiscountValueEnable", function() {
				this.discountValueEnable();
			}, this, [this.sandbox.id + "_detail_KtFilesConfirmingDiscountDetailKtFilesConfirmingDiscount"]);
	},
	discountValueEnable: function(){
		this.set("discountValueEnable", true);
	}
}

 

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

Добрый день, имеется развернутый локально Creatio. Хочу добавить лэндинг(чтобы можно было к примеру перейти на localhost/landing/index.aspx) с формой, у которой есть поле phone и данные введенные в поле будут попадать в контакты -> мобильный телефон уже к имеющемуся контакту.

Что уже сделал?

Сейчас контакт выглядит следующим образом

Изображение удалено.

Как описано в документации добавил лэндинг. Сжато он выглядит так:

Изображение удалено.

После чего в папке ../0/Nui/ создал папку Landing с файлом index.aspx в котором лежит следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!--ШАГ 2-->
    <!--Эту часть необходимо скопировать из поля ШАГ 2 страницы редактирования лендинга-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/track-cookies.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/create-object.js"></script>
    <script>
 
    var config = {
        fields: {
            "Subject": "#subject-field",
            "Email": "#email-field",
            "Name": "#name-field",
            "MobilePhone": "#phone-field",
        },
        landingId: "54a57d16-e7b6-4c7d-9c38-237cfcf6512d",
        serviceUrl: "http://localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData",
        redirectUrl: "yandex.ru"
    };
 
    function createObject() {
        landing.createObjectFromLanding(config)
    }
    </script>
    <!--ШАГ 2-->
</head>
<body>
<h1>Landing web-page</h1>
<div>
    <h2>Case form</h2>
    <form action="localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData" method="POST" class="mainForm" name="landingForm" onSubmit="createObject(); return false">
        Subject:<br>
        <input type="text" name="subject" id="subject-field"><br>
        Email:<br>
        <input type="text" name="Email" id="email-field"><br>
        Name:<br>
        <input type="text" name="Name" id="name-field"><br>
        Phone:<br>
        <input type="text" name="Phone" id="phone-field"><br><br>
        <input type="submit" value="Submit">
        </font>
    </form>
</div>
</body>
</html>

Если я правильно понял для того чтобы POST запрос прошел корректно должен отработать файл GeneratedObjectWebFormService.svc. Нужно ли его создавать по документации или он является дефолтным? При попытки отправки запроса возникает 403 ошибка. Как сделать это рабочим и какие ошибки я совершил?

Изображение удалено.

Изображение удалено.

Нравится

5 комментариев
Лучший ответ

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

Зверев Александр,

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

Нет, дело не в этом. Посмотрите второй абзац прошлого ответа.

Зверев Александр,

исправил без /0/ теперь следующую проблему не могу побороть 

политика CORS дефолтная и выглядит так:

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

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

Есть потребность на страницу редактирования добавить поле, по которому будет выполняться фильтрация в детали.
Добавлять текстовое поле в EntitySchemа страницы неправильно, так как это значение нужно только для поиска и хранится в таблице не должно.
1. Каким образом я могу добавить такое поле, в которое можно вводить текст, но в тоже время оно не будет связано с полем в EntitySchemа?
2. Корректно ли для этого использовать Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN?
3. Какие ещё есть варианты реализации?
+ Для наглядности хотелось бы пример добавления такого поля :smile:

Нравится

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

1. Просто добавить и привязать под атрибут нужного типа.
2. Именно так.
3. Да собственно никаких, атрибут и диф под него.

Пример:

define("ContactAddressPageV2", [],
    function() {
        return {
            attributes: {
                "UsrKladrStreet": {
                    dataValueType: Terrasoft.DataValueType.LOOKUP
                },
                "UsrVirtualKladrStreet": {
                    "dataValueType": Terrasoft.DataValueType.LOOKUP,
                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    isLookup: true,
                    caption: "virtual street",
                    referenceSchemaName: "UsrKladrStreet"
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "parentName": "Header",
                    "propertyName": "items",
                    "name": "UsrKladrStreet",
                    "values": {
                        bindTo: "UsrKladrStreet",
                        "caption": {"bindTo": "Resources.Strings.UsrKladrStreetCaption"},
                        layout: {column: 0, row: 8, colSpan: 12}
                    }
                },
                {
                    "operation": "insert",
                    "parentName": "Header",
                    "propertyName": "items",
                    "name": "UsrVirtualKladrStreet",
                    "values": {
                        bindTo: "UsrVirtualKladrStreet",
                        "caption": "virtual street",
                        layout: {column: 0, row: 9, colSpan: 12}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);
Показать все комментарии

Здравствуйте! Подскажите, пожалуйста, как добавить JS событие при сохранении контрагента/контакта?
Вот кусок кода на странцие:

methods: {
fir: function()
{
if (this.get("UsrKey").checked)
{
this.set("UsrLoyaltyOfContact", "Лояльно");
}
else
{
this.set("UsrLoyaltyOfContact", "Не определено");
}
}

}

UsrKey - Boolen Checkbox, UsrLoyaltyOfContact - Справочник.

Не могу разобраться, куда подвесить событие?

Нравится

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

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

Что-то похожее ранее обсуждалось здесь.

Вам необходимо переопределить метод onSaved в секции methods схемы страницы редактирования

                        // Переопределение базового метода Terrasoft.BasePageV2.OnSaved.
			// Выполняет постобработку сохранения записи
			onSaved: function(response, config) {
				// Вызов родительской реализации.
				this.callParent(arguments);
                                //Вызов Вашего метода
                                fir();
			}
Показать все комментарии

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

Нравится

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

Дмитрий, подробный ответ с ссылками по данному вопросу предоставлен в посте http://www.community.terrasoft.ru/forum/topic/12590#comment-53498

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

Благодарю

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

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

Нравится

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

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

Вы не уточнили продукт и используемую версию.

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

bpm'online sales enterprise версия 7.6.0.
А как создать новых пользователей системы? Нужно просто добавить контакт?
Или для этого нужна другая система?

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

"Alina_Velichko" написал:

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

Большое вам спасибо!

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

Дмитрий, подробный ответ с ссылками по данному вопросу предоставлен в посте http://www.community.terrasoft.ru/forum/topic/12590#comment-53498

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

Как добавлять в раздел стандартные детали типа "Описание", "Доступ"?

Нравится

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