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

При выборе контрагента в поле [Клиент] хотелось бы, чтобы поле [Реквизиты клиента] заполнялось автоматически, если у контрагента один реквизит. Возможно ли это сделать?

Заранее благодарю за помощь.

Нравится

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

Настолько частая задача, что хотелось бы, чтобы её в коробку добавили.

Так как же эта задача решается не из коробки?

Спасибо за Ваш комментарий. Пожелание на доработку в базовой конфигурации системы отправлено соответствующей команде разработки продукта.

ставим attributes

"CustomerBillingInfo": {
	dependencies: [
		{
				columns: ["Account"],
				methodName: "setCustomerBillingInfo"
		}
	]
}

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

	   /**
             * Установка BillingInfo по условию: 1) Если у контрагента всего один BillingInfo то
             *									 2) Вставляем его объект в BillingInfo
             *                                   3) Если больше - ищем по умолчанию
            */
			setCustomerBillingInfo: function() {
                var account = this.get("Account");
				if (account) {
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "AccountBillingInfo"
					});
                    esq.addColumn("Id");
                    esq.addColumn("Name");
                    esq.addColumn("UsrDefault");
					esq.filters.add("AccountFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "Account", account.value));
					esq.getEntityCollection(function(response) {
						if (response && response.success) {
							var collection = response.collection;
							if (collection && collection.getCount() > 0) {
                               var items = collection.getItems();
                               if (items.length === 1) {
                                   var item = items[0];
                                   this.set("CustomerBillingInfo", {value: item.get("Id"), displayValue: item.get("Name")});
                               }
                               else {
                                   items.forEach(function(item) {
                                       if (item.get("UsrDefault")) {
                                           this.set("CustomerBillingInfo", {value: item.get("Id"), 
                                               displayValue: item.get("Name")});
                                           return;
                                       }
                                   }, this);
                               }
							}
						}
					}, this);
				}
			}

Владимир, благодарю! Я был на правильном пути, но мне не хватало вот этой строчки кода:

this.set("CustomerBillingInfo", 
    {value: item.get("Id"), displayValue: item.get("Name")});
Показать все комментарии

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

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

Нашел в сообществе:

getGridDataColumns: function() {
        var columnsConfig = this.callParent(arguments);
        columnsConfig.NumberDecimal = {
                path: "NumberDecimal",
                orderPosition: 10,
                orderDirection: 1
        };
        return columnsConfig;
}

Но это не работает.

Нравится

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

Добрый день.
Попробуйте:

/**
 * Возвращает колонки, которые всегда выбираются запросом.
 * @protected
 * @overridden
 * @return {Object} Возвращает массив объектов-конфигураций колонок.
 */
getGridDataColumns: function() {
	var baseGridDataColumns = this.callParent(arguments);
	var gridDataColumns = {
		"SmrNumber": {path: "SmrNumber"}
	};
	return Ext.apply(baseGridDataColumns, gridDataColumns);
},
/**
 * Инициализирует колонки сортировки.
 * @protected
 * @overridden
 * @param {Terrasoft.EntitySchemaQuery} esq Запрос, в который будут инициализорованы опции сортировки.
 */
initQuerySorting: function(esq) {
	var sortedColumn = esq.columns.collection.get("SmrNumber");
	if (sortedColumn) {
		sortedColumn.orderPosition = 0;
		sortedColumn.orderDirection = this.Terrasoft.OrderDirection.DESC;
	}
}

Здравствуйте, Дмитрий.
Спасибо. Это то что нужно.

Здравствуйте, подскажите, как отфильтровать по колонке связанного справочника?
Например, есть деталь, в ней справочное поле, а в справочнике целочисленное поле.
Деталь UsrPrimaryContact, справочное поле UsrRelationType поле UsrOrder. Т.е. нужно отсортировать по UsrRelationType.UsrOrder

