Вопрос

Здравствуйте, нужно подписаться на сообщение pushHistoryState в схеме секции. Вопрос, как это сделать? Существуют ли какие нибудь методы для обработки параметров, передаваемых в этом сообщении?

У меня такой же вопрос

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

Вот здесь расширяли и дополняли своей логикой возврат в карточку:
https://community.terrasoft.ru/questions/sobytie-obrabotcik-vozvrasenia…
Возможно аналогичным способом у вас получится реализовать и доп логику при переходе вперед.

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

Коллеги, доброе утро!

Согласно данной статье реализована функциональность - статья.

Однако, в примере используется объект раздела "Контакты" и присутствует кнопка "Добавить". В моем случае, используется объект, который является справочником и кнопки добавить нет . (пример на картинке). Подскажите, что необходимо сделать, чтобы была возможность добавить новое значение? Я так понимаю, потому что это справочник, у него нет страницы редактирования, потому система не понимает что вызывать для добавления новых значений. То есть самое простое решение, зарегистрировать его как раздел?

У меня такой же вопрос

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

Здравствуйте, для того что бы была возможность добавлять записи, для объекта должна существовать страница редактирования. Что бы не делать все манипуляции вручную в БД по регистрации и созданию такой страницы: Самый простой способ, это на основании этого объекта, создать мастером деталей деталь, и сконфигурировав на соответствующей закладке "Страница" страницу для этого объекта, после сохранения детали, в бд будет создана и зарегистрирована как схема детали, так и схема карточки, и, после перезахода на сайт, возможность добавления в справочник из карточки будет доступной. Не забудьте почистить кеш браузера.

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

Подскажите как создать модальное окно с двумя полями типа "Дата", пробовал делать по шаблону во вложении получаю ошибку:

ConfigurationBootstrap.js:21948 Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined
    at i.<anonymous> (ConfigurationBootstrap.js:21948)
    at all-combined.js:477
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.<anonymous> (require.js:1136)
    at require.js:134
    at require.js:1186
    at each (require.js:59)
    at Module.emit (require.js:1185)
    at Module.check (require.js:936)
(anonymous) @ ConfigurationBootstrap.js:21948
(anonymous) @ all-combined.js:477
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
callGetModule @ require.js:1200
completeLoad @ require.js:1608
onScriptLoad @ require.js:1714
core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:82/0/Nui/ViewModule.aspx
 line: 3
 column: 1
 message: Uncaught SyntaxError: Unexpected token < 
 date: Thu Sep 07 2017 13:02:25 GMT+0300 (RTZ 2 (зима))
 stack: SyntaxError: Unexpected token <
