В процессе разработки приложения для Salesforce столкнулся с несколькими “Cюрпризами” в Арех.
1. Для валидации данных, вводимых через UI, было необходимо определять тип поля, для которого они вводятся. Код был написан, покрыт тестами и спокойно работал пока не возникла необходимость расширения возможностей валидации и, соответственно, переделки тестового класса.
В исходном тестовом классе, который был написан несколько месяцев назад, для тестирования различных типов полей я использовал стандартные поля со стандартных объектов, и в частности для типа DOUBLE я использовал стандартное поле NumberOfEmployees с объекта Account.

Несколько месяцев назад тесты благополучно проходили. Каково же было мое удивление, когда несколько дней назад, запустив тестовый класс, я получил сообщение о том, что по типу DOUBLE тест не проходит. В процессе короткого инвестигейта проблемы оказалось, что за эти несколько месяцев тип этого поля в Арех поменялся с DOUBLE на INTEGER. Казалось бы, все логично – для этого поля Data Type = Number с количеством знаков после запятой равным нулю, какой же ему тип иметь кроме, как INTEGER? Но если мы создадим два кастомных поля с Data Type = Number, но с разным количеством знаков после запятой,

то мы увидим такую картину:

Оба кастомных поля имеют тип DOUBLE, независимо от количества знаков после запятой.
Поэтому, если Вы работаете в Арех с типами полей и у Вас в работающем ранее коде возникают неожиданные ошибки, то, возможно, причина в том, что изменился тип каких-то стандартных полей.
2. Какой тип в Арех может иметь поле sObject-a с Data Type = Picklist? Ответ очевиден – PICKLIST. Но не все так просто: для некоторых sObject-ов стандартные поля с Data Type = Picklist в Арех имеют тип COMBOBOX.
sObject Event
Если мы посмотрим на список стандартных полей, то увидим, что поле Subject имеетData Type = Picklist.
![]()
Однако в Арех данное поле имеет тип COMBOBOX.
![]()
Аналогично ситуация выглядит и для sObject Task.
![]()
и в Арех
![]()
Я столкнулся с данной ситуацией на Task и Event, но, возможно, есть и другие sObject-ы с похожей проблемой.
3. Иногда возникает необходимость определить required поля для sObject в Арех. Для этого нам необходимо определить:
-
допускает ли поле нулевое значение при сохранении записи
-
заполняется ли поле дефалтовым значением при создании записи
-
не является ли поле составным именем, например поле
NameнаPerson Account
Соответственно код для проверки будет следующим:
Получаем Map с перечнем полей для объекта
Map<String, Schema.SObjectField> objectFields = Schema.getGlobalDescribe().get('ObjectName').getDescribe().fields.getMap();
Получаем описание интересующего нас поля
Schema.DescribeFieldResult fieldDescr = objectFields.get(`fieldName`).getDescribe();
Проверяем, является ли поле required
Boolean isFieldRequired = !fieldDescr.isNillable() && !fieldDescr.isDefaultedOnCreate() && !fieldDescr.isNameField();
Но как всегда есть подвохи:
- так как у
Accountrequired поле этоName, то проверка будет такой
Boolean isFieldRequired = !fieldDescr.isNillable() && !fieldDescr.isDefaultedOnCreate();
- у
sObject EventиTaskrequiredполя невозможно определить вАрех– они не отвечают вышеперечисленным критериям. ДляEvent requiredполя этоsubjectиdurationinminutes, дляTaskэтоsubject, priority, status.