Уже разобрался. Спасибо за хороший пример.

 /**
                 * Возвращает колонки, которые всегда выбираются запросом.
                 * @protected
                 * @overridden
                 * @return {Object} Возвращает массив объектов-конфигураций колонок.
                 */
                getGridDataColumns: function () {
                    var baseGridDataColumns = this.callParent(arguments);
                    var gridDataColumns = {
                    	"UsrRelationshipType": {path: "UsrRelationshipType"},
                        "UsrRelationshipType.UsrOrder": {path: "UsrRelationshipType.UsrOrder"}
                    };
                    return Ext.apply(baseGridDataColumns, gridDataColumns);
                },
                /**
                 * Инициализирует колонки сортировки.
                 * @protected
                 * @overridden
                 * @param {Terrasoft.EntitySchemaQuery} esq Запрос, в который будут инициализорованы опции сортировки.
                 */
                initQuerySorting: function (esq) {
                    debugger;
                    var sortedColumn = esq.columns.collection.get("UsrRelationshipType.UsrOrder");
                    if (sortedColumn) {
                        sortedColumn.orderPosition = 0;
                        sortedColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
                    }
                },
Показать все комментарии

Добрый день!

Столкнулся со следующей задачей: есть два поля datetime - UsrEnsFromDate и UsrPolisEndDate. Необходимо, чтобы при изменении UsrEnsFromDate, менялся и UsrPolisEndDate (UsrEnsFromDate+ 1 год - 1 день). С этим справился:

attributes: {
  "UsrPolisEndDate": {
    dataValueType: this.Terrasoft.DataValueType.DATE,
      dependencies: [
        {
           columns: ["UsrEnsFromDate"],
           methodName: "onUsrEnsFromDateChanged"
        }
      ]
  }
}

methods: {
  onUsrEnsFromDateChanged: function() {
    var toDate = this.Terrasoft.deepClone(this.get("UsrEnsFromDate"));
    toDate.setFullYear(toDate.getFullYear() + 1).setDate(toDate.getDate() - 1);
    if (!this.Ext.isDate(toDate)) {
      return;
    }
    this.set("UsrPolisEndDate", toDate);
  }
}

Далее, требуется при создании новой записи, заполнять поля значениями по умолчанию. UsrEnsFromDate = текущая дата, UsrPolisEndDate = UsrEnsFromDate+ 1 год - 1 день. Настроил для поля UsrEnsFromDate значение по умолчанию. Но, при этом не срабатывает заполнение зависимого поля UsrPolisEndDate :(

При ручной смене значения в поле UsrEnsFromDate - все работает прекрасно.

Подскажите, в какую сторону копать?

Нравится

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

Добрый день коллеги! Подскажите пожалуйста, возможно есть какие то "регламентные" процедуры, которые нужно выполнить для актуализации данных о замещаемых модулях? Имеется ввиду чтобы система "увидела" функцию самого последнего замещаемого модуля.
Приведу пример: на тестовом сайте был добавлен замещаемый модуль для ActivitySectionV2, и переопределена функция, без CallPatent(), после обновления другой копии этого сайта через svn - почему то идет вызов не последней версии функции, а функции из родительской схемы(пакета Field force)
Подскажите пожалуйста, как можно это исправить. Спасибо!

Нравится

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

Влад, все зависит от условий
Одинаковые ли версии приложения на разных сайтах?
И если можно, подробнее о самом процессе, как вы вносили замещающую схему в SVN и как вы передавали ее из SVN?

Роман, да версии одинаковые. Схема передавалась стандартно, через зафиксировать пакет в хранилище/ обновить с хранилища

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

проверил в свойствах, и в sql - все данные правильные. К сожалению :smile:

может как вариант попробовать создать новый пакет, в нем создать еще один ActivitySectionV2, и в нем переопределить эту функцию? :)

Еще раз перечитал. А почему вы замещаете схему из FieldForce? Обычно замещается из NUI

Нет, у меня тоже NUI, то я имел ввиду что вызывается функция, которая была переопредена в FieldForce (isSchedulerDataView).
На сколько я понимаю, когда я пишу имя схемы в качестве родителя, то система автоматически выбирает пакет - корневой.
Эта функция изначально описана в NUI, переопределена в FieldForce, а потом в моем пакете. Но на втором сайте вызывается из схемы FieldForce, а мою не видит.

Наверное надо попробовать повторить

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

Добрый день, коллеги!

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

Нравится

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

Замещаете MainHeaderSchema и переопределяете loadProfileButtonMenu и вставляете необходимые код, который будет вызывать пользовательский метод

Спасибо большое, это именно тот модуль. Но что-то пошло не так ...

http://pixs.ru/showimage/Bezimyanni_3822167_22664458.png

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

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

"Заставный Роман" написал: Я создал замещающую страницу, скопировал код который был...

Т.е. вы вставили код из родительской схемы?

