Здравствуйте! Возник такой вопрос: Как добавить отображение ещё одного поля для справочника. Допустим, к примеру, нужно отобразить Id напротив каждого значения Name, ну или любую другую колонку. Можно ли это сделать прям при выборе в справочнике? 

Версия мобильного приложения:7.16.5 основного:7.14

 

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

Нравится

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

Есть Terrasoft.sdk.LookupGridPage. Работает по аналогии с sdk реестра.

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

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

Есть Terrasoft.sdk.LookupGridPage. Работает по аналогии с sdk реестра.

Николай Кузьмин пишет:

Есть Terrasoft.sdk.LookupGridPage. Работает по аналогии с sdk реестра.

 

 Благодарю за подсказку. Помогло.

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

Добрый день

 

Поставлена задача контролировать статус активностей по обращению на момент перехода в статус "IsResolved". Сделал на CasePage в methods 2 функции:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.validateActivities(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function() {
				callback.call(scope, response);
			}, this);
	}, this]);
},
validateActivities: function(callback, scope) {
	var result = {success: true};
	if (this.get("Status").IsResolved===true) {
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Activity" });
		esq.addColumn("Status.Finish", "Isfinished");
		esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
			"Status.Finish", "0"));
		esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
			"Case", this.get("Id")));
		esq.getEntityCollection(function(response) {
			if (response.success && response.collection.getCount() > 0) {
					result.message = this.get("Resources.Strings.CantChangaStatus");
					result.success = false;
			}
			callback.call(scope || this, result);
		}, this);
	}
}

Если обращение существует, то все отлично. Проверка идет, сохранять обращение не дает.

Возникла проблема с созданием обращения. Все намертво подвисает и ошибок в логах нет. Подскажите куда копать

Нравится

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

Алексей, не пробовали отладку в этом коде и просмотр уходящих к серверу HTTP-запросов. Зависание может означать или цикл, или рекурсию, когда эта логика будет повторяться снова и снова.

 

А если заменить проверку с ESQ на заглушку, тоже зависает? Может, дело в асинхронности получения ответа от него, а выполнение проверки в asyncValidate ожидало результата сразу?

 

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

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

В разделе есть несколько типов страницы редактирования. Как установить условия на видимость кнопки добавления для одного из типов? В каком модуле определены данные кнопки? Заранее спасибо!

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

Нравится

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

В diff схемы реестра раздела добавляем 

{

            "operation": "merge",

            "name": "SeparateModeAddRecordButton",

            "parentName": "SeparateModeActionButtonsLeftContainer",

            "propertyName": "items",

            "values": {

                "itemType": Terrasoft.ViewItemType.BUTTON,

                "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                "caption": {"bindTo": "AddRecordButtonCaption"},

                "click": false,

                "visible": {"bindTo": "IsAddRecordButtonVisible"},

                "classes": {

                    "textClass": ["actions-button-margin-right"],

                    "wrapperClass": ["actions-button-margin-right"]

                },

                "controlConfig": {

                    "menu": {

                        "items": {

                            "bindTo": "EditPages",

                            "bindConfig": {

                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {

                                        return null;

                                    }

                                    var operationHash = {

                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования

                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"

                                    };

                                    

                                    var allowedPages = [];

                                    

                                    if (this.get("CanAbilityToAdd1")) {

                                        allowedPages.push("CanAbilityToAdd1");

                                    }

                                    

                                    if (this.get("CanAbilityToAdd2")) {

                                        allowedPages.push("CanAbilityToAdd2");

                                    }

                                    for (var key in operationHash) {

                                        var hashItem = departmentToOperationHash[key];

                                        if (allowedPages.indexOf(hashItem) === -1) {

                                            editPages.collection.remove(editPages.collection.getByKey(key));

                                        }

                                    }

                                    return editPages;

                                }

                            }

                        }

                    }

                }

            }

        }

}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {

                RightUtilities.checkCanExecuteOperation({

                    operation: "CanAbilityToAdd1"

                }, function(result) {

                    this.set("CanAbilityToAdd1", result);

                }, this);

            },

Добрый вечер.

Кнопки для добавления разных типов записей генерируются автоматически в зависимости от информации в таблице SysModuleEdit и поля TypeColumnValue в этой таблице.

