Перейти к содержанию

После обновления на 3.5 перестали работать скрипты на пользователей

  • Актуально для: 3.5

В версии 3.5 произошли следующие изменения:

  • В настройках атрибута с типом данных «Пользователь» добавилась новая опция «Несколько значений», которая определяет, будет ли атрибут ограничен одним хранимым значением или нет.
  • Аналогичная опция при настройках поля на форме была убрана (её значение автоматически переносится в настройку атрибута при обновлении базы данных на новую версию).
В связи с этим просьба обратить внимание на использование пользовательских атрибутов в скриптах, которые потенциально необходимо будет доработать.

Изменение №1

Все системные API, которые возвращают значения атрибутов (например, GetWithAlias, Get, GetPropertyValues, ListWithAlias и т.д.) возвращают пары: системное имя атрибута и значения в виде структуры Dictionaryobject в данном случае – это значение атрибута, а 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 является историческим и плохо оптимизирован. Его использование не рекомендуется и в будущих версиях не будет поддерживаться.