Да. Но пропали картинки, а не дублируются функции

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

define("MainHeaderSchema", [], function() {
	return {
		methods: {
			// обработчик нажатия на новый пункт меню
			myClickMethod: function() {
				window.console.log("работает");
			},
			//перегрузка родительского метода
			loadProfileButtonMenu: function() {
				//вызов родительского метода
				this.callParent();
				//пользовательская реализация
				var profileMenuCollection = this.get("ProfileMenuCollection");
				//сепаратор
				profileMenuCollection.addItem(this.Ext.create("Terrasoft.BaseViewModel", {
					values: {
						Type: "Terrasoft.MenuSeparator",
						Caption: ""
					}
				}));
				//новый пункт меню
				//используются существующие картинки и строки
				profileMenuCollection.addItem(this.Ext.create("Terrasoft.BaseViewModel", {
					values: {
						Caption: this.get("Resources.Strings.ProfileMenuItemCaption"),
						Click: {
							bindTo: "myClickMethod"
						},
						MarkerValue: this.get("Resources.Strings.ProfileMenuItemCaption"),
						ImageConfig: this.get("Resources.Images.ContactEmptyPhoto")
					}
				}));
			}
		}
	};
});

После сохранения схемы и обновления страницы приложения полцчится так, как на прикрепленной картинке

"Симута Роман Русланович" написал:

Т.е. вы вставили код из родительской схемы?


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

Пожалуйста :)

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

Добрый день коллеги!

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

Нравится

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

Добрый день.

Загрузка вложенных модулей дашборда запускается через sandbox в методе BaseDashboardViewModel.loadNestedModule() (пакет Platform).
Далее в методе BaseNestedModule.render() (пакет NUI) выполняется отрисовка каждого модуля и в конце вызывается метод представления onRender().

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

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

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

Здравствуйте! Интересует вопрос как скрыть вкладку Лента у некоторых пользователей?
Например Info(которую я сам создал) я еще могу в Мастере раздела убрать и ее не будет видеть никто, но вот с Лентой так не получается ибо ее совсем нету в Мастере раздела.

Интересует вопрос как настроить так систему, чтоби эти две вкладки перестали быть в поле видимости для группы Менеджеры. Спасибо.

Нравится

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

Добрый день!
Скрыть вкладку "Лента" на странице записи нет возможности. Пользовательскими средствами в bpm'online можно настроить доступ пользователей и групп пользователей к разделу "Лента". В этом случае пользователи группы, которой не дали права на просмотр раздела, не увидят записей ленты ни на вкладке "Лента", ни в коммуникационной панели, ни на боковой панели. Подробно о настройке прав доступа рассказано в видеоролике Академии: https://youtu.be/x5C6VcOhKj4?list=PLDp-M9ZGnvgH5uPrXsjxblaSWMmQ17Xt9

Так нет такого раздела Лента в Правах доступах на обьекти. Где именно можна изменить права для Ленти?

Это в 7.8 такое счастье, что деталь Лента не видна в мастере раздела и ее снести нельзя? В 7.7 можно было.

Доступ к сообщениям в ленте устанавливается через объект Сообщение/Комментарий.

Лента добавлена дифом в BaseModulePageV2 на уровне пакета ESN.
В той же схеме посмотрите метод:

initTabs: function() {
	if (this.entitySchemaName !== "SocialChannel") {
		var tabsCollection = this.get("TabsCollection");
		var tabsCount = tabsCollection.getCount();
		if (tabsCollection.contains("ESNTab")) {
			var esnTab = tabsCollection.get("ESNTab");
			tabsCollection.removeByKey("ESNTab");
			tabsCollection.insert(tabsCount, "ESNTab", esnTab);
		}
	}
	this.callParent(arguments);
},

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

А как сделать чтобы Лента не была первой вкладкой при входжении в карточку контакта?

В Дизайнере карточни Ленты просто нету!???

Как сделать ее последней а не первой?

Здравсвуйте! Очень нужна помощь. Не пойму как убрать Ленту из первой вкладки. Хочу чтобы первая была Демография. При сохранении в таком виде как на последнем фото, получаем результат как на первом. Как вообще эта Лента очутилась на первом месте если к ней даже нет доступа?

Я просто перетасовал на первое место в дизайнере все вкладки. Сохранил. И Лента ушла в конец. С этим разобрался.

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