Названия пунктов меню для разных страниц редактирования берутся из поля ActionKindCaption.

Более подробную информацию посмотрите в этом посте.

Пользовательскими настройками (без внесения дополнительных изменений в программный код) настроить видимость пункта меню в кнопке [Добавить] этого сделать не получится.

Базовая логика добавления пунктов меню для кнопки [Добавить] раздела реализована в схеме 'BaseDataView' пакета NUI.

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

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

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

Не уверенна, что разграничение прав доступа, как-то повлияет на видимость пункта меню кнопки [Добавить] для этого типа.

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

В diff схемы реестра раздела добавляем 

{

            "operation": "merge",

            "name": "SeparateModeAddRecordButton",

            "parentName": "SeparateModeActionButtonsLeftContainer",

            "propertyName": "items",

            "values": {

                "itemType": Terrasoft.ViewItemType.BUTTON,

                "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                "caption": {"bindTo": "AddRecordButtonCaption"},

                "click": false,

                "visible": {"bindTo": "IsAddRecordButtonVisible"},

                "classes": {

                    "textClass": ["actions-button-margin-right"],

                    "wrapperClass": ["actions-button-margin-right"]

                },

                "controlConfig": {

                    "menu": {

                        "items": {

                            "bindTo": "EditPages",

                            "bindConfig": {

                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {

                                        return null;

                                    }

                                    var operationHash = {

                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования

                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"

                                    };

                                    

                                    var allowedPages = [];

                                    

                                    if (this.get("CanAbilityToAdd1")) {

                                        allowedPages.push("CanAbilityToAdd1");

                                    }

                                    

                                    if (this.get("CanAbilityToAdd2")) {

                                        allowedPages.push("CanAbilityToAdd2");

                                    }

                                    for (var key in operationHash) {

                                        var hashItem = departmentToOperationHash[key];

                                        if (allowedPages.indexOf(hashItem) === -1) {

                                            editPages.collection.remove(editPages.collection.getByKey(key));

                                        }

                                    }

                                    return editPages;

                                }

                            }

                        }

                    }

                }

            }

        }

}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {

                RightUtilities.checkCanExecuteOperation({

                    operation: "CanAbilityToAdd1"

                }, function(result) {

                    this.set("CanAbilityToAdd1", result);

                }, this);

            },

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

 

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

Полозюков Евгений Петрович,

 пытаюсь сделать что-то подобное, все проверила 10 раз, но отладчик выдает:

Uncaught (in promise) TypeError: RightUtilities.checkCanExecuteOperation is not a function

А Вы добавили в начале в квадратных скобках и параметрах ссылку на RightUtilities? Посмотреть, как это сделано, можно в других схемах, где её используют:

