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

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

Например, если это был раздел Контакты , то должна быть октрыта та же самая страница реестра контактов , ну например 7-я. Курсор в реестре должен стоять на том же самом контакте что и при закрытии. Если Контакт был отфильтрован при переходе с детали Контакты какого-либо Контрагента , то должен открывался тот же самый Контакт (с тем же самым фильтром) и т.д.

Если это был раздел Контрагенты, то должна быть октрыта та же самая страница реестра контрагентов, допустим 17-я , курсор должен стоять на том же самом контрагенте на котором стоял при выходе а курсор групп соответственно на последней выбранной статической(динамической) группе. Ну и т.д. для других разделов.

А вообще, где сохраняется последнее состояние окон и курсоров?

С уважением, Дмитрий
ТS CRM 3.2.0.83

Нравится

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

Здравствуйте, Дмитрий!

Последнее состояние окон сохраняется в профиле пользователя - в зависимости от настроек хранится либо в папке Profile (%AppData%\Terrasoft\<Ваша версия>\Profile), либо в базе данных.

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

Вот код обработчика этого события:

function wnd_MainOnClose(Window) {
if (Assigned(Main.UserSettingsWindow) &&
!Main.UserSettingsWindow.Attributes('DenySerializeToProfile')) {
var UserSettings = Main.UserSettingsWindow.Attributes('UserSettings');
var ActiveWorkspaceItem = GetActiveWorkspaceItem();
if (Assigned(ActiveWorkspaceItem)) {
if (UserSettings.StartMenuItemAction == 'rbLastActive') {
UserSettings.StartMenuItemTag =
ActiveWorkspaceItem ? ActiveWorkspaceItem.Tag : '';
}
if (UserSettings.StartMenuItemAction != 'rbByDefault') {
if (!IsEmptyValue(UserSettings.StartMenuItemTag)){
var StartedActionMenu =
GetActionMenuItemByTag(amWorkspace,
UserSettings.StartMenuItemTag);
var GroupCode = StartedActionMenu.ParentItems.Tag;
UserSettings.StartMenuGroupTag =
StartedActionMenu ? GroupCode : '';
} else {
UserSettings.StartMenuItemAction = 'rbLastActive';
}
}
}
Services.SerializeItemToProfile(Main.UserSettingsWindow, EmptyStr);
}
CloseMainForm();
}

Насчет сохранения страницы и позиции в реестре - это тоже можно доработать и сохранять эту информацию в профиль пользователя при вызове обработчика OnProfileSerialize окна. В таком случае нужно ещё реализовать обработчик события OnProfileDeserialize, который будет эту информацию вычитывать из профиля пользователя и обрабатывать.
Однако, с точки зрения производительности работы приложения при старте не рекомендуется реализовывать переход на n-ю страницу с m-ной позицией.

Добрый день, Алла!
Спасибо за пост!

"Савельева Алла" написал:хранится либо в папке Profile (%AppData%\Terrasoft\<Ваша версия>\Profile)

Такой папки у меня вообще нет.
Есть папка AppData\Roaming\Terrasoft CRM\3.2.0\Profile\F714003C6A014E0187CDFBA4B89B2D13
Там много файлов с расширением .dat , но это , кажется Cache.

"Савельева Алла" написал:В более поздних версиях появилась такая пользовательская настройка, которая позволяет пользователю указывать, какой раздел открывать при старте: по умолчанию, последний активный или указанный. Не уверенна, что такая функциональность есть в версии 3.2.0.83.

К сожалению, нет такой функциональности нет, по крайней мере в процессе работы не сталкивался. Где это сидит?

Моя коробочная функция лишь:
function wnd_MainOnClose(Window) {
CloseMainForm();
}

Вставил новую функцию , при закрытии приложения выдается ошибка(Предполагается наличие объекта) на строке:
var ActiveWorkspaceItem = GetActiveWorkspaceItem();

Что нужно изменить сделать?

"Кудинов Дмитрий Станиславович" написал:Есть папка AppData\Roaming\Terrasoft CRM\3.2.0\Profile\F714003C6A014E0187CDFBA4B89B2D13

Это и есть папка, в которой хранятся профили пользователей.
Cache хранится здесь же, но в папке Cache :smile:

"Кудинов Дмитрий Станиславович" написал:К сожалению, нет такой функциональности нет, по крайней мере в процессе работы не сталкивался. Где это сидит?

Эта функциональность реализована в версии 3.4.1 и находится она в настройках пользователя на вкладке [Общие].

"Кудинов Дмитрий Станиславович" написал:Вставил новую функцию , при закрытии приложения выдается ошибка(Предполагается наличие объекта) на строке:
var ActiveWorkspaceItem = GetActiveWorkspaceItem();

Что нужно изменить сделать?