Решение проблемы того, что вкладка “FEED”, или “ЛЕНТА” находится на первой позиции:
Удаляем код из замещенных схем карточок (например, ContactPageV2, AccountPageV2, … в пакете Custom)

               {
                              "operation": "move",
                              "name": "ESNTab",
                              "index": 0,
                              …
               },

В продолжении темы:
Как скрыть раздел Лента для определённых ролей пользователей:
1. в "Администрирование:Доступ к объектам" включаю "Доступ по операциям" для объектов "Сообщение/комментарий", "Канал"
2. На детали "Доступ к объектам" указанных объектов установил "х" на все права для роли Бухгалтерия.
В итоге добавить в раздел данные нельзя, но он так и отображается в меню.
Аналогичный вопрос по скрытию р. "Единое окно" и "Итоги".
По р. Итоги, если закрыть доступ для объекта Итог, то доступ будет закрыт для всех итогов во всех разделах, а раздел так и будет отображаться.
"Единое окно" продолжает отображаться после закрытия доступа на объект "Элемент очереди единого окна (представление)", и "Элемент очереди единого окна"

Это работает

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

Возможно, если окажется первой снова, поможет такое решение: Решение проблемы того, что вкладка “FEED”, или “ЛЕНТА” находится на первой позиции: Удаляем код из замещенных схем карточок (например, ContactPageV2, AccountPageV2, … в пакете Custom) { "operation": "move", "name": "ESNTab", "index": 0, … },

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

Всем добрый день!

Появилась трудность с реализацией запуска процесса "Блокировка карты" по нажатию на кнопку.
Для страницы "Карты" создал замещающую страницу BankCardPagev2. Добавил в diff создание кнопки "CardBlock", прописал метод ProcCardBlock. Создал процесс UsrCardBlock, в котором создал параметр ProcParamCardId.
Может я что забыл сделать, можете подсказать, плиз.

2) Правильно я понимаю, что для реализации запуска процесса по кнопке, сам процесс достаточно начинать с простого начального события?

P.S. Кнопка на странице появилась, при нажатии на нее выдает ошибку: "ProcessModuleUtilities is not defined"

define('BankCardPageV2', ['BankCardPageV2Resources', 'GeneralDetails'],
function(resources, GeneralDetails) {
        return {
                entitySchemaName: 'BankCard',
                details: /**SCHEMA_DETAILS*/{
        "BankAccountInBankCardDetailV2": {
                "schemaName": "BankAccountInBankCardDetailV2",
                "entitySchemaName": "BankCardBankAccount",
                "filter": {
                        "masterColumn": "Id",
                        "detailColumn": "BankCard"
                }
        }
}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
        {
                "operation": "merge",
                "name": "StartDate",
                "values": {
                        "layout": {
                                "column": 0,
                                "row": 0,
                                "colSpan": 12,
                                "rowSpan": 1
                        }
                }
        },
        {
                "operation": "merge",
                "name": "EndDate",
                "values": {
                        "layout": {
                                "column": 0,
                                "row": 1,
                                "colSpan": 12,
                                "rowSpan": 1
                        }
                }
        },
        {
                "operation": "merge",
                "name": "BankCardStatus",
                "values": {
                        "layout": {
                                "column": 12,
                                "row": 0,
                                "colSpan": 12,
                                "rowSpan": 1
                        }
                }
        },
        {
                "operation": "insert",
                "name": "UsrBlockType",
                "values": {
                        "layout": {
                                "column": 0,
                                "row": 2,
                                "colSpan": 12,
                                "rowSpan": 1
                        },
                        "bindTo": "UsrBlockType",
                        "caption": {
                                "bindTo": "Resources.Strings.BlockTypeCaption"
                        },
                        "textSize": 0,
                        "contentType": 3,
                        "labelConfig": {
                                "visible": true
                        },
                        "enabled": true
                },
                "parentName": "StatusGroupGridLayout",
                "propertyName": "items",
                "index": 3
        },
        {
                "operation": "insert",
                "name": "UsrBlockReason",
                "values": {
                        "layout": {
                                "column": 12,
                                "row": 2,
                                "colSpan": 12,
                                "rowSpan": 1
                        },
                        "bindTo": "UsrBlockReason",
                        "caption": {
                                "bindTo": "Resources.Strings.BlockReasonCaption"
                        },
                        "textSize": 0,
                        "contentType": 3,
                        "labelConfig": {
                                "visible": true
                        },
                        "enabled": true
                },
                "parentName": "StatusGroupGridLayout",
                "propertyName": "items",
                "index": 4
        },
        {
                "operation": "insert",
                //"parentName": "LeftContainer",
                "name": "NewButton",
                "values": {
                                "itemType": Terrasoft.ViewItemType.BUTTON,
                                "style": Terrasoft.controls.ButtonEnums.style.RED,
                                "caption": "CardBlock",
                                "click": {"bindTo": "ProcCardBlock"}
                }
        }
]/**SCHEMA_DIFF*/,
                attributes: {},
                methods: {
                                ProcCardBlock: function() {
                                        var activeRowId = this.get("ActiveRow");
                                        var args = {
                                                sysProcessName: "UsrCardBlock",
                                                parameters :{
                                                        ProcParamCardID: activeRowId
                                                }
                                        };
                                ProcessModuleUtilities.runProcess(args.sysProcessName, args.parameters, this);
                                }
                        },
                rules: {},
                userCode: {}
        };
});

