CRM
Телефоны и email: множественные поля CRM
Как адресовать отдельное значение и не потерять остальные телефоны при обновлении.
Пример относится к REST. Таблица множественных полей и CCrmFieldMulti в коробке не заменяют проверку прав на карточку.
У каждого значения свой ID
В старых REST-методах контактов и компаний телефоны и email приходят массивами PHONE и EMAIL. У элемента массива есть собственный ID, значение VALUE и назначение VALUE_TYPE. ID строки телефона не равен ID контакта.
Сначала прочитайте карточку через crm.contact.get или соответствующий метод компании. Схемы старых методов и crm.item.* не нужно смешивать.
Изменить конкретный телефон
Пример использует уже известные ID контакта и его телефона. Назначение WORK не заменяет ID существующей строки.
BX24.init(function () {
BX24.callMethod('crm.contact.update', {
id: 123,
fields: {
PHONE: [{ ID: '456', VALUE: '+70000000000', VALUE_TYPE: 'WORK' }]
}
}, function (result) {
if (result.error()) {
console.error(result.error());
return;
}
console.log(result.data());
});
});Номер в примере — заглушка. Для удаления конкретного значения применяется его ID и признак DELETE: 'Y', согласно контракту метода. Передача новой строки без ID и изменение существующей строки — разные операции.
Почему опасно сначала удалить всё
Последовательность «удалить все телефоны → добавить новые» оставляет карточку без данных, если второй шаг завершится ошибкой. Даже успешное чтение перед записью не защищает от параллельного изменения другим пользователем.
Сохраняйте исходный набор и план изменения по ID строк. После записи перечитайте карточку и сравните именно изменённые значения. Нормализацию для поиска дублей храните отдельно от исходного номера: удаление всех символов, кроме цифр, не всегда сохраняет добавочный номер и международный префикс.