Добрый день.

Не запускается процесс "Загрузить письма из Exchange". Доступ к почтовому ящику предоставлен, рассылка писем с изменением статуса происходит, но регистрация новых сообщений нет.

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

Через командную строку так же не получается его запустить, т.к. его там нет.

Нравится

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

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

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

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

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

...
where isActive = 0
...

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

 

Спасибо!

Нравится

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

Сериков Асхат Кайратович,

Если требуется, чтобы записи загружались изначально и фильтр нельзя было отрубить, то в схеме секции:

//можно ещё использовать функцию getFilters
initQueryFilters: function(esq) {
	var filters = this.callParent(arguments);
	//добавляем свои фильтры
	return filters;
}

 

Фильтр?

 

Алексей-Карягин пишет:

Фильтр?

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

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

Сериков Асхат Кайратович,

Если требуется, чтобы записи загружались изначально и фильтр нельзя было отрубить, то в схеме секции:

//можно ещё использовать функцию getFilters
initQueryFilters: function(esq) {
	var filters = this.callParent(arguments);
	//добавляем свои фильтры
	return filters;
}

 

Сериков Асхат Кайратович пишет:

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

Нет, фильтры работают не так. По условиям фильтрации класс EntitySchemaQuery формирует SQL-запрос, который и идёт от сайта в базу. А уже по нему из базы возвращается коллекция записей-результатов.

Если сразу выгружаются все записи, а потом второй раз идёт запрос в базу уже с фильтром, то это что-то напутано в JS-логике этой страницы раздела. Можно развернуть демку и проверить аналогичные шаги на ней. Если там сразу фильтрует, то нужно смотреть доработки раздела.

 

Сериков Асхат Кайратович,

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

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

Добрый день,

Возможно ли отфильтровать справочное поле внутри модального окна? Я попробовал обычным путем через атрибуты, но это не сработало, бпм даже не зашла в реализацию "lookupListConfig". В справочнике просто отображались абсолютно все значения

 

После решил попробовать заполнить справочник вручную нужными значениями

//attributes
"RIBDocType": {
    "dataValueType": Terrasoft.DataValueType.ENUM,
    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    "caption": "RIBDocType"
},
"documentTypeList": {
    "dataValueType": Terrasoft.DataValueType.ENUM,
    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    "isCollection": true
}
 
//diff
{
	"operation": "insert",
	"parentName": "Header1",
	"propertyName": "items",
	"name": "RIBDocType",
	"values": {
		"bindTo": "RIBDocType",
		"caption": "Тип документа",
		"classes": {"wrapperClass": ["base-edit"]},
		"layout": {"column": 0, "row": 3, "colSpan": 24},
		"textSize": "Default",
		"contentType": Terrasoft.ContentType.ENUM,
		"labelConfig": {
			"visible": true
		},
		"controlConfig": {
			"className": "Terrasoft.ComboBoxEdit",
			"list": {
				"bindTo": "documentTypeList"
			},
			"change": {
				"bindTo": "onMyValueChange"
			},
			"prepareList": {
				"bindTo": "prepareDocumentTypeList"
			}
		}
	},
	"index": 3
}
 
//methods
 
onRender: function() {
	if (!this.get("documentTypeList")) {
		this.set("documentTypeList", this.Ext.create("Terrasoft.Collection"));
	}
 
},
 
prepareDocumentTypeList: function(filter, list) {
	if (list === null) {
		return;
	}
	list.clear();
	var columns = {};
	var value1 = {
		displayValue: "Type1",
		value: "e8670398-603b-43ca-820d-03e5b03fc275"
	};
	var value2 = {
		displayValue: "Type2",
		value: "14fcef3a-7d9e-4737-810f-52d57db3673a"
	};
	var value3 = {
		displayValue: "Type3",
		value: "672606f8-da25-40bd-a4ef-95c958331743"
	};
	columns[1] = value1;
	columns[2] = value2;
	columns[3] = value3;
	list.loadAll(columns);
	console.log(list);
},
 
onMyValueChange: function(val) {
	if (val && val.displayValue) {
		console.log("you pick: ", val.displayValue);
	}
},

Однако таким образом данные не отображаются в выборке совсем, просто пустой справочник.

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

 

Нравится

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

Сериков Асхат Кайратович,

Вот, например, код страницы с проекта. Если в attributes добавить lookupListConfig для поля Contact, всё подтянется