define("SysOperationAuditSectionV2", ["BaseFiltersGenerateModule", "SysOperationAudit", "SysOperationAuditArch",
	"RightUtilities"],
function(BaseFiltersGenerateModule, SysOperationAudit, SysOperationAuditArch, RightUtilities) {
	return {

 

Зверев Александр, да, была проблема с последовательностью схем и параметров, передаваемых в схему)

Алла Савельева,

 

Спасибо, что подсказали на тему замещения BaseDataView. Натолкнули на верный путь!

Если кому то поможет, вот проверка на доступ к просмотру указанного типа страницы. Очень коряво, но я учусь и это работает)

define("ActivitySectionV2", ["ConfigurationConstants","RightUtilities","ProcessModuleUtilities","BaseDataView"],
function(ConfigurationConstants,RightUtilities,ProcessModuleUtilities) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: 
		{ 
			"UsrCanManageItTask": {
				dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
				type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: false
			}
		},
		diff: /**SCHEMA_DIFF*/[
 
			]/**SCHEMA_DIFF*/,
		methods: {
			init: function()
			{
					this.getUserSettingsOperationRight();
					window.console.log("Инициализация");
					this.callParent(arguments);
					window.console.log("Права");
 
			},
 
			initEditPages: function() {
				window.console.log("Определение кнопок начало");
 
				var enabledEditPages = new this.Terrasoft.Collection();
 
					this.callParent(arguments);
					var editPages = this.get("EditPages");
 
					window.console.log("Получение страниц");
					var flag = this.get("UsrCanManageItTask");
					this.Terrasoft.each(editPages.getItems(), function(item) {
						window.console.log("Проверка типа");
						window.console.log(item.get("Id"));
						//window.console.log(ConfigurationConstants.Activity.Type.Email);ConfigurationConstants.Activity.Type.Call
						if (item.get("Id") !== "e2831dec-cfc0-df11-b00f-001d60e938c6" &&
							item.get("Id") !== "e1831dec-cfc0-df11-b00f-001d60e938c6") {
 
							if (item.get("Id") !== "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661")
							{
								enabledEditPages.add(item);
								//window.console.log("ок");
							}
							else { 
								if (flag)
								{
										enabledEditPages.add(item);
										//window.console.log("ок");
								}
							}
						}
					});
					window.console.log("Проверка типа конец");
					this.set("EnabledEditPages", enabledEditPages);
 
					window.console.log("Определение кнопок конец");
			},
 
			getFilters: function() {
						window.console.log("Добавление фильтра");
						var filters = this.callParent(arguments);
						if (!this.get("UsrCanManageItTask"))
						{
							filters.add("NotItTask", this.Terrasoft.createColumnFilterWithParameter(
							this.Terrasoft.ComparisonType.NOT_EQUAL, "Type", "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661"
							));
							window.console.log("Добавление фильтра");
						}
						return filters;
			},
 
			getUserSettingsOperationRight: function() {
				//debugger;
				var operationsToRequest = ["UsrCanManageItTask"];
				//operationsToRequest.push("UsrCanManageItTask");
				window.console.log("Права");
 
				RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
					if (result) {
						this.set("UsrCanManageItTask", result.UsrCanManageItTask);
						window.console.log("Права на ит-задачи: "+result.UsrCanManageItTask);
					}
				}, this);
			}
		}
 
	};
});

 

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

Доброго дня.

 

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

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

Раньше такого сообщения никогда не получал.

Раздел в рабочее место не добавляется, на портале его нет. В мастере раздела вкладки "Портал" тоже нет.

Также как и нет в списке разделов для выбора в настройке рабочего места раздела "Сотрудник портала"

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

Нравится

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

Константин, я начал смотреть в коде, почему так.

 

Логика этой проверки и показа сообщения в SysModuleInWorkplaceDetailV2 в функции:

 

/**
* Processed receiving general and portal sections from service.
* @overridden
* @param {Object} result General and portal sections.
* @param {Object} selectedRows Selected rows in section lookup page.
*/
processedGeneralAndSspSections: function(result, selectedRows) {
                var generalAndSspSections = result.GetGeneralAndSspSectionsResult;
                if (generalAndSspSections) {
                                var sectionId = selectedRows.getByIndex(0).value;
                                if (generalAndSspSections.length === 2) {
                                                var isSelectedSectionSSP = Ext.Array.findBy(generalAndSspSections, function(item) {
                                                                var selectedSection = JSON.parse(item);
                                                                var sectionTypes = this.$SectionTypes || {};
                                                                return selectedSection.Id === sectionId && selectedSection.Type === sectionTypes.SSP;
                                                }, this);
                                                if (isSelectedSectionSSP) {
                                                                this._addSectionsToWorkplace(selectedRows);
                                                } else {
                                                                this.showInformationDialog(
                                                                                this.get("Resources.Strings.SelectedSectionAlreadyRegisteredAsSSP"));
                                                }
                                } else {
                                                this.openSectionWindow(sectionId, "SspMainSettings", null,
                "/AddSsp/" + this.get("MasterRecordId"));
                                }
                }
},

 

Тут в GetGeneralAndSspSectionsResult — результат запроса к /0/rest/SectionService/GetGeneralAndSspSections, на вход подают Id EBF36756-7854-4169-B2CC-8BC0EA25F391 этого раздела в SysModule, на выходе получаем две строки:

