Здравствуйте!
В Продаже в контекстном меню выполняю «Создать счет». Окно «Счет» висит секунд 30 (не отвечает), затем отвисает.
Тоже самое, если из Продаж создать Договор.
Дебаггером дохожу до функции
CheckAssigned(Dataset, 'Dataset');
Dataset.Close();
Dataset.Open(); // Здесь 30 секунд висим
}
Профайлер показывает, что на Dataset.Open(); выполняется Select sq_Opportunity за 3 секунды.
И далее в течение 30 секунд висим и затем в профайлере Select Opportunity ID ….
После этого окно Счет отвисает.
Как можно проанализировать, что происходит в Dataset.Open();, чтобы понять причину зависания?
И в чем может быть причина?
Нравится
Есть еще события OnDatasetBeforeOpen(Dataset), и OnDatasetAfterOpen(Dataset) - скорее всего там накручена какая-то логика, которая выполняется слишком долго. Установите в этих событиях отладчик, либо на строке Dataset.Open() нажмите F11 (зайти внутрь) чтобы понять что происходит в фоне.
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 секунд из студии.
Судя по количеству строк, это тот же запрос.
Я сейчас засекаю открытие набора данных и оно выполняется много дольше 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; } }