Готовлюсь к переносу пакета через SVN и смущает один момент.

У меня созданы новые детали. Пусть сами схемы он перенесет, а вот записи таблиц SysDetail (по 1 на деталь), SysSchema, возможно какие-то другие - что с ними будет?

Ведь без этих записей система нормально работать не будет?!

Нравится

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

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

 

Для переноса содержимого некоторых таблиц используется механизм привязки данных к пакету - https://academy.terrasoft.ru/documents/technic-sdkmp/7-11/privyazka-dan…

 

Для упрощения привязки можно воспользоваться бесплатным дополнением с Marketplace - https://marketplace.terrasoft.ru/app/data-binding-tool

Привет!

А детали создавались мастером? Если да, то почти все привязки автоматом создаются в пакете Custom. Все, что надо сделать - "повторить" эти привязки в своем пакете.

Например, может быть создана привязка следующего вида "SysDetail_DetailManager_d95ebba0c04a454fad3bbb45962eef2d" по объекту SysDetail.

В этом случае надо действовать примерно по следующему плану:

1. открыть привязку и внимательно на нее взглянуть (можно для надежности сделать скриншот)

2. удалить привязку из пакета Custom (иначе не даст система привязать те же самые данные к другому пакету)

3. выбрать свой пакет и создать привязку по нужному объекту (в данном примере SysDetail, который в выпадашке объектов называется Details lookup)

4. обязательно выбрать тип установки как Installation

5. обязательно отфильтровать по Id. Этот идентификатор есть в названии привязки, но его надо привести к правильному виду GUID. Например, d95ebba0c04a454fad3bbb45962eef2d должен превратиться в d95ebba0-c04a-454f-ad3b-bb45962eef2d

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

7. сохранить и вкоммитить

 

P.S. Я не знаю, как работает утилита выше, которую посоветовал Павел, но подозреваю, что уже созданные привязки в других пакетах эта утилита не удаляет и их надо будет зачищать вручную.

 

Кстати, надо еще не забыть привязать настройку колонок детали... в описании утилиты сказано, что она позволяет привязывать к пакету настройку колонок по секциям, и ничего не сказано про детали. Если настройка колонок не задана в явном виде в секции diff cхемы детали и настройка колонок делалась через интерфейс, то надо будет привязывать еще и профиль отображения. Это объект SysProfileData (в выпадашке User profile) с фильтрацией по содержимому поля Key. Это поле должно содержать название детали или секции и, возможно еще содержать текст "GridSettings". Также, если не задан контакт у записи, то это отображение для всех - т.е. дефолтное отображение, если пользователь себе ничего не настраивал.

Максим Цынгаев,

не понял про SysProfileData. Как сделать эту привязку?

Алексей-Карягин,

Давай на примере покажу.

Есть собственная секция OpportunityPaymentsSection. Я настроил отображение колонок и сохранил, причем сохранял как для Supervisor, так и для All. Чтобы привязать это отображение к пакету, я создал привязку на вкладке Data по объекту User profile (SysProfileData - это так называется объект в БД и есть соответствующая таблица) и отфильтровал по двум критериям:

1. Key содержит название схемы секции

2. Contact не заполнен (т.е. в базе NULL)

Вот так это выглядит в интерфейсе:

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

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

Подскажите, пожалуйста. 

У контакта две почты: личная и корпоративная. Он хочет получать рассылки и на одну и на вторую. Возможно ли это или единственный вариант - это создание двух карточек контакта с указанием разных почтовых адресов? 

Заранее спасибо за ответ! 

 

С Уважнием,

Надежда

Нравится

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

Добрый день!



Фактически ведь это два контакта с разными почтами. 

Вероятнее всего, решение в этой ситуации - как раз создавать два контакта с разной почтой.

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

Добрый день!!!

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

Например: Изображение удалено.

нужно чтобы "релиз" и действия над ним не отображались 

Нравится

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

