Добрый день!

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

 

Спасибо!

Нравится

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

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

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

Алексей Следь, спасибо большое!))) В 7.17 не могу её найти((( 

"Удалять записи" не помогает.

 

 

Екатерина, непонятно, почему у Вас подписи переключателей такие, а не «Блокировать удаление, если есть связанные записи в текущем объекте с этим значением» и «Удалять записи из текущего объекта с этим значением», как написано при открытии в дизайнере стандартной детали, вроде «Контрагент в группе». Там у поля связи с разделом выбрано второе значение.

На всякий случай, старая конфигурация доступна на /0/dev_old и можно включить каскадную связь там.

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

Cпасибо большое! Помогло переключение на старую конфигурацию!)

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

Как наследовать 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. См. нижний комментарий тут.

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

На объекте включено наследование прав

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

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

И подскажите, пожалуйста, как это сделать уже на текущей версии

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

Владимир, добрый день!

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

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

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

Здравствуйте, уважаемые коллеги. Возник вопрос по мобильному приложению bpm'online.
Появилась необходимость заметить метод initialize из модуля "Terrasoft.view.BaseGridPage.View".

Сталкивался ли кто-то с подобной задачей? Помогите, пожалуйста. Пробовал создавать модуль, в котором писал extend: "Terrasoft.view.BaseGridPage.View", и подключал его в манифест. Сама схема подгружается, но метод вызывается только из родительской схемы.

Нравится

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

Федоровский Роман Дмитриевич,

Тогда для этой цели используйте override:

Ext.define("Terrasoft.BaseGridPageViewOverride", {
	override: "Terrasoft.BaseGridPageView",
 
	/**
	 * @protected
	 * @overridden
	 */
	initialize: function() {
		/* Your code */
		this.callParent(arguments);
	}
 
});

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

Добрый день! Можете описать свою бизнес-задачу? Для какой цели вы хотите заменить initialize() в Terrasoft.view.BaseGridPage.View? Объясню свой вопрос: для ряда задач нет необходимости в расширении базовых классов или их замещению. Например, для изменения стилей страниц можно воспользоваться утилитным методом Terrasoft.util.writeStyles().

S.Kalishenko,

Мне нужно добавить элемент вроде QR-кода на экран, который будет на постоянной основе находиться на экране в момент открытия любого раздела в целях безопасности, для этого я в div главного окна из JS я добавляю автогенерируемый qr-код. Как применять стили страниц я понимаю.

Федоровский Роман Дмитриевич,

Тогда для этой цели используйте override:

Ext.define("Terrasoft.BaseGridPageViewOverride", {
	override: "Terrasoft.BaseGridPageView",
 
	/**
	 * @protected
	 * @overridden
	 */
	initialize: function() {
		/* Your code */
		this.callParent(arguments);
	}
 
});

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

А как сгенерировать сам QR-код, пример есть здесь.

Большое спасибо! Это решило все мои проблемы. Прошу прощения за столь длительный ответ

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

В карточке сотрудника нужно вместо поля Photo из контакта отображать другое поле.
Каким образом можно это реализовать, если в карточке сотрудника метод init() реализован таким образом:
                init: function() {
                    this.primaryImageColumnName = "ContactPhoto";
                    this.on("change:OrgStructureUnit", this.onChangedOrgStructureUnit, this);
                    this.callParent(arguments);
                },
То есть мне нужно, чтобы в моей карточке сотрудника в init были 2-я и 3-я строчки, а первая нет.
Но из-за описанной выше реализации, я не могу теперь реализовать свой код просто добавив свою логику и после вызвать родительскую.

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

Нравится

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

А если через правила сделать фото невидимым?

Григорий Чех,

Допустим, и что дальше?

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

В init

this.callParent(arguments);

this.set(this.primaryImageColumnName, null);

Григорий Чех,

Не уверенна, что так заработает, но можно попробовать.

Григорий Чех,

Хотелось бы по данному вопросу услышать комментарий службы поддержки!

Можно попробовать заместить модуль, в котором описана данная логика 
init: function() {
       this.primaryImageColumnName = "ContactPhoto";                                               this.on("change:OrgStructureUnit",this.onChangedOrgStructureUnit, this);
       this.callParent(arguments);
    }

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

Колодяжный Владислав Эдуардович,

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

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

Весь вопрос в том, что метод реализован некорректно и, если бы код в 1-й и 2-й строчке метода init был вынесен в другую функцию, то никаких бы сложностей не возникло.

Мне нужно было бы всего-то переопределить эту функцию и все.

 

но смысл тогда в базовых разделах, особенно, таком, как сотрудники.

Смысл, внезапно, в ведении информации о сотрудниках.

Весь вопрос в том, что метод реализован некорректно

Метод реализован корректно. Фото выводится.

По поводу обнуления после вызова this.callParent(arguments), то в странице SysProcessUserTaskPage есть такое обнуление:

onImageChange: function(image) {
    if (!image) {
        this.set(this.primaryImageColumnName, null);
        return;
    }

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

Зверев Александр пишет:
Смысл, внезапно, в ведении информации о сотрудниках.

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

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

Зверев Александр пишет:
Метод реализован корректно. Фото выводится.

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

Зверев Александр пишет:
Но доработанную логику нужно тестировать.

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

Я немного в шоке. Вместо пары строк кода вы развели вайн на пару страниц.

init: function(callback, scope) {
	//сначала вызовутся родительские init-методы
	this.callParent([function() {
		debugger;
		//тут можно занулить this.primaryImageColumnName
		callback.call(scope);
	}, this]);
}

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

Это всё замечательно, но вот ситуация: я захотел заместить в одной схеме ViewModel. Модули (внезапно!) с 7.13 замещать нельзя. Ну ок, делаем свой через extend. Лезем в схему, а там прямо в init зашита сторчка а-ля:
this.viewModelName = '123'; this.callParent(arguments);
Ну клёво теперь. И как в таком случае менять что-либо? (принимая во внимание, что 95% пользователей не знают о коде выше). Делать сначала callParent, а потом простановку своего viewModelName — бред. Привет асинхронность, непонятно какое присвоение выполнится первее. Таймауты/деферы - костыль. Так-то вынести всю кастомную логику из init  в отдельную функцию - правильнее будет. 

PS. Пользуясь случаем - какой гений догадался запретить перегруз модулей?

Если есть идеи по разработке собственного раздела сотрудников, улучшенного по сравнению со стандартным, можно его выпустить и продавать в маркете.

Варфоломеев Данила пишет:
Так-то вынести всю кастомную логику из init  в отдельную функцию - правильнее будет

Так вот об этом же и речь, что нужно не только реализовать "шоб работало", но и так, чтобы потом с этим другие могли работать! 

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

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

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

Обнаружил одну странность:
При создании объекта и установки параметра "Наследование"->"Родительский объект" = "Базовый объект (Base)"
дерево "Inherited columns" не содержит перечень унаследованных от родителя колонок Id, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy и ProcessListeners

Кто-нибудь сталкивался с таким? Как это можно победить?

Нравится

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

галка стоит?

Варфоломеев Данила,

етить-колотить!!! Пол дня впустую убил!!!

нет... не стоит... 

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

Добрый день!

При создании страниц редактирования для раздела (например, в Контрагентах) в Мастере раздела, созданные страницы наследуются от BaseModulePageV2 ( NUI ).
И тогда приходится дублировать всю имеющуюся функциональность.

Можно ли поменять родительский объект на AccountPageV2 ( UIv2 )? Тогда остается лишь проделать небольшие модификации, оставляя стандартные поля, детали и клиентскую логику.

Какие подводные камни можно ожидать при таком подходе?

Нравится

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

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

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

Добрый день!

Подскажите, пожалуйста, правильно ли работает функциональность наследования при использовании мастера раздела? Добавил пару колонок в контакт с помощью мастера раздела. У видел, что объект Contact в пакете Custom унаследовался не от "последнего" пакета Omnichannel, а от базового контакта.

Нравится

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

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

Наследование объектов при использовании мастера раздела работает корректно. Обратите внимание, в разделе Конфигурация - деталь Зависимости пакетов указана иерархия наследования. Пакет Custom находится внизу цепочки наследования. В целях безопасности и надежности системы базовые пакеты недоступны для изменения/добавления. Таким образов пользовательских доработки попадают в пакет Custom, который наследуется от пакетов с базовой функциональностью.

"Зарицкий Олег Васильевич" написал:Таким образов пользовательских доработки попадают в пакет Custom, который наследуется от пакетов с базовой функциональностью.

Олег, спасибо, но не очень понял:
то есть все изменения, которые компания Terrasoft разработает (в процессе перехода на 7.7, 7.8 и т.п.) в пакете Omnichannel (или любых других промежуточных) будут игнорироваться?

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

В свойствах пакета есть детали: Зависит от пакетов и Зависимые пакеты. Для пользовательского пакета Custom устанавливается иерархия таким образом, что он наследуется от базовых пакетов. Изменения/обновления базовой функциональности/пакетов вступает в силу после применения, т.е. игнорироваться не будут. Конфликты могут возникать при обновлении и только в том случае, если в пользовательском пакете есть доработки, которые изменяют/замещают базовую функциональность.

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

Добрый день!

Имеется форма, унаследованная от wnd_BaseGridArea (т.е. TemplateWindowUSI = 'wnd_BaseGridArea')

Есть такой метод:

function grdDataOnKeyDown(Control, Key, Shift) {
scr_BaseGridArea.grdDataOnKeyDown(Control, Key, Shift);
}

При вызове формы и нажатии клавиши в гриде, выдается исключение, что Self не определено.
Другие формы, сделанные по аналогии работают, правда там нет обращения к клавишам.

В чем ошибка?

Нравится

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

в событии scr_BaseGridArea.grdDataOnKeyDown(Control, Key, Shift) есть только одна функция
function DataGridKeyDown (scr_KeyboardUtils) попробуйте поставить туда ее

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