После обновления на 3.5 перестали работать скрипты на пользователей
В версии 3.5 произошли следующие изменения:
- В настройках атрибута с типом данных «Пользователь» добавилась новая опция «Несколько значений», которая определяет, будет ли атрибут ограничен одним хранимым значением или нет.
- Аналогичная опция при настройках поля на форме была убрана (её значение автоматически переносится в настройку атрибута при обновлении базы данных на новую версию).
Изменение №1
Все системные API, которые возвращают значения атрибутов (например, GetWithAlias, Get, GetPropertyValues, ListWithAlias и т.д.) возвращают пары: системное имя атрибута и значения в виде структуры Dictionary. object в данном случае – это значение атрибута, а string — его системное имя.
В предыдущих версиях все атрибуты с типом данных «Пользователь» имели тип IEnumerable вне зависимости от настроек полей. Таким образом, чтобы получить значение атрибута, достаточно было в скрипте после получения значений через API сделать cast вида (IEnumerable)object. В связи с произошедшими изменениями, тип возвращаемого значения атрибута в API теперь меняется в зависимости от указанного флага «Несколько значений» в настройках атрибута, а именно:
- Если в настройках атрибута указан флаг «Несколько значений», то независимо от количества выбранных или рассчитанных значений тип возвращаемого значения в API будет всегда IEnumerable.
- Если в настройках атрибута флаг «Несколько значений» отключен, то тип значения будет зависеть количества значений, хранимых в атрибуте:
- Если одно значение, то string;
- Если значений несколько, то IEnumerable.
Данную проблему можно решить, проверяя тип возвращенного значения с использование следующего кода:
if (obj != null) { val = (IEnumerable)obj.ToList(); if (val = null) val = new List{(sting)obj}; } |
Таким образом, вне зависимости от входящего типа, на выходе будет конструкция List, содержащая одно или несколько значений атрибута с типом данных «Пользователь».
Изменение №2
Вне зависимости от значения флага «Несколько значений» в настройках атрибута с типом данных «Пользователь» конструкция Entity.Select(id) будет возвращать одно значение. Entity необходимо переписать на любой из выше названных API (GetWithAlias, Get, GetPropertyValues, ListWithAlias в зависимости от использования).
Объект класса Entity является историческим и плохо оптимизирован. Его использование не рекомендуется и в будущих версиях не будет поддерживаться.