{
   "GetGeneralAndSspSectionsResult":[
      "{\r\n  \"Id\": \"ebf36756-7854-4169-b2cc-8bc0ea25f391\",\r\n  \"Type\": 0,\r\n  \"Caption\": \"Employees\",\r\n  \"SysModuleEntityId\": \"adfb879a-7065-4416-9379-3a0d63295dba\",\r\n  \"Code\": \"Employee\",\r\n  \"SchemaName\": \"EmployeeSection\",\r\n  \"EntityUId\": \"fb1c2bed-91d4-4b06-a28c-621a3d187008\",\r\n  \"TypeColumnName\": \"\",\r\n  \"SysModuleVisaEntityUId\": \"00000000-0000-0000-0000-000000000000\"\r\n}",
      "{\r\n  \"Id\": \"b3c1469a-26b2-4b76-a4c6-f6f0056c9972\",\r\n  \"Type\": 0,\r\n  \"Caption\": \"HR\",\r\n  \"SysModuleEntityId\": \"adfb879a-7065-4416-9379-3a0d63295dba\",\r\n  \"Code\": \"HR\",\r\n  \"SchemaName\": null,\r\n  \"EntityUId\": \"fb1c2bed-91d4-4b06-a28c-621a3d187008\",\r\n  \"TypeColumnName\": \"\",\r\n  \"SysModuleVisaEntityUId\": \"00000000-0000-0000-0000-000000000000\"\r\n}"
   ]
}

Вместе с искомым разделом Employees получаем какой-то раздел HR, которого я в интерфейсе нигде не вижу и нет в лукапе выбора раздела для добавления.

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

 

Если добавлять обычный раздел (например, «Продукты»), то либо в результате будет 1 строка и пойдёт по нижней ветке добавления портального раздела для этого раздела, либо в результате запроса к GetGeneralAndSspSections будет 2 записи по одному и тому же разделу, обычная и портальная, и если пользователь в лукапе выбрал портальную, она успешно добавится.

 

А так, из-за раздела HR логика отрабатывает не так, как ожидалось.

 

Судя по дате создания записи в 2013 году, он мог остаться от старых версий и не использоваться. Но это не точно.

 

Удалил в таблице SysModule запись с Caption, равным «HR»,  после чего портальный раздел сотрудников создался. После выбора раздела в мастере заполнил свойства и поля в портальной карточке, сохранил и он появился:

Добрый день! Тоже столкнулись с данной проблемой. Подскажите  прямой URL-адрес страницы пока разработчики не исправили данный Баг.

Максим, какую страницу Вы имели в виду? Я предложил удалить запись из SysModule.

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

Добрый день, товарищи разработчики!

Возникла проблема с коннектором IIT E-Signature for Creatio.

Точнее с системой, при попытке обновления 7.15.3 -> 7.15.4 Service enterprise возникает ошибка:

Autogenerated\Src\DigitalSignatureFileUploadInfo.DigitalSignature.cs(19,47) ошибка CS0535: 'DigitalSignatureFileUploadInfo' does not implement interface member 'IFileUploadInfo.AdditionalParams'

Помогите забороть эту проблему.

Нравится

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

Добрый день, Петр!

 

Эта ошибка уже в работе у ответственной команды. Предварительно в начале следующей неделе опубликуем обновленный пакет на маркетплейс.

Добрый день, Петр!

 

Опубликовала обновленный пакет на маркетплейсе с исправлением ошибки. Установите дополнение повторно из маркетплейс и проверьте обновления.

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

Есть процесс в котором идет обработка писем и автоматическая рассылка. Если отправлять письма через элемент отправить Email, то все отлично форматирует. пустые данные просто пропускает. Но отправленные письма должны прикрепляться к обращению. Поэтому при отправке письма используются скрипты, а не элемент БП Отправить Email. Остается вопрос как в письме убрать желтизну от макросов на те данные, которых еще нет в обращении

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

Нравится

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

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

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

