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

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

function wnd_MainOnClose(Window) {
        Connector.DBEngine.ExecuteCustomSQL('INSERT INTO tbl_loginhistory VALUES (NEWID(),GetDate(),\''+Connector.CurrentUser.ContactID+'\',HOST_NAME(),0,@@SPID )',System.EmptyValue);
        if (Assigned(Main.UserSettingsWindow)){
                var UserSettings = Main.UserSettingsWindow.Attributes('UserSettings');
                var ActiveWorkspaceItem = GetActiveWorkspaceItem();
                if (UserSettings.StartMenuItemAction == 'rbLastActive') {
                        UserSettings.StartMenuItemTag =
                                ActiveWorkspaceItem ? ActiveWorkspaceItem.Tag : '';
                }
                if (UserSettings.StartMenuItemAction != 'rbByDefault') {
                        UserSettings.StartMenuGroupTag =
                                ActiveWorkspaceItem ? ActiveWorkspaceItem.ParentItems.Tag : '';
                }
                Services.SerializeItemToProfile(Main.UserSettingsWindow, EmptyStr);
        }
        CloseMainForm();
}

Код функции. Ошибка в Services.SerializeItemToProfile(Main.UserSettingsWindow, EmptyStr); данной строке.
Прилагаю файлом весь скрипт.

Нравится

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

Здравствуйте Олег,
Попробуйте добавить WinCache_Clear(); перед CloseMainForm();

Добавил, на данный момент функция такая:

function wnd_MainOnClose(Window) {
	Connector.DBEngine.ExecuteCustomSQL('INSERT INTO tbl_loginhistory VALUES (NEWID(),GetDate(),\''+Connector.CurrentUser.ContactID+'\',HOST_NAME(),0,@@SPID )',System.EmptyValue);
	if (Assigned(Main.UserSettingsWindow)){
		var UserSettings = Main.UserSettingsWindow.Attributes('UserSettings');
		var ActiveWorkspaceItem = GetActiveWorkspaceItem();
		if (UserSettings.StartMenuItemAction == 'rbLastActive') {
			UserSettings.StartMenuItemTag =
				ActiveWorkspaceItem ? ActiveWorkspaceItem.Tag : '';
		}
		if (UserSettings.StartMenuItemAction != 'rbByDefault') {
			UserSettings.StartMenuGroupTag =
				ActiveWorkspaceItem ? ActiveWorkspaceItem.ParentItems.Tag : '';
		}
		debugger;
		Services.SerializeItemToProfile(Main.UserSettingsWindow, EmptyStr);
	}
	WinCache_Clear();
	CloseMainForm();
}

Но проблему очистка кеша не решила(

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

TSObjectLibrary.Services: Разрушительный сбой
А на что может указывать такая ошибка?

После первого выхода из террасофт Main.Workspaces.Count устанавливается = 2, по этому и выскакивает ошибка. Подскажите, как победить?
Там может быть только одно, последнее окно, как бы чистить при загрузке террасофта.

Олег. на сколько я понимаю код который в http://www.community.terrasoft.ru/forum/topic/7019#comment-30069 был взят c 3.3.2, у меня получилось воспроизвести проблемму, с TSObjectLibrary.Services: Catastrophic failure перенеся данный код на конфигурацию на 3.0.4, но решить ее за короткое время у меня не получилось.

Да. Код был взят из 3.3.2.
Просто дело в том, что если я захожу в настройки пользователя и нажимаю на "ок", то ошибка не появляется. Но если этого не делать, выскакивает TSObjectLibrary.Services: Catastrophic failure.
Т.е. как бы сохранение работает, но каждый раз жать ок в настройках не вариант)

Когда мы выбираем способ загрузки стартового окна, срабатывает функция SaveAttributtes() из wnd_UserSettingsScript. Можно ли как-то вызывать эту функцию на событии wnd_main (onClose)?
Пробовал wnd_UserSettingsScript.SaveAttributtes() - не прокатывает

function wnd_MainOnClose(Window) {
    debugger;
    var wndSetting = Services.GetSingleItemByUSI('wnd_UserSettings');
   // wndSetting.Show();
    wndSetting.Prepare();
    wndSetting.ComponentsByName('btnOk').Click();
	Connector.DBEngine.ExecuteCustomSQL('INSERT INTO tbl_loginhistory VALUES (NEWID(),GetDate(),\''+Connector.CurrentUser.ContactID+'\',HOST_NAME(),0,@@SPID )',System.EmptyValue);
	if (Assigned(Main.UserSettingsWindow)){
		var UserSettings = Main.UserSettingsWindow.Attributes('UserSettings');
		var ActiveWorkspaceItem = GetActiveWorkspaceItem();
		if (UserSettings.StartMenuItemAction == 'rbLastActive') {
			UserSettings.StartMenuItemTag =
				ActiveWorkspaceItem ? ActiveWorkspaceItem.Tag : '';
		}
		if (UserSettings.StartMenuItemAction != 'rbByDefault') {
			UserSettings.StartMenuGroupTag =
				ActiveWorkspaceItem ? ActiveWorkspaceItem.ParentItems.Tag : '';
        Services.SerializeItemToProfile(Main.UserSettingsWindow, EmptyStr);
	}
	WinCache_Clear();
	CloseMainForm();
	}
}

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

Решил так:

	Main.UserSettingsWindow = Services.GetNewItemByUSI('wnd_UserSettings');
	Main.UserSettingsWindow.Prepare();
	Main.UserSettingsWindow.Show();
	Main.UserSettingsWindow.ComponentsByName('btnOk').Click();

Спасибо. Можно закрывать

Подскажите, где описана функция GetActiveWorkspaceItem()?

Функция описана в скрипте scr_Main.

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