Виснет окно при создании Счета

Здравствуйте!
В Продаже в контекстном меню выполняю «Создать счет». Окно «Счет» висит секунд 30 (не отвечает), затем отвисает.
Тоже самое, если из Продаж создать Договор.

Дебаггером дохожу до функции

function RefreshDataset(Dataset) {
       CheckAssigned(Dataset, 'Dataset');
       Dataset.Close();
       Dataset.Open(); // Здесь 30 секунд висим
}

Профайлер показывает, что на Dataset.Open(); выполняется Select sq_Opportunity за 3 секунды.
И далее в течение 30 секунд висим и затем в профайлере Select Opportunity ID ….
После этого окно Счет отвисает.

Как можно проанализировать, что происходит в Dataset.Open();, чтобы понять причину зависания?
И в чем может быть причина?

Нравится

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

Есть еще события OnDatasetBeforeOpen(Dataset), и OnDatasetAfterOpen(Dataset) - скорее всего там накручена какая-то логика, которая выполняется слишком долго. Установите в этих событиях отладчик, либо на строке Dataset.Open() нажмите F11 (зайти внутрь) чтобы понять что происходит в фоне.

Установил на эти события (wnd_InvoiceEditScript) отладчик, а также на строке Dataset.Open() нажимал F11.
Дальше строки Dataset.Open() не проходит. Сразу после Dataset.Open() выходим на окно Счет, где висим секунд 30, затем отвисаем. Что ещё может быть?

Alex, посмотрите профайлером какой запрос идет в БД и выполните его в Management Studio.
Как долго выполняется запрос?

"Бондарь Наталия" написал:Alex, посмотрите профайлером какой запрос идет в БД и выполните его в Management Studio.
Как долго выполняется запрос?

В заглавном сообщение писал про Профайлер:

"Профайлер показывает, что на Dataset.Open(); выполняется Select sq_Opportunity за 3 секунды.
И далее в течение 30 секунд висим и затем в профайлере Select Opportunity ID …."
В Management Studio он также выполняется за 3 сек.

Также отладчик ставил на ds_Opportunity (OnDatasetBeforeOpen(Dataset), и OnDatasetAfterOpen(Dataset)). (Пробовал ставить отладчик на все функции в ds_OpportunityScript, но не в одну из функций не заходит).

После 30 секундного зависания переходит на ds_OpportunityOnDatasetAfterOpen.

Что происходит в эти 30 секунд скрыто в Dataset.Open() куда не получается войти.

Сам метод Open() не тяжелый. Чтобы проверить, что происходит в методе, необходимо отлаживать исходники приложения, что по понятным причинам Вы сделать не сможете.

"Alex GF" написал:(Пробовал ставить отладчик на все функции в ds_OpportunityScript, но не в одну из функций не заходит)

Вот это самое странное, в базовой реализации обработка присутствует и, если Вы отлаживаетесь в студии, то по F11 должны были попасть на стандартный AfterOpen.
Проверьте наличие подписки на события в ds_Opportunity. Если с этим все в порядке, то останется только передать в поддержку обезличенную копию БД для анализа.

"Maxim Gritsenko" написал:
Проверьте наличие подписки на события в ds_Opportunity. Если с этим все в порядке, то останется только передать в поддержку обезличенную копию БД для анализа.

Удалось ли что-нибудь выяснить по поводу зависания? Обезличенная БД в начале сентября была передана в техподдержку.

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

Максим, скажите пожалуйста, какой именно запрос Вы запускали в Студии?
У меня на рабочей базе (там где виснет 30 сек при создании Счета или Договора) запрос sq_Opportunity в Студии выполняется за 2 сек.
Сами продажи в модуле Продажи работают без зависания.

Судя по количеству строк, это тот же запрос.
Я сейчас засекаю открытие набора данных и оно выполняется много дольше 20-ти секунд. Я попрошу коллег из разработки, которые имеют возможность работать с ядром приложения, провести анализ и прокомментировать зависание.

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

Получили ответ от коллег из департамента разработки, для решения данного вопроса, необходимо в сервисе wnd_InvoiceEditScript, в функции Initialize заменить:

if (IsAppend) {
                               var OpportunityID = Dataset.Values('OpportunityID');
                               if (OpportunityID) {
                                               var LookupDataset =
                                                               Dataset.DataFields('OpportunityID').LookupDataset;
                                               RefreshDataset(LookupDataset);
                                               LookupDataset.Locate('ID', OpportunityID);
                                               Dataset.Values('OpportunityID') = OpportunityID;
                               }
                }
На
                if (IsAppend) {
                               var OpportunityID = Dataset.Values('OpportunityID');
                               if (OpportunityID) {
                                               var LookupDataset =
                                                               Dataset.DataFields('OpportunityID').LookupDataset;
                                               ApplyDatasetIDFilter(LookupDataset, OpportunityID, true);
                                               RefreshDataset(LookupDataset);
                                               ApplyDatasetIDFilter(LookupDataset, null, false);
                                               Dataset.Values('OpportunityID') = OpportunityID;
                               }
                }

Спасибо, помогло!

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