var contactEmail = Get<string>("ContactMail");
var senderEmail = Get<string>("SenderEmail");
var caseId = Get<Guid>("CaseId");
var templateId = Get<Guid>("TemplateEmail");
var userConnection = UserConnection.AppConnection.SystemUserConnection;
var emailTemplateMacrosManager = new EmailWithMacrosManager(userConnection);
if (UserConnection.GetIsFeatureEnabled("EmailMessageMultiLanguageV2")) {
	_log.Debug("EmailMessageMultiLanguageV2=true");
	emailTemplateMacrosManager.SendEmailFromTo(caseId, templateId, senderEmail, contactEmail);
} else {
	var emailTemplateStore = new EmailTemplateStore(userConnection);
	var emailTemplateLanguageHelper = new EmailTemplateLanguageHelper(caseId, userConnection);
	var languageId = emailTemplateLanguageHelper.GetLanguageId(templateId);
	var templateEntity = emailTemplateStore.GetTemplate(templateId, languageId);
	emailTemplateMacrosManager.SendEmailFromTo(caseId, templateEntity.PrimaryColumnValue, senderEmail, contactEmail);
}
return true;

 

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

 

Сама логика с жёлтым цветом реализована в MacrosHelperV2:

private const string MacrosHighlightsTemplate = "<span class=\"unhandled-macro\" style=\"background-color:#fff94f;\">[#{0}#]</span>";
...
/// <summary>
/// Returns the DOM markup to highlight value.
/// </summary>
/// <param name="value">Text that needs to be highlighted.</param>
/// <returns>DOM markup.</returns>
private string GetHighlights(string value) {
	string highlight = string.Format(MacrosHighlightsTemplate, value);
	return highlight;
}
...
/// <summary>
/// Highlights macroses in template text.
/// </summary>
/// <param name="template">Template text.</param>
/// <param name="macrosInfo">Macroses list.</param>
/// <returns>Template text with highlights.</returns>
protected virtual string ReplaceMacros(string template, List<MacrosInfo> macrosInfo) {
	string result = template;
	foreach (MacrosInfo item in macrosInfo) {
		string macrosDisplayValue = string.Format(MacrosTemplate, item.Alias);
		string highlights = GetHighlights(item.Alias);
		result = result.Replace(macrosDisplayValue, highlights);
	}
	return result;
}

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

У Вас используются функции из схем EmailWithMacrosManager (SendEmailFromTo и GetTemplateBody), BaseEmailWithMacrosManager (GetTemplateBody), GlobalMacrosHelper(GetTextTemplate) и MacrosHelperV2 (GetTextTemplate, GetHighlightedTemplate, ReplaceMacros и GetHighlights).

 

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

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

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

Нравится

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

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

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

 Добрый день!

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

1. дополнить ссылающийся модуль ссылкой на оверврайт.

2. сделать оверврайт ApprovalDashboardItemViewModel

define("SectionActionsDashboard", ["UsrVisaViewModel"],
function(ConfigurationConstants) {
	return {
        methods: {},
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
 
});
define("UsrVisaViewModel", ["ApprovalDashboardItemViewModel"],
 
	function(resources, VisaHelper, ConfigurationEnums, ConfigurationConstants) {
		Ext.define("Terrasoft.UsrVisaViewModel", {
			override: "Terrasoft.ApprovalDashboardItemViewModel",
 
			/**
				 * Approve button click handler.
				 */
 
			onApproveButtonClick: function() {
					***
			}
 
		});
	}
);

 

Можно путём замещения при помощи override и прописывания нового в схеме BootstrapModulesV2. См. нижний комментарий тут.

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

Доброго времени суток.



При скрытии поля механизмом бизнес-правил (условие на отображение) в карточке контрагента в левом контейнере (ProfileContainer) остаются пустые строки - http://joxi.ru/l2ZK46BtEgkNDA



Пробовал через css - сработало только для центрального блока (которые внутри вкладок на карточке). Свойство collapseEmptyRow выставленное у контейнера также не помогло.



Есть ли способ решить данную проблему?



Спасибо

Нравится

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

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

 

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

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

 

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

Мотков Илья,



Спасибо за ваш ответ. Надеюсь решение данной проблемы войдет в список изменений следующего релиза.

Идею зарегистрировали в апреле 2019 году. в августе 2020 напоминали про неё. На носу уже 2022 год, версия системы 7.18.5, а воз и ныне там....

Придумал для себя обходное решение. Мне надо было на страницу обращения добавить новые поля. Причем видные только при определенном сервисе. Естественно при скрытии полей оставалось пустое место. Тогда я решил спраятать эти поля в отдельный контейнер.

получилось так:

Контейнер_для_множества_полей_на_CardContentContainer
	Контейнер_для_поля1_ на_Контейнер_для_множества_полей
		Поле1_на_Контейнер_для_поля1
	Контейнер_для_поля2_ на_Контейнер_для_множества_полей
		Поле2_на_Контейнер_для_поля2

Потом создал бизнес-правила для Поля1 и Поля2. Сохранил, зашел в код страницы и заменил в секции businessRules Поле1 и Поле2 на Контейнер_для_поля1 и Контейнер_для_поля2 соответсвенно. + еще есть общее бизнес правило для Контейнер_для_множества полей, которое скрывает контейнер со страницу, когда поля совсем не нужны.

понимаю, что мое решение не для всех случае подойдет, но все же лучше чем ничего).

