Проблема: При выгрузке excel-отчёта через браузер Safari из карточки одного из разделов выгружается файл без расширения, файл прочитать не удаётся (скриншот 1). На IOS проблема такая же.

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

Замечание:

1) При выгрузке excel-отчёта в браузере Safari из детали в карточке другого раздела файл корректно загружается и читается

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

2) При выгрузке excel-отчёта в браузере Google Chrome и Яндекс.Браузер из любого из разделов файл корректно загружается и читается

Нравится

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

Мария, как именно формируете отчёт? Стандартно есть только FastReport и Word, речь о дополнении? Или о выгрузке реестра раздела по действию? Какая у Вас версия 7.Х и браузеров?

Ранее похожее было при выгрузке пользовательского пакета из конфигурации в Safari на MacOS, выгружался файл без расширения. Проблема тогда была в настройках браузера/ОС в невозможности конвертировать gz в zip.

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

Александр, как решить эту проблему?

 

Зверев Александр пишет:

Ранее похожее было при выгрузке пользовательского пакета из конфигурации в Safari на MacOS, выгружался файл без расширения. Проблема тогда была в настройках браузера/ОС в невозможности конвертировать gz в zip.

Вероятно, поменять настройки браузера или ОС. К сожалению, в единственный раз с таким сталкивались несколько лет назад и без точных версий ПО, на которых такое случается, сложно воспроизвести и дать рекомендации по настройке. Если у Вас тоже такое случилось, опишите подробнее.

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

Добрый день. Версия 7.15.3.

 

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

 

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

 

При этом пакет явно привязан к хранилищу, которое существует (перед этим на другом стенде был отправлен коммит в это хранилище).

 

В списке "Установка и удаление приложений" этого пакета тоже нет.

 

Как такое может быть, и что с этим делать?

Нравится

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

Денис, такое может быть связано с неправильным значением логического поля InstallType у этого пакета.  Попробуйте сменить. Подробнее об этом и других свойствах пакетов см. в темах: 1, 2, 3, 4, 5.

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

Коллеги, мне необходимо реализовать БП, где триггер - добавление обращения в очередь, см. скриншот

 

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

 

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

Нравится

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

Татьяна, на вопрос «почему» ответить несложно: вся логика наполнения этой таблицы реализована в БП «Процесс наполнения очередей единого окна», где вызывают логику функции ProcessAutoUpdateQueues из QueuesUpdateUtilities.

 

Там добавление идёт при помощи Insert, который не вызывает событий:

  /// <summary>
  /// Adds elements from queue with filtration.
  /// </summary>
  /// <param name="entitySchemaName">Entity schema name of queue element.</param>
  /// <param name="entitySelect">Query to queue object with filtration.</param>
  /// <param name="queueId">Identifier of queue.</param>
  /// <param name="queueName">Queue name.</param>
  /// <param name="itemsCount">Count of not handled elements in queue.</param>
  /// <returns>Added queue items count.</returns>
  private int AddEntityQueueItemsByFilter(string entitySchemaName, Select entitySelect, Guid queueId,
    string queueName, int itemsCount) {
   try {
    if (itemsCount >= _maximumQueueItemsInQueue) {
     QueuesUtilities.LogWarn(string.Format(GetResourceValue("QueueMaximumItemsWarning"), queueName));
     return 0;
    }
    entitySelect.Top(_insertQueueItemTopValue)
     .Column(new QueryParameter("QueueId", queueId)).As("QueueId")
     .Column(new QueryParameter("StatusId", _newQueueItemStatusId)).As("StatusId");
    var selectCondition = new QueryCondition();
    selectCondition.IsNot = true;
    selectCondition.Exists(
     new Select(_userConnection)
      .Column("QueueItem", "Id")
     .From("QueueItem")
     .InnerJoin("QueueItemStatus")
     .On("QueueItemStatus", "Id").IsEqual("QueueItem", "StatusId")
     .Where(entitySchemaName, "Id").IsEqual("QueueItem", "EntityRecordId")
     .And("QueueItem", "QueueId").IsEqual(Column.Parameter(queueId))
     .And("QueueItemStatus", "IsFinal").IsNotEqual(Column.Parameter(true)));
    if (!entitySelect.HasCondition) {
     entitySelect.Where(selectCondition);
    } else {
     entitySelect.And(selectCondition);
    }
    var insertSelect = new InsertSelect(_userConnection)
     .Into("QueueItem")
     .Set("EntityRecordId", "QueueId", "StatusId")
     .FromSelect(entitySelect);
    DateTime addedRecordsStartTime = DateTime.Now;
    int addedRecords = insertSelect.Execute();
    if (addedRecordsStartTime.AddSeconds(60) < DateTime.Now) {
     insertSelect.BuildParametersAsValue = true;
     QueuesUtilities.LogDebug(string.Format(GetResourceValue("LongInsertQueueItemsMessage"),
      queueName, _autoUpdateQueuesProcessId.ToString(), insertSelect.GetSqlText()));
    }
    return addedRecords;
   } catch (Exception e) {
    QueuesUtilities.LogError(string.Format(GetResourceValue("InvokeMethodErrorMessage"),
     string.Concat("AddEntityQueueItemsByFilter ", queueName), e.Message), e);
    throw;
   }
  }

