Как программно записать телефон и e-mail контрагенту в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При автоматизации загрузки данных из внешних источников или интеграции с CRM часто возникает необходимость программно записать номер телефона или адрес электронной почты в справочник контрагентов. В конфигурации «Управление торговлей» редакции 10.3 (и других типовых решениях на обычных формах) контактная информация хранится в специальном регистре сведений КонтактнаяИнформация.

Разберем типичные ошибки, из-за которых внесенные данные могут не сохраняться или перезаписывать все существующие контакты контрагента, и проанализируем правильные способы записи.

Типичные ошибки при программной записи контактной информации

Проанализируем основные причины, по которым данные не отображаются или возникают сбои при записи:

  1. Перезапись регистра без установки отбора: Если создавать набор записей через СоздатьНаборЗаписей() и сразу добавлять новую строку без чтения регистра и установки фильтров по измерению Объект, при сохранении такой набор затрет всю остальную контактную информацию данного контрагента.
  2. Несоответствие видов и типов контактной информации: В справочнике ВидыКонтактнойИнформации каждому элементу жестко сопоставлен объект-владелец и тип. Например, если указать вид ВидыКонтактнойИнформации.АдресЭлектроннойПочтыКонтактногоЛицаКонтрагента для объекта ссылки Справочники.Контрагенты, типовые механизмы и формы не смогу корректно связать и показать эту запись.
  3. Некорректная замена полей телефона: Для типа «Телефон» в регистре предусмотрено несколько составных полей (от Поле1 до Поле10), отвечающих за код страны, код города, номер и добавочный код. Заполнение всех этих полей одинаковой цельной строкой может привести к ошибкам отображения.

Способ 1. Запись с помощью Менеджера записи (Рекомендуемый)

Если необходимо добавить или обновить одну конкретную запись (например, номер телефона контрагента), проще и надежнее использовать МенеджерЗаписи. Это позволяет избежать случайного удаления других записей контрагента (адресов, e-mail).

Рассмотрим пример кода с использованием менеджера записи:


Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();

// Задаем ключевые измерения
Запись.Объект = КонтрагентСсылка;
Запись.Вид    = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
Запись.Тип    = Перечисления.ТипыКонтактнойИнформации.Телефон;

// Попытка считать существующую запись
Запись.Прочитать();

// Заполняем строковое представление и составные поля
Запись.Представление = "+7 (999) 000-00-00";
Запись.Поле3         = "+7 (999) 000-00-00"; // Номер телефона

// Записываем данные в регистр
Запись.Записать(Истина);

Разберем порядок действий в этом примере:

  1. Создаем объект МенеджерЗаписи для регистра сведений КонтактнаяИнформация.
  2. Устанавливаем ключевые измерения: ссылку на контрагента (Объект), соответствующий Вид из справочника и Тип из перечисления.
  3. Вызываем метод Прочитать(). Если запись с таким объектом и видом уже существовала, менеджер заполнит остальные поля текущими значениями для их изменения. Если записи не было — менеджер останется новым.
  4. Заполняем реквизит Представление (строка, отображаемая в формах и отчетах).
  5. Вызываем метод Записать(Истина) для сохранении изменений в базе данных.

Способ 2. Использование Набора записей с установкой отбора

Если задача требует работы с набором записей или использования процедур общего модуля УправлениеКонтактнойИнформацией, необходимо обязательно устанавливать отбор по объекту и читать текущее состояние регистра перед изменением.

Посмотрим на пример работы с набором записей:


НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();

// Обязательно устанавливаем отбор по объекту
НаборЗаписей.Отбор.Объект.Установить(КонтрагентСсылка);
НаборЗаписей.Прочитать();

// Ищем существующую запись по виду контактной информации
ИскомыйВид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
СтрокаЗаписи = Неопределено;

Для Каждого ТекущаяСтрока Из НаборЗаписей Цикл
    Если ТекущаяСтрока.Вид = ИскомыйВид Тогда
        СтрокаЗаписи = ТекущаяСтрока;
        Прервать;
    КонецЕсли;
КонецЦикла;

// Если запись не найдена, добавляем новую
Если СтрокаЗаписи = Неопределено Тогда
    СтрокаЗаписи = НаборЗаписей.Добавить();
    СтрокаЗаписи.Объект = КонтрагентСсылка;
    СтрокаЗаписи.Вид    = ИскомыйВид;
    СтрокаЗаписи.Тип    = Перечисления.ТипыКонтактнойИнформации.Телефон;
КонецЕсли;

// Заполняем ресурсы
СтрокаЗаписи.Представление = "+7 (999) 000-00-00";

// Сохраняем набор (существующие контакты других видов сохранятся)
НаборЗаписей.Записать();

Важные нюансы и рекомендации

  1. Проверка прав доступа: При выполнении программной записи от имени пользователя с ограниченными правами у него должно быть право записи в регистр сведений КонтактнаяИнформация. Если запись выполняется в фоновом режиме или при интеграции, целесообразно использовать метод УстановитьПривилегированныйРежим(Истина).
  2. Обновление открытых форм: Если запись производится при открытой карточке контрагента, после программного сохранения данных следует обновить форму или перечитать объект, иначе при нажатии кнопки «Записать» в форме данные могут быть перезаписаны старыми значениями из памяти.
← На главную