Очень надеюсь, что в версии 8.1. (именно 1, а не 8.0 - на неё уже нет надеджды) мы сможем это все делать на заявленном и распиареном LowCodeNoCode.

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

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

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

 

Прикрепленные файлы

Нравится

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

В самом процессе, который привязан к кнопке на панели, можно создать блок «автогенерируемая страница» и вывести на неё нужные поля. Или «Преднастроенная страница», там возможности дизайна шире: можно создать новую страницу с полями или указать интересующую мини-карточку. То есть нужно в конфигурации или библиотеке процессов найти нужный БП и доработать.

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

Автогенерируемая страница не подойдет, нужна именно миникарточка.

Если использовать "преднастроенную страницу" и туда указывать мини карточку, то из CTI панели мини карточка не открывается. Просто по нажатию проставляется url типа CallMiniPage/add/GUID и ничего больше не происходит.

А какие-то ошибки при этом пишутся в консоли?

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

Добрый день.

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

К примеру есть разделе HR. на странице раздела есть поля для заполнения, и справочниками, и также есть деталь Задачи. Нужно одним запросом получить все что есть на странице. Возможно вообще такое получить?

Прикрепленные файлы

Нравится

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

Если и можно, то не по OData. Там показывает Id для справочных полей, Name нужно тянуть из объекта справочника отдельно, то же самое и для объектов деталей.

 

Возможно, вместо OData больше подойдёт DataService, который используется в интерфейсе системы для отображения в разделах и карточках записей с сервера. Детали всё равно надо будет отдельно, но значения для отображения из справочников подтянутся. Наконец, несколько запросов к нему можно послать в одном пакетном. То есть можно предусмотреть выборку записи из раздела и связанных с ней записей деталей.

 

Пример одной записи того, что возвращает сервер при заходе в реестр раздела контактов:

      {
         "Id":"b9e98250-72c5-df11-b1ad-001d60e938c6",
         "Name":"\u0410\u0432\u0434\u043E\u0440\u043E\u0432 \u0421\u0435\u0440\u0433\u0435\u0439 \u0412\u0430\u043B\u0435\u043D\u0442\u0438\u043D\u043E\u0432\u0438\u0447",
         "Photo":{
            "value":"dc0d78a5-18ce-4cbb-9afa-2d7d0143f4a6",
            "displayValue":"1.jpg",
            "primaryImageValue":""
         },
         "Job":{
            "value":"34f48df9-56e6-df11-971b-001d60e938c6",
            "displayValue":"\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440",
            "primaryImageValue":""
         },
         "Phone":"+7 495 780 80 82",
         "Account":{
            "value":"4bcc8fce-9bde-44ec-a431-302befd28640",
            "displayValue":"\u0410\u043A\u0441\u0438\u043E\u043C\u0430",
            "primaryImageValue":"ac4aa0b0-c255-4c01-a544-741b74e2430e"
         },
         "Email":"s.avdorov@yahoo.com",
         "MobilePhone":"+7 905 726 46 29",
         "EntryPointsCount":0
      },

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

 

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

 

Если же Вы хотите автоматически получать не сами данные, а их структуру, какие поля есть в карточке и на деталях, то эта информация хранится в коде схем карточки и деталей, по ней генерируется веб-страница, видимая в браузере. Теоретически, их разбирать умеет мастер раздела, можно попробовать разобраться в схемах SectionWizard, SectionPageWizard, PageWizard, ApplicationStructureItemWizard и многих других схемах, его реализующих.

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

Cпасибо за подсказки.

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