Аналогично и с удалением из очереди.

Сам процесс запускается по планировщику, задание создаётся в QueuesUtilities в функции UpdateQueuesTrigger.

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

 

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

Благодарю за подробный ответ!

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

В разделе есть поле IsExpertRecBadTurnoverNotify (логическое), которое должно быть доступно на чтение всем пользователям, и пользователям роли "ЗГД по маркетингу" на запись. Делаю настройку по инструкции:



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

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



Если я пытаюсь затем отредактировать это поле в странице раздела, система сообщает "Недостаточно прав для изменения значения колонки "IsExpertRecBadTurnoverNotify " объекта "Арендатор"".



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



В чем проблема, почему не работает доступ по колонкам?

Нравится

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

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

Юрий, попробуйте сначала просто выполнить действие «Актуализировать роли» в разделе «Пользователи».

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

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

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

Нравится

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);
			}
		}
 
	};
});

 

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

Возникла такая необходимость.

Как сделать возможным редактирование детали в плиточном представлении?

Есть ли решение? Подскажите.

Нравится

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

Сергей, нет, к сожалению, так нельзя, редактируемый и плиточный реестры не совмещаются. На текущий момент поддерживаетcя редактируемый реестр только в списочном представлении. 

Идея по этому поводу зафиксирована, но планов на ближайшие версии пока нет.

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

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

Нравится

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

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

Добрый день, Денис!

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

 

Светлана Змиёва, создание фильтра в разделе из кода клиентской части

Денис, Вы хотите, чтобы слева в разделе визуально сформировался и применился фильтр или чтобы просто данные реестра отфильтровались, как происходит при изменении быстрого фильтра?

Если Вы имеете в виду второй вариант, то обратите внимание на логику какого-нибудь раздела с быстрыми фильтрами по дате, ответственному и подобному.

 

Например, см. раздел «Маркетинговые планы», фильтр по выбору года в выпадающем списке.

 

В схеме CampaignPlannerSection логика отправки сообщения в «песочницу» на событии изменения года:

/**
 * @override Terrasoft.BaseMarketingCalendarSection#calendarYearChanged
 */
calendarYearChanged: function (newValue) {
    this.sandbox.publish("CalendarYearChanged", newValue, ["MarketingCalendarCampaignsModuleId"]);
}

И базовая реализация  этого поля  и его обработчика с пустой функцией в BaseMarketingCalendarSection:

 