writeErrorMessage @ core.js:579
(anonymous) @ core.js:740
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
(anonymous) @ require.js:1812
localRequire @ require.js:1446
errorHandler @ core.js:716
core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:82/0/configuration/04a28bb938a0652641f26936a1b20234/Co…
 line: 21948
 column: 57
 message: Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined 
 date: Thu Sep 07 2017 13:02:25 GMT+0300 (RTZ 2 (зима))
 stack: TypeError: Cannot read property 'entitySchemaName' of undefined
    at i.<anonymous> (http://localhost:82/0/configuration/04a28bb938a0652641f26936a1b20234/Co…)
    at http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…
    at Object.execCb (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)
    at Module.check (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)
    at Module.<anonymous> (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)
    at http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…
    at http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…
    at each (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)
    at Module.emit (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)
    at Module.check (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)
writeErrorMessage @ core.js:579
(anonymous) @ core.js:740
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
(anonymous) @ require.js:1812
localRequire @ require.js:1446
errorHandler @ core.js:716

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

У меня такой же вопрос

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

Создаю модальное окно по примеру(документ во вложении), в итоге окно открывается, но пусто и с ошибками в консоли:

core.js:321 Uncaught TypeError: Cannot read property 'css' of null
    at constructor.loadModule (core.js:321)
    at constructor.injectedSandbox.loadModule (core.js:557)
    at i.loadMyModal (ITRoute1Page.js:200)
    at i.onMyClick (ITRoute1Page.js:208)
    at i.onCardAction (SectionBundleModule.js:25266)
    at i.callModelMethod (all-combined.js:532)
    at i.<anonymous> (all-combined.js:527)
    at i.fire (all-combined.js:1)
    at i.continueFireEvent (all-combined.js:1)
    at i.fireEventArgs (all-combined.js:1)
loadModule @ core.js:321
injectedSandbox.loadModule @ core.js:557
loadMyModal @ ITRoute1Page.js:200
onMyClick @ ITRoute1Page.js:208
onCardAction @ SectionBundleModule.js:25266
callModelMethod @ all-combined.js:532
(anonymous) @ all-combined.js:527
fire @ all-combined.js:1
continueFireEvent @ all-combined.js:1
fireEventArgs @ all-combined.js:1
fireEvent @ all-combined.js:1
onClick @ all-combined.js:1464
(anonymous) @ VM1476:6
k @ all-combined.js:1
core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:82/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd…?
 line: 321
 column: 23
 message: Uncaught TypeError: Cannot read property 'css' of null 
 date: Wed Sep 06 2017 18:53:08 GMT+0300 (RTZ 2 (зима))
 stack: TypeError: Cannot read property 'css' of null
    at constructor.loadModule (http://localhost:82/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd…)
    at constructor.injectedSandbox.loadModule (http://localhost:82/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd…)
    at i.loadMyModal (http://localhost:82/0/configuration/bd4295bf69df92756a9874ef03769838ru-…)
    at i.onMyClick (http://localhost:82/0/configuration/bd4295bf69df92756a9874ef03769838ru-…)
    at i.onCardAction (http://localhost:82/0/configuration/7780bccaa707bb5d986ffb3da67b6f6b/Se…)
    at i.callModelMethod (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)
    at i.<anonymous> (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)
    at i.fire (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)
    at i.continueFireEvent (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)
    at i.fireEventArgs (http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…)

 

В чем может быть проблема?

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

У меня такой же вопрос

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

Здравствуйте, напишите в поддержку с предоставлением доступа к сайту, инструкцию проверили, работает.

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

Нужно скрыть кнопку Добавить в окне выбора определенного справочника. Прошу помочь как это сделать.

У меня такой же вопрос

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

Добрый день. Рекомендуем реализовать данный кейс немного иначе, а именно - раздать на объект справочника необходимые права доступа. 

Кот Владимир Владимирович пишет:
Рекомендуем реализовать данный кейс немного иначе, а именно

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

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

Здравствуйте, Коллеги! 
На страничке редактирования детали есть справочное поле Контрагент, мне нужно чтобы при нажатии на кнопку "Добавить" - открывалась страничка создания нового контрагента, у которого будет проставлен в поле "Тип" - Конкурент, и чтобы это поле было нередактируемым.
Логика этой кнопки прописана в модуле - LookupPageViewModelGenerator. Всё вроде бы понятно, заместить этот модуль и передавать сообщение в карточку контрагента. Но проблема в том, что любая попытка замещения этого модуля влечет за собой последствия, показанные во вложенном скрине, проблема наблюдается во всех справочниках. Коллега подсказал, что такого рода модули навряд ли получится нормально заместить, но если это так, то как тогда решить мою задачу? Надеюсь на вашу помощь :)

У меня такой же вопрос

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

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

define("CustomLookupPage", ["LookupPage", "LookupPageViewGenerator", "LookupPageViewModelGenerator",
"ProcessModuleUtilities", "LookupUtilities", "css!LookupPageCSS"],
	function(LookupPage, LookupPageViewGenerator, LookupPageViewModelGenerator, ProcessModuleUtilities) {
		return Ext.define("Terrasoft.configuration.CustomLookupPage", {
			alternateClassName: "Terrasoft.KmGMSLookupPage",
			extend: "Terrasoft.LookupPage",
			gridWrapClasses: ["custom-lookup-control"]
		})
	}
)

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

generateViewModel

и

renderLookupView

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

н/п переименуем кнопки, кое что скроем, подменим обработчик.

//Переопределяем метод в котором мы можем управлять сформированной конфигурацией до рендеринга.
renderLookupView: function(schema, profile) {
	var config = this.getLookupConfig(schema, profile);
	var topPanelConfig = LookupPageViewGenerator.generateFixed(config);
	//----------------------- инъекция логики (начало) ----------------------
	var buttonsConfig;
	//Получаем ссылку на аттрибут-массив конфигурационных объектов-кнопок
	//Используем Underscore.some с возможностью прерывания переборы по возврату от предиката "true"
	_.some(topPanelConfig.items, function(target) {
		//выделяем объект группы кнопок (Wrapper) по id контейнера
		if (target.id === "selectionControlsContainerLookupPage") {
			//в нем ищем подчиненные объекты являющиеся массивом
			_.some(target, function(target) {
					//согласно структуры конфигурационного объекта панели
					//"чистым" массивом является только объект с конфигами кнопок
				if (Array.isArray(target)) {
					//сохраняем ссылку на него в переменной для дальнейшего использования
					buttonsConfig = target;
					//Прерываем перебор
					return true;
				}
			});
			//Прерываем перебор
			return true;
		}
	});
	//Поиск конфигурационного объекта кнопки "Выбрать" в искомом массиве по caption
	_.some(buttonsConfig, function(target) {
		if (target.caption === "Выбрать") {
			//В найденном объекте меняем значение аттрибута caption на "Создать тендеры".
			target.caption = "Создать тендеры";
			return true;
		}
	});
	//Поиск конфигурационного объекта кнопки "Добавить" в искомом массиве по caption
	_.some(buttonsConfig, function(target) {
		if (target.caption === "Добавить") {
			//В найденном объекте меняем значение аттрибута caption на "Создать тендеры".
			target.caption = "Создать запрос";
			//Удаляем тег стандартного действия "Создать запись" (add)
			//исключая навешивания стандартного обработчика в viewmodel генераторе 
			delete target.tag;
			//Устанавливаем совой обработчик
			target.click = {
				bindTo: "AddRequestButton"
			};
			return true;
		}
	});
	//Поиск конфигурационного объекта кнопки "Добавить" в искомом массиве по caption
	_.some(buttonsConfig, function(target) {
		if (target.caption === "Действия") {
			//В найденном объекте меняем значение аттрибута visible на "false"
			//тем самым скрывая кнопку-меню
			target.visible = false;
			return true;
		}
	});
	//----------------------- инъекция логики (конец) ----------------------
	this.renderLookupControls(config, topPanelConfig);
}

view будет выполнять в другом контексте и чтобы расширить его своим методом:

//Переопределяем метод в котором мы можем расширить viewModelConfig собственным методом.
generateViewModel: function() {
	var viewModelConfig = LookupPageViewModelGenerator.generate(this.lookupInfo);
	if (!this.lookupInfo.columnValue && this.lookupInfo.searchValue) {
		viewModelConfig.values.searchData = this.lookupInfo.searchValue;
		viewModelConfig.values.previousSearchData = this.lookupInfo.searchValue;
	}
	//----------------------- инъекция логики (начало) ----------------------
	//Добавляем свой пользовательский метод
	viewModelConfig.methods.AddRequestButton = function() {
		//Проброшенный через конфиг страницы Id связанного Проекта
		var associatedProjectId = this.values.LookupInfo.associatedProjectId;
		//Вызываем БП
		var args = {
			sysProcessName: "CreateNewRequestFromProject",
			parameters: {
				ProjectId: associatedProjectId
			}
		};
		ProcessModuleUtilities.executeProcess(args);
		this.close();
	};
	//----------------------- инъекция логики (конец) ----------------------
	var viewModel = this.Ext.create("Terrasoft.BaseViewModel", viewModelConfig);
	viewModel.Ext = this.Ext;
	viewModel.sandbox = this.sandbox;
	viewModel.Terrasoft = this.Terrasoft;
	if (this.lookupInfo.updateViewModel) {
		this.lookupInfo.updateViewModel.call(viewModel);
	}
	viewModel.initCaptionLookup();
	viewModel.initHasActions();
	viewModel.initLoadedColumns();
	if (!this.Ext.isEmpty(this.lookupInfo.filterObjectPath)) {
		viewModel.updateFilterByFilterObjectPath(this.lookupInfo.filters, this.lookupInfo.filterObjectPath);
	}
	if (this.lookupInfo.hideActions) {
		viewModel.set("hasActions", false);
	}
	return viewModel;
}

 

Далее чтобы вызвать свое кастомизированное окно справочника используйте метод openLookup

//конфигурационный объект для кастомного окна справочника
var config = {
	entitySchemaName: "Lead",
	columns: ["Id"],
	associatedProjectId: this.get("Id"),
	multiSelect: true,
	filters: filterGroup,
	actionsButtonVisible: true,
    //указываем нашу кастомизированную схему
	lookupPageName: "CustomLookupPage"
};
this.openLookup(
	config,
	function(selected) {
       //callback обрабатывающий результаты выбора
	},
	this
);

 

PS: не пробовал но должно прокатить и через lookpListConfig для какого ни будь справочного поля в теории там lookpListConfig и превращается в config для openLookup :)

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

Спасибо, Коллеги! Как руки доберутся до этой задачи, дам знать получилось ли:)

Мотков Илья,

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

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

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

Есть конструкция:

select * from UsrDocument
INNER JOIN UsrDocumentPackage on UsrDocument.UsrPackageCPId=UsrDocumentPackage.UsrCPId
where UsrDocumentPackage.UsrCodeId = 'e06c50cb-ac4c-41ce-9493-033e4b54ea14'

которую нужно вынести в filterGroup.

filterGroup.add(
                "UsrPackageFilterLogistics",
                Terrasoft.createColumnFilterWithParameter(
                Terrasoft.ComparisonType.EQUAL,
                "UsrDocumentPackage.UsrCode",
                "00e6efc8-cc7e-4ac7-af41-6310bb5110e8"));

не работает, как это правильно сделать?

 

 

У меня такой же вопрос

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

Вам необходимо использовать синтаксис ESQ-запроса во втором аргументе, для присоединения таблицы, см. https://academy.terrasoft.ru/sites/default/files/documents/docs/technic/SDK/7.9.0/BPMonline_development_guide.pdf

стр. 389 - 391
А лучше прямо с 371-ой страницы.
В Вашем случае строка ESQ запроса повторяющая ваш SQL-заспрос будет выглядеть так (Учитывая что текущая схема UsrDocument, а это может быть не так):
 

[UsrDocumentPackage:UsrCP:UsrPackageCP].UsrCode

суффиксы "Id" для справочных полей опускаются (вы запрашиваете поля объектов конфигурации а не колонки из БД, на это необходимо обращать внимание, т.е если в объекте у Вас поле называется "UsrCP" именно так вы и должны его использовать в запросах ESQ, в то время как в в БД(если поле справочное) оно будет именоваться  "UsrCPId")
В конечном варианте Ваш фильтр будет выглядеть вот так

filterGroup.add(
  "UsrPackageFilterLogistics",
   Terrasoft.createColumnFilterWithParameter(
      Terrasoft.ComparisonType.EQUAL,
      "[UsrDocumentPackage:UsrCP:UsrPackageCP].UsrCode",
      "00e6efc8-cc7e-4ac7-af41-6310bb5110e8"
   )
);

 

Севостьянов Илья Сергеевич,

Большое спасибо за пояснения, всё получилось.

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

Коллеги, добрый день.
Подскажите возможен ли экспорт реестра данных в формат xls и/или xlsx.

У меня такой же вопрос

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

Здравствуйте, Евгений!

В текущей реализации приложения экспорт возможен только в формат *.csv, но реализация экспорта в *.xlsx запланирована на версию 7.12.

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

Коллеги, здравствуйте!

Возможно ли закрытие всех полей карточки для пользователя (не создателя) для изменения?

Речь идет о невозможности в том числе изменения данных до сохранения.

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

Хотелось бы для такого пользователя в принципе закрыть доступ на поля (сделать их неактивными, например, повесить "замок").

Возможно ли подобное в стандартном функционале?

Заранее спасибо!

 

У меня такой же вопрос

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

Здравствуйте, Эрнст!

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

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

 

можно использовать вот такой "трюк"

Ext.ComponentMgr.all.each(function(c){
	var cmp = Ext.ComponentMgr.all.map[c];
	if(cmp.className){
		if(cmp.className.indexOf("Edit") !== -1){
			if(cmp.setEnabled){
				cmp.setEnabled(false);
			}
		}
	}
})

выполнение этого кода, сделает все поля карточки недоступными (замок)

можете разместить его например в onEntityInitialized методе схемы

но для какого пользователя выполнять, а для какого нет - это так же задача логики, BPM не предоставляет какой-либо штатной логики для работы с такой информацией в карточках схем, но если плоскость определения кому доступно а кому нет, лежит например в ракурсе, является ли текущий пользователь, пользователем установленным в поле Owner (или другом справочном поле ссылающимся на контакт) то это не составляет труда, если же этот же вопрос рассматривать в ракурсе, является ли текущий пользователь членом какой либо функциональной роли или организационного юнита, то Вам помогут вот эти утилиты  https://community.terrasoft.ru/questions/userutilsmixin-utility-dla-raboty-s-informaciei-o-organizacionnyh-edinicah-roliunity

(только обратите внимание на комментарии в теме)

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

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

Доброе утро!

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

Используя эту функцию this.addItemsToGridData(datagrid), получаю ошибку:

Uncaught TypeError: a.on is not a function
    at i.subscribeItemEvent (all-combined.js:712)
    at i.onCollectionAdd (all-combined.js:713)
    at i.fire (all-combined.js:1)
    at i.continueFireEvent (all-combined.js:1)
    at i.fireEventArgs (all-combined.js:1)
    at i.fireEvent (all-combined.js:1)
    at i.doInsert (all-combined.js:1)
    at insert (all-combined.js:1)
    at i.add (all-combined.js:1)
    at i.<anonymous> (all-combined.js:680)

PS:

если не сложно, скиньте где про это более подробно прочитать можно.

У меня такой же вопрос

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

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

Войдите или зарегистрируйтесь, чтобы комментировать