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

Роли сострудника

Комментарии

Комментариев: 3

  • Ну да, получение .Name как раз и загружает данные самой карточки, после загрузки навигатора это будет ее первое чтение, которое может тормозить при большом объеме ролевой модели, т.к. на самой карточке выставлен режим получения FETCH_CARD.

    Ускорить это можно примерно так:
    - не читать это имя напрямую вообще, а воспользоваться, н-р, представлением по секции ролей с отключенным ограничением по экземплярам и условием RowID = Id роли.
    - закэшировать соответствующие данные в собственном серверном расширении, читать их вызов его метода.

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

    0
    Действия с комментариями Постоянная ссылка
  • Спасибо за ответ!

    Ваш комментарий + логи Fiddler'а и до меня дошло, что он загружает на локальную машину видимо весь (может и не весь, но много и долго) конструктор ролей с таблицами соответствия между операциями и состояниями... что-то около 70 МБайт и в самом лучшем случае этот процесс занимает минуты 1,5...

    Вариант с серверным расширением вполне интересный, только как закэшировать в нем данные? по крайней мере, если просто вынести в серверное расширение:

    /// <summary> Получение списка ролей пользователя (строка разделенная ';')
    /// </summary>
    /// <param name="idDocument"> ID документа </param>
    /// <param name="idUser"> ID Пользователя </param>
    /// <returns></returns>
    [ExtensionMethod]
    public string GetUserRoles(Guid idDocument, Guid idUser)
    {
    string sNames = "";
    try
    {
    ContextExtension ceContext = new ContextExtension();
    Document document = Context.GetObject<Document>(idDocument);
    foreach (RoleModelRole RMR in ceContext.AccessCheckingService.GetUserRoles(document, idUser))
    {
    if (sNames.Length > 0) sNames += ";";
    sNames += RMR.Name.ToLower().Trim();
    }
    }
    catch { }
    return sNames;
    }

    то при каждом его вызове он отрабатывает одинаково не быстро (пол минуты). Быстрее, конечно, чем локально, но при повторном открытии карточки она открывается как при первом.

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

    0
    Действия с комментариями Постоянная ссылка
  • В серверном расширении закэшировать сессию и контекст, создавать их только по мере необходимости (либо при первом обращении, либо, если сессия была закрыта по таймауту), а не при каждом вызове.

    Можно даже создать сессию заранее при старте расширения и использовать уже готовый объект.

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

     

    А с представлением - это только для чтения названий ролей, для проверки такой способ, ес-но, не подойдет. Делаем представление с элементом по секции Roles, столбец, н-р, RowID, в него добавляем глобальное условие на название роли, выставляем SkipInstanceLimit = true.

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

    Т.е. вместо метода searchRole с полным перебором всего справочника мы читаем с сервера только нужные Id строк.

    0
    Действия с комментариями Постоянная ссылка

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