Вопрос

Открытие окна из меню действия

Доброго времени суток!

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

function amiConfigAccountCitiesOnExecute(ActionMenuItem, Sender) {
        var EditWindowUSI = 'wnd_ConfigAccountsCities';
        var Dataset = Services.GetNewItemByUSI('ds_ConfigAccountsCities');
        var Attributes = GetNewDictionary();
        ApplyDatasetFilter(Dataset, 'OwnerID', Connector.CurrentUser.ContactID, true);
        Dataset.Open();
        if (Dataset.RecordsCount) {
                var RecordID = Dataset('ID');
                Attributes('RecordID') = RecordID;
        }              
        Dataset.Close();                            
        Attributes.Add('NotifyObject', Self);
        ShowEditWindowEx(EditWindowUSI, Attributes);   
}

Если записей нет (условие не выполнилось), то все открывается как надо (создается новая запись). А вот если запись уже есть, то открывается окно, но все контролы там не активны и выскакивает ошибка OLE Error.
Я думаю что-то не так с атрибутами, но не пойму что. Помогите решить проблему, пожалуйста.

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

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

здравствуйте, Дмитрий!
с атрибутами вроде все в порядке, рекордИД должен содержать ИД записи, которую нужно открыть. если это был бы просто не тот ИД, то выдавалось бы сообщение "запись удалена".

попробуйте после открытия датасета перейти к первой записи, то есть написать Dataset.GotoFirst(); после Dataset.Open();

еще вопрос -- датасет ds_ConfigAccountsCities у Вас "привязан" к окну wnd_ConfigAccountsCities? это Ваш новый раздел, правильно я понимаю? может, у Вас в самом скрипте окна что-то не так идет при открытии. посмотрите отладчиком.

GotoFirst() проблему не решил.

датасет ds_ConfigAccountsCities привязан к окну wnd_ConfigAccountsCities (прописан в dlData). Это не окно нового раздела, это окно конфигурации, которое вызывается из меню "Действия" в новом разделе.

С самим окном вроде все в порядке, ошибка вылетает только если передается атрибут RecordID, без него все нормально открывается.

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

У вас ошибка при присвоении атрибута. Вот как Вы передаете NotifyObject:

Attributes.Add('NotifyObject', Self);

а как RecordID:

 Attributes('RecordID') = RecordID;

Измените на

Attributes.Add('RecordID', RecordID);

Также, не помешает передать дополнительно атрибуты:

Attributes.Add('IsNew', false);
Attributes.Add('IsCopy', false);

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

Дмитрий,

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

Попробуйте добавить на деталь доступ для всех записей Вашего раздела группу "Все пользователи".

Объясните, пожалуйста, подробнее, что значит администрирование по записям в группе к которой привязана таблица датасета. Она обязательно должна быть привязана к какой-нибудь группе? Привязал к группе "Контрагенты", а где посмотреть администрируется ли группа по записям? Самой таблице поставил галочку "Администрируется по записям", не помогло.

Ошибка под администратором есть.

Вылетает в функции ShowEditWindowEx на строчке:

EditWindow.Prepare();

Но у меня у вызываемого окна на событии OnPrepare стоит стандартная функция. (наследовано от wnd_BaseDBEdit).

Извиняюсь, я ошибся в описании проблемы в первом посте, окно вызывается из меню "Действия" не нового раздела, а из раздела "Контрагенты". Соответственно на детали доступ стоит.

Дмитрий,
Вам нужно переопределить событие OnPrepare для Вашего окна. В этом событии вызовите базовый метод, а также метод Initialize(Window), в котором присвойте Window атрибут DatasetUSI:

SetAttribute(Window, 'DatasetUSI', 'ds_Dataset');

К примеру, как в карточке Контрагентов:

function wnd_AccountEditOnPrepare(Window) {
	Initialize();
   	wnd_BaseDBEditOnPrepare(Window);
...
}

Здравствуйте!

Написал так

function InitializeDataset(Window) {
    SetAttribute(Window, 'DatasetUSI', 'ds_ConfigAccountsCities');	
}
 
function Initialize(Window) {
	InitializeDataset(Window);
}
 
function wnd_ConfigAccountsCitiesOnPrepare(Window) {
	Initialize(Window);
	wnd_BaseDBEditOnPrepare(Window);
}

Не помогло :sad:

Дмитрий, здравствуйте.

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

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