/*jshint ignore: start*/
define("UsrSchema", [],
	function() {
		return {
			mixins: {},
			messages: {},
			attributes: {},
			details: {},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "mainBoxContainer",
					"values": {
						"id": "mainBoxContainer",
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"items": []
					}
				},
				{
					"operation": "insert",
					"name": "mainBoxContainerGrid",
					"parentName": "mainBoxContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
						"items": []
					}
				},
				{
					"operation": "insert",
					"parentName": "mainBoxContainerGrid",
					"propertyName": "items",
					"name": "Contact",
					"values": {
						"bindTo": "Contact",
						"caption": "Контакт",
						"contentType": Terrasoft.ContentType.ENUM,
						"layout": {
							"column": 0,
							"row": 0,
							"colSpan": 24
						}
					},
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				init: function() {
					this.callParent(arguments);
				},
 
				getLookupQuery: function(filter, column) {
					var esq = this.callParent(arguments);
					var lookupListConfig = this.getLookupListConfig(column);
					if (lookupListConfig) {
						this.Terrasoft.each(lookupListConfig.columns, function(column) {
							if (!esq.columns.contains(column)) {
								esq.addColumn(column);
							}
						}, this);
					}
 
					var schemaColumn = this.getColumnByName(column);
					if (schemaColumn.lookupListConfig && schemaColumn.lookupListConfig.filter) {
						esq.filters.addItem(schemaColumn.lookupListConfig.filter());
					}
 
					return esq;
				},
				getLookupListConfig: function(columnName) {
					var schemaColumn = this.getColumnByName(columnName);
					if (!schemaColumn) {
						return null;
					}
					var lookupListConfig = schemaColumn.lookupListConfig;
					if (!lookupListConfig) {
						return null;
					}
					var excludedProperty = ["filters", "filter"];
					var config = {};
					this.Terrasoft.each(lookupListConfig, function(property, propertyName) {
						if (excludedProperty.indexOf(propertyName) === -1) {
							config[propertyName] = property;
						}
					});
					return config;
				}
			}
		};
	});
/*jshint ignore: end*/

 

1) Я бы попробовал 

columns[value1.value] = value1;
columns[value2.value] = value2;
columns[value3.value] = value3;

+ в каждом объекте продублировал 

var value1 = {
	displayValue: "Type1",
        name: "Type1",
	value: "e8670398-603b-43ca-820d-03e5b03fc275"
};

чисто на всякий случай

2) Если это своё модальное окно, не унаследованное от basePage, то придётся копировать логику из getLookupQuery (BasePageV2). Там как раз таки и идёт перебор аттрибутов на фильтры, доп колонки и т.п.

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

Спасибо, да не наследованное, пойду пробовать 

Сериков Асхат Кайратович,

Вот, например, код страницы с проекта. Если в attributes добавить lookupListConfig для поля Contact, всё подтянется

/*jshint ignore: start*/
define("UsrSchema", [],
	function() {
		return {
			mixins: {},
			messages: {},
			attributes: {},
			details: {},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "mainBoxContainer",
					"values": {
						"id": "mainBoxContainer",
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"items": []
					}
				},
				{
					"operation": "insert",
					"name": "mainBoxContainerGrid",
					"parentName": "mainBoxContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
						"items": []
					}
				},
				{
					"operation": "insert",
					"parentName": "mainBoxContainerGrid",
					"propertyName": "items",
					"name": "Contact",
					"values": {
						"bindTo": "Contact",
						"caption": "Контакт",
						"contentType": Terrasoft.ContentType.ENUM,
						"layout": {
							"column": 0,
							"row": 0,
							"colSpan": 24
						}
					},
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				init: function() {
					this.callParent(arguments);
				},
 
				getLookupQuery: function(filter, column) {
					var esq = this.callParent(arguments);
					var lookupListConfig = this.getLookupListConfig(column);
					if (lookupListConfig) {
						this.Terrasoft.each(lookupListConfig.columns, function(column) {
							if (!esq.columns.contains(column)) {
								esq.addColumn(column);
							}
						}, this);
					}
 
					var schemaColumn = this.getColumnByName(column);
					if (schemaColumn.lookupListConfig && schemaColumn.lookupListConfig.filter) {
						esq.filters.addItem(schemaColumn.lookupListConfig.filter());
					}
 
					return esq;
				},
				getLookupListConfig: function(columnName) {
					var schemaColumn = this.getColumnByName(columnName);
					if (!schemaColumn) {
						return null;
					}
					var lookupListConfig = schemaColumn.lookupListConfig;
					if (!lookupListConfig) {
						return null;
					}
					var excludedProperty = ["filters", "filter"];
					var config = {};
					this.Terrasoft.each(lookupListConfig, function(property, propertyName) {
						if (excludedProperty.indexOf(propertyName) === -1) {
							config[propertyName] = property;
						}
					});
					return config;
				}
			}
		};
	});
/*jshint ignore: end*/

 

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

Спасибо

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

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

this.showBodyMask()

поверх модульного окна, или справочника?

Нравится

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

По идее можно прокинуть config в функцию, а в конфиге указать селектор.

Подробнее посмотрите тут, в функции show.

