При автоматизации загрузки данных из внешних источников или интеграции с CRM часто возникает необходимость программно записать номер телефона или адрес электронной почты в справочник контрагентов. В конфигурации «Управление торговлей» редакции 10.3 (и других типовых решениях на обычных формах) контактная информация хранится в специальном регистре сведений КонтактнаяИнформация.
Разберем типичные ошибки, из-за которых внесенные данные могут не сохраняться или перезаписывать все существующие контакты контрагента, и проанализируем правильные способы записи.
Проанализируем основные причины, по которым данные не отображаются или возникают сбои при записи:
СоздатьНаборЗаписей() и сразу добавлять новую строку без чтения регистра и установки фильтров по измерению Объект, при сохранении такой набор затрет всю остальную контактную информацию данного контрагента.ВидыКонтактнойИнформации каждому элементу жестко сопоставлен объект-владелец и тип. Например, если указать вид ВидыКонтактнойИнформации.АдресЭлектроннойПочтыКонтактногоЛицаКонтрагента для объекта ссылки Справочники.Контрагенты, типовые механизмы и формы не смогу корректно связать и показать эту запись.Поле1 до Поле10), отвечающих за код страны, код города, номер и добавочный код. Заполнение всех этих полей одинаковой цельной строкой может привести к ошибкам отображения.Если необходимо добавить или обновить одну конкретную запись (например, номер телефона контрагента), проще и надежнее использовать МенеджерЗаписи. Это позволяет избежать случайного удаления других записей контрагента (адресов, e-mail).
Рассмотрим пример кода с использованием менеджера записи:
Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
// Задаем ключевые измерения
Запись.Объект = КонтрагентСсылка;
Запись.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
Запись.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
// Попытка считать существующую запись
Запись.Прочитать();
// Заполняем строковое представление и составные поля
Запись.Представление = "+7 (999) 000-00-00";
Запись.Поле3 = "+7 (999) 000-00-00"; // Номер телефона
// Записываем данные в регистр
Запись.Записать(Истина);
Разберем порядок действий в этом примере:
МенеджерЗаписи для регистра сведений КонтактнаяИнформация.Объект), соответствующий Вид из справочника и Тип из перечисления.Прочитать(). Если запись с таким объектом и видом уже существовала, менеджер заполнит остальные поля текущими значениями для их изменения. Если записи не было — менеджер останется новым.Представление (строка, отображаемая в формах и отчетах).Записать(Истина) для сохранении изменений в базе данных.Если задача требует работы с набором записей или использования процедур общего модуля УправлениеКонтактнойИнформацией, необходимо обязательно устанавливать отбор по объекту и читать текущее состояние регистра перед изменением.
Посмотрим на пример работы с набором записей:
НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
// Обязательно устанавливаем отбор по объекту
НаборЗаписей.Отбор.Объект.Установить(КонтрагентСсылка);
НаборЗаписей.Прочитать();
// Ищем существующую запись по виду контактной информации
ИскомыйВид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
СтрокаЗаписи = Неопределено;
Для Каждого ТекущаяСтрока Из НаборЗаписей Цикл
Если ТекущаяСтрока.Вид = ИскомыйВид Тогда
СтрокаЗаписи = ТекущаяСтрока;
Прервать;
КонецЕсли;
КонецЦикла;
// Если запись не найдена, добавляем новую
Если СтрокаЗаписи = Неопределено Тогда
СтрокаЗаписи = НаборЗаписей.Добавить();
СтрокаЗаписи.Объект = КонтрагентСсылка;
СтрокаЗаписи.Вид = ИскомыйВид;
СтрокаЗаписи.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
КонецЕсли;
// Заполняем ресурсы
СтрокаЗаписи.Представление = "+7 (999) 000-00-00";
// Сохраняем набор (существующие контакты других видов сохранятся)
НаборЗаписей.Записать();
КонтактнаяИнформация. Если запись выполняется в фоновом режиме или при интеграции, целесообразно использовать метод УстановитьПривилегированныйРежим(Истина).