{
    "operation": "insert",
    "parentName": "LeftGridUtilsContainer",
    "propertyName": "items",
    "name": "CalendarYear",
    "values": {
        "dataValueType": Terrasoft.DataValueType.ENUM,
        "caption": {bindTo: "Resources.Strings.YearControlLabel"},
        "wrapClass": ["select-year-container"],
        "controlConfig": {
            "className": "Terrasoft.ComboBoxEdit",
            "list": {
                "bindTo": "CalendarYearList"
            },
            "prepareList": {
                "bindTo": "loadCalendarYearList"
            },
            "value": {
                "bindTo": "CalendarYear"
            },
            "change": {
                "bindTo": "calendarYearChanged"
            }
        }
    }
}
 
...
/**
 * Fires when year in calendar changed.
 */
"CalendarYearChanged": {
    mode: Terrasoft.MessageMode.PTP,
    direction: Terrasoft.MessageDirectionType.PUBLISH
}
            },
.....
/**
 * Handles change of selected year in calendar.
 * @protected
 * @param {Object} newValue Selected year value.
 */
calendarYearChanged: Terrasoft.emptyFn,

А в схеме BaseMarketingCalendarPage приём этого сообщения и наложение фильтров по году:

/**
 * @inheritDoc Terrasoft.BaseSectionV2#subscribeSandboxEvents
 * @overridden
 */