Небольшой оффтоп: Там в функции createMask можно накидать и caption для маски, и прозрачность менять, и бэкграунд... Почему это нигде не задокументировано - ума не приложу. Наиполезнейшая вещь иногда.

По идее можно прокинуть config в функцию, а в конфиге указать селектор.

Подробнее посмотрите тут, в функции show.

Небольшой оффтоп: Там в функции createMask можно накидать и caption для маски, и прозрачность менять, и бэкграунд... Почему это нигде не задокументировано - ума не приложу. Наиполезнейшая вещь иногда.

Варфоломеев Данила, Спасибо, полезная штука. Я уже через css  реализовал выглядит конечно не самым лучшим способом, рад что есть еще и оригинальный метод

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

Добрый день, 

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

У меня по нажатию кнопки вызывается модальное окно

var sandbox = this.sandbox;
var config = {
    heightPixels: 550,
    widthPixels: 950
};
var moduleName = "UsrMyModalModule";
var moduleId = sandbox.id + "_" + moduleName;
var renderTo = ModalBox.show(config, function() {
    sandbox.unloadModule(moduleId, renderTo);
});
sandbox.loadModule(moduleName, {
    id: moduleId,
    renderTo: renderTo
});

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

на выходе получается так:

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

на странице окна добавлял обычным средством:

 

{
	"operation": "insert",
	"name": "HeaderContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"items": []
	}
},
{
	"operation": "insert",
	"parentName": "HeaderContainer",
	"propertyName": "items",
	"name": "Header",
	"values": {
		"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
		"items": []
	}
},
{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "TestText",
	"values": {
		"bindTo": "TestText",
		"caption": "Test text",
		"layout": {"column": 0, "row": 0, "colSpan": 10}
	}
},
{
	"operation": "insert",
	"parentName": "Header",
	"name": "CloseButton",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"style": Terrasoft.controls.ButtonEnums.style.BLUE,
		"click": {bindTo: "onCloseButtonClick"},
		"markerValue": "CloseButton",
		"caption": "OK",
		"layout": { "column": 0, "row": 1, "colSpan": 3 }
	}
}

 

Нравится

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

Открываете модуль UsrMyModalModule, в нём на вкладке Less прописываете стили для элементов.

В странице в define, в перечислении подгружаемых модулей добавляете "css!UsrMyModalModule"

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

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

 

Сериков Асхат Кайратович пишет:

а можно как нибудь грид сетку из страниц редактирования взять?

 Так вы же её уже добавили)

{
	"operation": "insert",
	"parentName": "HeaderContainer",
	"propertyName": "items",
	"name": "Header",
	"values": {
		"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
		"items": []
	}
},

 

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

Добавить добавил, но как видите на картинке, сами поля скукожены, хотя width в процентном соотношении выставляется верно.

Проблема решается если унаследовать от Базовой схемы карточки, но тогда ругается на getCardInfo message, что нет такого сообщения

Сериков Асхат Кайратович пишет:

сами поля скукожены,

 Тогда вам нужно прописать стили(собственно говоря, с чего вы и начали тему). Я обычно прописываю width/height модуля, потом width/height главного контейнера (в вашем случае HeaderContainer)

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

Жаль, я надеялся, что есть способ как то унаследовать именно разметку, Спасибо

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

Добрый день. Хотелось бы узнать в версии 7.7 в детали адресов, при создании нового контакта и добавлении новой записи в деталь, у человека у которого есть доступ только на создание, выходит ошибка что нет доступа на изменение поля Primary, хотя сама запись в базу добавляется. Исходя из этого я понял что срабатывает некий БП по событию. Но я никак не смог его раскопать. Не подскажите где мне найти данный функционал. 

при добавлении 2й записи данной ошибки уже не возникает.

Нравится

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

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

Рекомендуем Вам обратиться в службу технической поддержки support@terrasoft.ru для предоставления консультации по данному вопросу.

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

Симптомы

При создании детали через "Мастер деталей" и переходе на вкладку "Страница" браузер валится с ошибкой:

message: Элемент с ключём 7f889822-86af-4b53-bd7d-b8b153f0a5c4 Не существует.

Решение

Найдите в базе данных в таблице SysModuleEdit элемент с нужным CardSchemaUId и удалите.

Необходимые условия и возможные ограничения

Встречалась только в версии 7.7

Нравится

Поделиться

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

Добрый день,

У меня такой вопрос, есть представление VwExample, я добавил SQL сценарий на его изменение через ALTER VIEW, добавил пару колонок. При выборке через MSSQL Server все нормально выбирает.

Однако в коде почему то говорит 

Terrasoft.Common.ItemNotFoundException: Значение с именем "TestColumn" не найдено

 

Выбираю следующим образом 

 