Нравится

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

Добрый день.
Вам нужно в первых двух строчка :

define('BankCardPageV2', ['BankCardPageV2Resources', 'GeneralDetails'],
function(resources, GeneralDetails) {

дописать ProcessModuleUtilities , это примерно выглядить должно так:

define('BankCardPageV2', ['BankCardPageV2Resources', 'GeneralDetails', 'ProcessModuleUtilities '],
function(resources, GeneralDetails, ProcessModuleUtilities ) {

Роман, спасибо!
Теперь кнопка реагирует на нажатие :)
Но появляется ошибка

"При выполнении запроса возникла ошибка
статус ответа: 404 (Not Found)
url запроса: http://172.26.20.18:81/0/ServiceModel/ProcessEngineService.svc/UsrCardB…
метод: POST
данные запроса: {}"

Исходя из ошибки, предполагаю, что у меня косяк с процессом. Сейчас процесс сделал самый простой : начальное событие простое - открыть страницу редактирования - завершающее событие.
В методе ProcCardBlock объявлен параметр ProcParamCardId, такой же параметр создал в процессе и в странице редактирования передаю ID записи значение этого параметра.
Можете подсказать, что не так или чего не сделал, чтобы верно передать в процесс ID записи и он стартанул.

С уважением,
Дмитрий

В урл видно же что параметр не передался, точнее вместо айди передалось андефайнед:
?ProcParamCardID=undefined

Т.к. вы:
var activeRowId = this.get("ActiveRow");

пытаетесь получить в карточке, в карточке нет атрибута ActiveRow, если вам нужно Id записи карточки, то так и пишите

var activeRowId = this.get("Id");

Всем большое спасибо.

Процесс запустили :)

Коллеги, добрый день.

Возникли трудности с переносом кнопки в блок кнопок "Сохранить", "Отменить", "Действия".

Как я понимаю, выбор контейнера в поле "parentName" зависит от типа страницы (новая или редактируемая).
Если использовать LeftContaner, то кнопка отлично уходит в верхний левый угол на новых записях.
А если использовать CombinedModeActionButtonsCardLeftContainer то кнопка распологается снизу слева на странице как новой так и редактируемой страницы.
Можете подсказать, что нужно изменить в коде, чтобы кнопка появились слева вверху вместе с кнопками "Сохранить", "Отменить", "Действия".

"operation": "insert",
		"parentName": "CombinedModeActionButtonsCardRightContainer",
		"propertyName" :"items",
		"name": "NewButton",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"style": "red",
			"caption": {"bindTo": "Resources.Strings.CardBlockCapture"},
			"click": {"bindTo": "ProcCardBlock"},
			"layout": {
				"column": 1,
				"row": 6,
				"colSpan": 1
Показать все комментарии

Доброго времени суток.
Воникла проблема с BPMonline Service Desk. Заходя во вкладку Инструменты - Администрирование - Пользователи портала, система выдает сообщение ошибки:

В работе приложения BPMonline возникла ошибка.
Exception Message: Невозможно получить экземпляр схемы типа "Terrasoft.Configuration.SysSSPUserQSchema"
Exception Type: Terrasoft.Common.NullOrEmptyException
Exception Source: Terrasoft.Core

Нравится

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

Стандартно в конфигурации нет схемы с названием «SysSSPUserQSchema». Возможно это какая-то доработка?
Что пишет в полном тексте сообщения?
Какая у Вас используется версия системы?

Exception Stack Trace:
   at Terrasoft.Core.SchemaManager`1.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.UI.WebControls.Controls.EntityDataSource.get_Schema()
   at Terrasoft.UI.WebControls.Controls.DataSourceStructure.TryAddColumnByMetaPath(String schemaColumnMetaPath)
   at Terrasoft.WebApp.PortalUsersGridPageSchema.UpdateDataSource()
   at Terrasoft.WebApp.BaseGridPageSchema.InitializeControls()
   at Terrasoft.WebApp.PortalUsersGridPageSchema.InitializeControls()
   at Terrasoft.UI.WebControls.PageSchema.get_TopLevelControl()
   at Terrasoft.UI.WebControls.PageSchema.InitializeLocalizableValues(String resourceManagerName, String resourceGroupName)
   at Terrasoft.Core.SchemaManager`1.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.PageControl.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.Controls.Container.AfterItemAdd(Component item)
   at Terrasoft.UI.WebControls.Utilities.ItemsCollection`1.Add(T item)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.PageControl.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.Controls.Container.AfterItemInsert(Int32 position, Component item)
   at Terrasoft.UI.WebControls.Utilities.ItemsCollection`1.Insert(Int32 index, T item)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.InitScriptTaskExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ThrowEvent(ProcessExecutingContext context, String message)
   at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Application Version: 5.4.0.1315

А у Вас в разделе «Конфигурация» есть схема, называющаяся «SysSSPUserQSchema» или «SysSSPUserQ»?
Судя по коду, логика системы обращается к схеме по имени и не находит. Возможно, она не перенесена в корневую конфигурацию из другой или на основной сервер с сервера разработки.
Или где-то в коде портальной страницы допущена опечатка, вместо «SysSSPUser» написали «SysSSPUserQ».

При попытке открыть метаданные SysSSPUserQ выдало ошибку. (см. скриншоты)

Exception Message: Невозможно получить экземпляр схемы типа "Terrasoft.Configuration.SysSSPUserQSchema"
Exception Type: Terrasoft.Common.NullOrEmptyException
Exception Source: Terrasoft.Core
 
Exception Stack Trace:
   at Terrasoft.Core.SchemaManager`1.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.Core.SchemaManager`1.GetReadableSchemaMetaData(Guid schemaUId, UserConnection userConnection)
   at Terrasoft.WebApp.SolutionExplorerModule.OnViewMetaDataMenuItemClick(Object sender, AjaxEventArgs e)
   at Terrasoft.UI.WebControls.Controls.ScriptManager.RaisePostBackEvent(String eventArgument)
   at Terrasoft.UI.WebControls.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 
Form:
	submitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{"tag":""}}}
	__EVENTTARGET: ScriptManager
	__EVENTARGUMENT: ViewMetaDataMenuItem|event|Click
	__VIEWSTATEFIELDCOUNT: 13
	__VIEWSTATE0: /wEPGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYWBQ1TY3JpcHRNYW5hZ2VyBRlTeXNTY2hlbWFGb2xkZXJEYXRhU291cmNlBRNTeXNTY2hlbWFEYXRhU291cmNlBQlNYWluUGFuZWwFCUxlZnRQYW5lbAUPQWN0aW9uc1RhYlBhbmVsBQdGb.....................

Возможно, стандартную схему «SysSSPUser» кто-то пытался доработать и переименовать и сломал.
Посмотрите у неё значения «Изменено» и «Изменил».
Можно накатить схему, взятую с тестового (или наоборот, основного) сайта.
Ещё можно удалить самую свежую запись в таблице SysSchemaInSolution, где SysSchemaId равно Id этой схемы. Это вернёт предыдущую версию.

Exception Message: Элемент коллекции с идентификатором "{2BCBE4B8-FD0E-4CC6-A979-93574A377150}" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

Часто бывает и такое.

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

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

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

Добрый день, коллеги!
Подскажите пожалуйста, в версии 7.8 видел я на стартовой странице портала виджет, а на нем была кнопка "GO TO" , но по требованиям клиента, я изменил эту страницу, и потерял таким образом этот виджет. Подскажите пожалуйста кто знает, что это за модуль используется для такого виджета ?

Нравится

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