subscribeSandboxEvents: function() {
    var resolvedClickSubscriberId = this.sandbox.id;
    this.sandbox.subscribe("OpenCalendarGridSettings", function() {
        this.openGridSettings();
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("SetCalendarScale", function(config) {
        this.setScale(config.tag);
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("ToggleCalendar", function(value) {
        this.set("IsRightGridContainerVisible", value);
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("SortGrid", function(tag) {
        this.sortGrid(tag);
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("CalendarYearChanged", function(value) {
        this.$CalendarYear = value;
        this.reloadGridData();
    }, this, [resolvedClickSubscriberId]);
},
 
 
...
 
 
/**
 * @inheritdoc Terrasoft.GridUtilities#getFilters
 * @returns {Terrasoft.FilterGroup}
 */
getFilters: function() {
    var sectionFilters = this.get("SectionFilters");
    if (Ext.isEmpty(sectionFilters)) {
        return this.mixins.GridUtilities.getFilters.call(this);
    }
    var selectedYear = new Date().getFullYear();
    if (!Terrasoft.isEmpty(this.$CalendarYear) && !Terrasoft.isEmpty(this.$CalendarYear.value)) {
        selectedYear = this.$CalendarYear.value;
    }
    var serializationInfo = sectionFilters.getDefSerializationInfo();
    serializationInfo.serializeFilterManagerInfo = true;
    var deserializedFilters = Terrasoft.deserialize(sectionFilters.serialize(serializationInfo));
    deserializedFilters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.GREATER_OR_EQUAL,
        "StartDate", new Date(Date.UTC(selectedYear, 0)),
        Terrasoft.DataValueType.DATE));
    deserializedFilters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.LESS,
        "StartDate", new Date(Date.UTC(selectedYear + 1, 0)),
        Terrasoft.DataValueType.DATE));
...

 

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

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

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

 

Кто знает, с чем может быть связано и как ускорить процесс?

Нравится

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

Денис, время компиляции  увеличилось из-за длительной генерации статического контента. Это происходит с версии 7.11.



При «компилировать всё» на БД MS SQL, на коробке, продукт бандл, процедура должна занимать в среднем 5 минут, что считается приемлемым.



При «компилировать всё» на БД Oracle, на коробке, продукт бандл, процедура  иногда может занимать ~ 30 минут, что планируется решить.

 

 

На продолжительность процесса компиляции может влиять очень много факторов.

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

 

Процесс компиляции приблизительно выглядит так (значимая часть): 

  1. Происходит поиск всех измененных схем (по сути поиск происходит только в пакетах, которые установлены из SVN, то есть являются «разлоченными»)
  2. Проходит анализ на построение цепочки компиляции. Анализируется каждая схема:
    1. Если схема является новой (не замещённой) - компилируется только пакет, в котором эта схема находится
    2. Если схема является замещённой - компилируется вся цепочка наследования. 

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

 

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

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

Спасибо, получается чем больше наследований, тем дольше компиляция?

И чем больше пакетов с изменениями.

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

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

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

"isAddVisible": {
   dataValueType: Terrasoft.DataValueType.BOOLEAN,
   type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
   value: true
}

и добавляю в diff:

{
  "operation": "merge",
  "name": "AddRecordButton",
  "values": {
    "visible": { bindTo: "isAddVisible" }
  }
}

В схеме страницы в diff определена деталь:

{
  "operation": "insert",
  "name": "UsrReportFileDetail",
    "values": {
      "itemType": 2,
      "markerValue": "added-detail",
      "isAddVisible": "false"
    },
    "parentName": "NotesAndFilesTab",
    "propertyName": "items",
    "index": 0
 }

В перспективе хотелось бы привязать isAddVisible к функции, возвращающей true или false в зависимости от статуса записи (стадии кейса). Но даже в таком виде код не работает: система применяет к кнопке на детали значение по умолчанию true, а не выставленное в странице редактирования значение false. Почему? 

Нравится

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

Кнопка видимости уже привязана к функции getAddRecordButtonVisible, можно заместить эту функцию. Если хотите привязать к своей функции, то bindTо указываете название свой функции. Вот как описано кнопка добавления в самой детали, в ней уже указана функция которое возвращает видимость.

{

                "operation": "merge",

                "name": "AddRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "tag": "addFileButton",

                    "fileUpload": true,

                    "filesSelected": {"bindTo": "onFileSelect"},

                    "click": {"bindTo": "onAddFileClick"},

                    "visible": {"bindTo": "getAddRecordButtonVisible"},

                    "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}

                }

            }

Юрий, а зачем там «value: true» в свойствах атрибута? Он задаётся для виртуальных колонок с фиксированным значением, а для каждый раз вычисляемых  функцией — не нужен. Пример приводил в теме ниже.

 

А у Вас, насколько понял, ни то, ни другое, а передача значения извне. Не уверен, что именно так можно, не нашёл аналогичных примеров в «коробке». Если не указывать в самой детали, то будет брать со страницы или будет undefined?

 

Попробуйте передавать свой параметр не в diff, а как из карточки на её детали передают свойства вроде filterMethod или useRelationship:

details: /**SCHEMA_DETAILS*/{
...
	OpportunityContact: {
		schemaName: "OpportunityDetailV2",
		filter: {
			masterColumn: "Contact",
			detailColumn: "Contact"
		},
		defaultValues: {
			Contact: {
				masterColumn: "Contact"
			}
		},
		useRelationship: false,
		filterMethod: "opportunityAccountFilter",
		captionName: "CustomerOpportunitiesCaption"
	},

 

Кнопка видимости уже привязана к функции getAddRecordButtonVisible, можно заместить эту функцию. Если хотите привязать к своей функции, то bindTо указываете название свой функции. Вот как описано кнопка добавления в самой детали, в ней уже указана функция которое возвращает видимость.

{

                "operation": "merge",

                "name": "AddRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "tag": "addFileButton",

                    "fileUpload": true,

                    "filesSelected": {"bindTo": "onFileSelect"},

                    "click": {"bindTo": "onAddFileClick"},

                    "visible": {"bindTo": "getAddRecordButtonVisible"},

                    "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}

                }

            }

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

Добрый день!

Подскажите как перейти в другой раздел по нажатию кнопки на клиентской стороне, например в раздел итоги или обращения

 

Видел вариант с переход по вкладкам

this.setActiveTab("имя_вкладки");

Нравится

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

Вешаете на кнопку обработчик. А в него что-то вроде этого: 

var tag = "SectionModuleV2/ActivitySectionV2/";
this.sandbox.publish("PushHistoryState", {hash: tag});

ActivitySectionV2 - реестр раздела Активности

Вешаете на кнопку обработчик. А в него что-то вроде этого: 

var tag = "SectionModuleV2/ActivitySectionV2/";
this.sandbox.publish("PushHistoryState", {hash: tag});

ActivitySectionV2 - реестр раздела Активности

Дмитрий А.,

Спасибо, попробую

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