var esqActivity = new EntitySchemaQuery(userConnection.EntitySchemaManager, "VwExample");
esqActivity.AddAllSchemaColumns(true);
var entities = esqActivity.GetEntityCollection(userConnection);

Значения получаю так: 

foreach (var entity in entities)
{
    var test = activity.GetTypedColumnValue<Guid>("TestColumn");
 
}

Такое ощущение что в BPM хранится предыдущее представление до его изменения, хотя в базе данных при Select * from VwExample" выводит все колонки, в том числе TestColumn. Я что то забываю?

Нравится

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

ESQ берёт информацию о колонках не из самой таблицы или view в базе, а из объекта в конфигурации. Соответственно, нужно открыть дизайнер объекта и добавить и там все новые колонки.

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

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

У меня возникла задача по запуску хранимой процедуры с карточки контакта. Я на карточке добавил действие, где вызываю бизнес процесс. Из бизнес процесса выполняю вызов хранимой процедуры.

Ниже код вызова бизнес процесса из ContactPageV2:

GetCLStatus: function() {
 
var ContactId = this.get("Id");
 
var ContactName = this.get("Name");
 
var ContactBirthDate = this.get("BirthDate").toDateString();
 
var ContactTranslitName = this.get("TsTranslitName");
 
var ContactAdminUnitId = Terrasoft.SysValue.CURRENT_USER.value;
 
var ContactCLStatus;
 
var processArgs = {
 
sysProcessName: "CLCheckClientProc",
 
parameters: {
 
Id: ContactId,
 
FullName: ContactName,
 
BirthDate: ContactBirthDate,
 
TranslitName: ContactTranslitName,
 
AdminUnitId: ContactAdminUnitId,
 
CLStatus: ContactCLStatus
 
}
 
};
 
ProcessModuleUtilities.executeProcess(processArgs);
 
}

Еще ниже уже код вызова хранимой процедуры (сценарий в БП):

var sContactId = Get<string>("Id");
 
var sName = Get<string>("FullName");
 
var sBirthDate = Get<string>("BirthDate");
 
var sTranslitName = Get<string>("TranslitName");
 
var sAdminUnitId = Get<string>("AdminUnitId");
 
 
//var sName = "Иван Иванов";
 
 
string sCLStatus = "XXX";
 
var userConnection = Get<UserConnection>("UserConnection");
 
 
DataValueTypeManager dataValueTypeManager = userConnection.DataValueTypeManager;
 
var textDataValueType = new TextDataValueType(dataValueTypeManager);
 
 
StoredProcedure storedProcedure = new StoredProcedure(userConnection, "ACCCHECKCLIENT")
 
.WithParameter("sName", sName)
 
.WithParameter("dob", sBirthDate)
 
.WithParameter("sTranslitName", sTranslitName)
 
.WithParameter("sContactId", sContactId)
 
.WithParameter("sSysAdminUnitId", sAdminUnitId)
 
.WithOutputParameter("sStatus", textDataValueType) as StoredProcedure;
 
 
storedProcedure.Execute();
 
sCLStatus = storedProcedure.Parameters.FindByName("sStatus").Value as string;
 
Set("CLStatus", sCLStatus);

При таком вызове мне в базу пишутся только нечитаемые символы. Если в коде C# не читать из параметров, а вызывать напрямую, к примеру, "Иван Иванов" – все ок.

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

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

Отсюда я делаю вывод, что проблема либо при передаче параметров в БП, либо при начитке параметров в сценарии.

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

Нравится

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

Попробуйте добавить в скриптаске логгер, 

Для этого необходимо самом бизнес-процесса добавить 

        using global::Common.Logging;

После, в самой скриптаске можно вызывать Log.Debug("Message"); или Log.Error("Message");.

Сообщение можно будет просмотреть в логах приложения, которые по умолчанию находятся C:\Windows\TEMP\[id сайта], а именно в файле Common.

Также, что бы однозначно увидеть ошибку в логах, стоит использовать Log.Error("Message"); либо повысить уровень логгирования, это можно сделать в log4net.config.

 

Также, можно просмотреть какие запросы приходят в БД при помощи MS SQL Profiler, в случае если Вы используете MS SQL.

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

Добрый день, столкнулся с проблемой, в секции если нажать на кнопку открыть (перейти в карточку редактирования) пишет что "Страница редактирования не найдена". Скорее всего полетела связь в БД.

Подскажите пожалуйста как это поправить.

Нравится

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

А она на самом деле есть, видна в конфигураторе (карточка редактирования)? Если есть, надо смотреть таблицу SysModuleEdit, прописана ли нужная страница редактирования (карточка) для объекта.

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

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

Саломатников Алексей Сергеевич,

Тогда надо логи смотреть и stack-trace. Тут лучше в ТП обратиться, т.к. покопаться серьезно придется.

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