Здравствуйте, Михаил!

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

Command

CommandParams

AdditionalParam

MainParam

На которые и завязан функционал командной строки.

Также обращаю Ваше внимание что с версии 7.10.0 в приложении появился глобальный поиск https://academy.terrasoft.ru/documents/bpmonline-release-notes-7-10-0#T…, который полностью замещает функционал командной строки и одновременное использование этих 2х блоков функционала не возможно.

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

Добрый день!

 

Необходимо скрыть кнопку добавить с детали (https://db.tt/ecrKWQAcZv) на странице Юр. лица, в зависимости от определенных условий (например от типа Физ. лица текущего пользователя). Подскажите, пожалуйста, каким образом это можно реализовать?

Нравится

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

 код кнопки из baseGridDetail:

{
	"operation": "insert",
	"name": "AddRecordButton",
	"parentName": "Detail",
	"propertyName": "tools",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"click": {"bindTo": "addRecord"},
		"visible": {"bindTo": "getAddRecordButtonVisible"},
		"enabled": {"bindTo": "getAddRecordButtonEnabled"},
		"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		"imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}
	}
},

Вариантов 2: либо замерджить и написать свой bindTo для св-ва visible, либо заместить метод getAddRecordButtonVisible

Данила, перед тем как создать тему мы испробовали данный метод и получили следующий результат - при переопределении метода getAddRecordButtonVisible и указании "return false" то кнопка остается доступна на детали, а если пишем "return true", то добавляется новая кнопка добавления (и их становится две). Есть ли другие способы? возможно это из старых версий?

А мёрдж использовать не получится т.к. у нас динамическое условие.

Сергей Фролов КРОК пишет:

а если пишем "return true", то добавляется новая кнопка добавления (и их становится две).

Судя по всему у вас 2 кнопки. стандартная скрыта, у второй какой-то свой бинд на visible. Надо в схеме ковыряться смотреть на что видимость кнопки установлена. 

Если вдруг кому-нибудь понадобиться, то:

В системе, для деталей есть две кнопки добавления - AddRecordButton и AddTypedRecordButton.

AddRecordButton - отображается, если у детали одна карточка редактирования, AddTypedRecordButton - если несколько страниц редактирования.



За отображение первой кнопки отвечает метод getAddRecordButtonVisible, второй - getAddTypedRecordButtonVisible. Оба метода возвращают булевое значение.

Вот рабочий пример, пользуйтесь) 

Все лишнее убрано

define("UsrControlEquipmentDetail", [], function() {

    return {

        entitySchemaName: "UsrControlEquipment",

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        diff: /**SCHEMA_DIFF*/[

            {

                "operation": "remove",

                "name": "ToolsButton"

            },

            {

                "operation": "remove",

                "name": "CardDetail"

            },

            {

                "operation": "remove",

                "name": "AddRecordButton"

            },

            {

                "operation": "remove",

                "name": "ViewButton"

            }

        ]/**SCHEMA_DIFF*/,

        methods: {

            getAddRecordButtonVisible: function() {

                return false;

            },

            getAddTypedRecordButtonVisible: function() {

                return false;

            },

            addRecordOperationsMenuItems: Terrasoft.emptyFn

        }

    };

});

Литвинко Павел,

 не работает. + не убрался

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

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

Нравится

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

Вот здесь расширяли и дополняли своей логикой возврат в карточку:

https://community.terrasoft.ru/questions/sobytie-obrabotcik-vozvrasenia…

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

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

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

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

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

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

Нравится

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

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

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

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

ConfigurationBootstrap.js:21948 Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined

    at i. (ConfigurationBootstrap.js:21948)

    at all-combined.js:477

    at Object.execCb (require.js:1693)

    at Module.check (require.js:881)

    at Module. (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. (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. (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. (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. (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 &amp;&amp; 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. Необходимо добавить в замещающий модуль её вручную.

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

Мотков Илья,

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

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