Ошибка возникает из-за того, что у Вас не реализована функция GetActiveWorkspaceItem().
Её код ниже:
function GetActiveWorkspaceItem() {
for (var i = 0; i < amWorkspace.Count; i++) {
var GroupActionMenuItem = amWorkspace.Items(i);
if ((GroupActionMenuItem.IsVisible) && (GroupActionMenuItem.IsChecked)) {
for (var j = 0; j < GroupActionMenuItem.Count; j++) {
var ActionMenuItem = GroupActionMenuItem.Items(j);
if ((ActionMenuItem.IsVisible) && (ActionMenuItem.IsChecked)) {
return ActionMenuItem;
}
}
}
}
return null;
}

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

Алла, покорнейше благодарю за новую порцию кода!

Да, когда вставил GetActiveWorkspaceItem() ошибка исчезла.
Поведение приложения не изменилось - все по старому, отрывает только с раздела Контрагент.

"Савельева Алла" написал:Также обратите внимание на то, что, если Вы хотите использовать этот функционал в таком виде, в котором он есть в коробке, Вам нужно ещё реализовать интерфейсную часть.


Очень хочу реализовать функционал! Как и с какой целью реализовать интерфейсную часть?

(P.S. : Иногда, для визуальной информативности хотелось бы вставить рисунок, но у меня что-то не получается. Когда нажимаю на иконку *Вставить\изменить изображение* появляется окно со странной геометрией(буква Г упала вперед). Там три позиции для ввода , но названия полей обрезаны. Раньше такого бага не было , вставлял без проблем. У Вас получится отправить рисунок? Видимо в какое-то из трех (сверху вниз) необходимо вводить путь к рисунку на жестком? В какое? )

"Кудинов Дмитрий Станиславович" написал:Поведение приложения не изменилось - все по старому, отрывает только с раздела Контрагент.

Логично, так как для того, чтобы данная функциональность работала нужно:
1) указывать настройки того, какой раздел отображать (для этого нужно реализовать интерфейсную часть в окне пользовательских настроек);
2) в обработчике события OnPrepare для wnd_Main вызывать функцию InitializeUserSettings, которая выполняет десериализацию настроек пользователя:
function InitializeUserSettings(InitializeWhenMainWindowPrepare) {
Main.UserSettingsWindow = Services.GetNewItemByUSI('wnd_UserSettings');
Main.UserSettingsWindow.Attributes('InitializeWhenMainWindowPrepare') =
InitializeWhenMainWindowPrepare;
Main.UserSettingsWindow.Prepare();
Services.DeserializeItemFromProfile(Main.UserSettingsWindow, '');
}

"Кудинов Дмитрий Станиславович" написал:Очень хочу реализовать функционал! Как и с какой целью реализовать интерфейсную часть?

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

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

"Кудинов Дмитрий Станиславович" написал:(P.S. : Иногда, для визуальной информативности хотелось бы вставить рисунок, но у меня что-то не получается. Когда нажимаю на иконку *Вставить\изменить изображение* появляется окно со странной геометрией(буква Г упала вперед). Там три позиции для ввода , но названия полей обрезаны. Раньше такого бага не было , вставлял без проблем. У Вас получится отправить рисунок? Видимо в какое-то из трех (сверху вниз) необходимо вводить путь к рисунку на жестком? В какое? )

Информацию передала в отдел, который занимается поддержкой работы Community.

Здравствуйте, Дмитрий!

Для решения проблемы попробуйте очистить содержимое папки Profile (где она находится я писала в этом посте выше).

"Кудинов Дмитрий Станиславович" написал:Пытался восстановить последнюю backUp - копию , тоже не удается . Выдается ошибка что база используется, хотя проверил в диспетчере - запущенных террасофтовских файлов нет.

Бекап базы данных не относится к 'террасофтовским файлам' - это часть, за работу которой отвечает СУБД (например, MS SQL).

Вот что оказывается произошло :biggrin:. После того как я поставил галочку в чекбокс, в окне входа вместо supervisor встало мое имя пользователя в моей машине. Я был невнимателен и только потом увидел такое безобразие...:idea:

В Terrasoft есть 2 способа авторизации в базу: по логину и паролю и из-под пользователя домена, под которым работаете в Windows. В окне логина это определяет соответствующая галочка.

У меня на событие OnPrepare уже вызывается функция:

function wnd_MainOnPrepare(Window) {
ReadSystemSettings();
InitializeUserSettings();
InitializeCallCentreClientWindow();
Initialize();

FillReferencesDictionary();
CheckAnniversary();
var WorkspaceUSI = GetGroupAllowedWorkspaceUSI();
try {
if(IsEmptyValue(WorkspaceUSI)) {
var Message = "Текущий пользователь не имеет достаточно прав для просмотра данных";
throw Message;
}
}
catch (e) {
CatchException(e);
return;
}
IntitializeTimer();
PrepareTimer();
ShowTimerWindow();
}

А функция InitializeUserSettings в моем варианте похожа ту которую прислали Вы , но покороче и без аргумента в круглых скобках. Имеет вид:

function InitializeUserSettings() {
Main.UserSettingsWindow = Services.GetNewItemByUSI('wnd_UserSettings');
Main.UserSettingsWindow.Prepare();
Services.DeserializeItemFromProfile(Main.UserSettingsWindow, '');
}

Как быть?

И что?

"Зверев Александр" написал:

И что?


Пожалуйста, конкретезируйте свой вопрос:smile:

Эти отличия в коде могут быть вызваны более старой версией конфигурации. У Вас 3.2, а интересующие Вас механизмы появились в более поздних. Если хотите перенести все доработки новой версии в старую, придётся приобрести лицензии на 3.3.2 (а скорее всего, 3.4.0, 3.4.1), где есть нужная логика, развернуть рядом и сравнивать содержимое одинаковых функций. Или же заказать такие работы в качестве проекта.

Можно и без лицензии:) если просто раздобыть дистрибутив демо или боевой дистрибутив соответствующих версий. Админка прекрасно работает под супервизором и система послужит донором
Дистрибутив думаю не откажется дать поддержка ;)

Ну, или под Supervisor. Судя по инструкции, в 3.4.0 уже есть такое окно.
user settings

"Зверев Александр" написал:

Если хотите перенести все доработки новой версии в старую, придётся приобрести лицензии на 3.3.2 (или 3.4.0, 3.4.1), где есть нужная логика, развернуть рядом и сравнивать содержимое одинаковых функций. Или же заказать такие работы в качестве проекта.


У меня рабочая 3.2.0.83 . Сделано много доработок. Есть ли смысл покупать лицензию на 3.4 чтобы сравнивать содержимое одинаковых функций ? Перенести все новое из 3.4 в 3.2 может быть и возможно, но будет затратно, хотя бы даже по времени... уж тогда лучше сразу на 7-ку переходить.
Но пока не хочу. А в 3.2 есть некоторые критичные вещи которые уже просто достали.

Сейчас мало у кого есть версия 3.2. У большинства пользователей 3.Х — либо 3.3.2, либо 3.4.
Специально переносить все новые доработки в 3.2 уже никто не будет. Кроме того, часть из пожеланий в самом верхнем сообщении (выбранная запись на непервой странице) нет вообще нигде, это нужно делать с нуля.

Смысла переходить действительно больше уже на 7.Х, но она полностью другая. Есть бесплатный триал на 2 недели, можете зарегистрироваться и посмотреть.

"Александр Кудряшов" написал:

Можно и без лицензии:) если просто раздобыть дистрибутив демо или боевой дистрибутив соответствующих версий. Админка прекрасно работает под супервизором и система послужит донором

Дистрибутив думаю не откажется дать поддержка ;)

Даст ли дистрибутив поддержка, это еще вопрос.
Главные преимущества и недостатки 3.Х против 7.Х мы уже обсуждили в созданной мной теме.
*Есть ли какие-нибудь плюсы у Terrasoft CRM 3.xxx по сравнению с BPMonline 7.x *?

"Кудинов Дмитрий Станиславович" написал:Даст ли дистрибутив поддержка, это еще вопрос

Дистрибутив не тайна за семью печатями. Обязательно предоставят. Или партнеров просите :)
Кстати будьте морально готовы, что на бинарниках 3.2 у вас желаемый функционал может даже после все сравнений и переносов кода не заработать. Такая вероятность увы есть.

Здравствуйте, Дмитрий!

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

После этого путем сравнения сервисов перенести нужные Вам доработки, хотя риск того, что это сделать физически может не получится, всё-таки есть, и гарантировать 100% результат мы не можем.

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

"Савельева Алла" написал: можно сделать, запросив дистрибутив более поздней версии 3.4.1, в которой данная функциональность реализована

Добрый день, Алла!

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

"Савельева Алла" написал: можно сделать, запросив дистрибутив более поздней версии 3.4.1, в которой данная функциональность реализована

Добрый день, Алла!

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

Я Вам показал какой код у меня. Он расходится с вашим кодом cущественно.
Функции сериализации\десериализации у меня пустые.

function wnd_MainOnProfileDeserialize(Window, Node) {
}

function wnd_MainOnProfileSerialize(Window, Node) {
}
Чего мне на данный момент не хватает чтобы открытие, хотя-бы, было в раздел из которого был выход?
Мне даже не нужно в настройках пользователя опции выбора стартого раздела. Мне было бы достаточно
захардкодить.Примерно в каком направлении двигаться? Видимо в этих функциях что-то прописать? Для входа в последний открытый раздел эти функции задействуются? Можете пример кода который есть у Вас? Что означает второй параметр Node? Сообщие , пожалуйста, в тех.службу, пусть проверят скрипт уведомления опубликования нового поста. Приходит сразу от 2 до 4 писем.:exclaim:

Да, запросите версию 3.4.1.

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