Как программно изменить или добавить контактную информацию контрагента в 1С:Бухгалтерия 3.0

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

В конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0), как и во многих решениях на базе Библиотеки стандартных подсистем (БСП), работа с контактной информацией (адреса, телефоны, Email) существенно отличается от работы с обычными реквизитами. Данные хранятся в специальных табличных частях и регистрах сведениях, а для доступа к ним используются специализированные функции общего модуля УправлениеКонтактнойИнформацией. В данной статье мы разберем, как автоматизировать замену электронных почт, как правильно добавлять отсутствующую информацию и как избежать типичных ошибок, приводящих к сбоям в работе системы.

Разбираем получение контактной информации объекта

Первым шагом в любой задаче по модификации данных является их корректное получение. Рассмотрим стандартный подход. Для получения таблицы со всей контактной информацией контрагента используется функция УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(). Однако здесь часто возникает ошибка, когда функция возвращает пустую таблицу, хотя данные в карточке контрагента заполнены.

Проанализируем причину. Важным нюансом является передача параметров. Если во второй параметр (Вид КИ) передать пустую строку "", система может не найти соответствий. Рассмотрим правильный способ вызова:


// Ссылка на контрагента
МойКонтрагент = Спр.ПолучитьОбъект(); 

// Правильный вызов: второй параметр оставляем пустым (Неопределено)
КонтИнформация = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(МойКонтрагент, , ТекущаяДата, Ложь);

Оставляя второй параметр пустым, мы даем понять системе, что хотим получить все виды контактной информации, связанные с этим объектом. Если же вам нужен только конкретный вид (например, только Email), туда следует передавать ссылку на элемент справочника ВидыКонтактнойИнформации.

Массовое изменение существующих адресов электронной почты

Представим задачу: во всей базе нужно заменить определенный домен в адресах электронной почты или обновить почту по списку. Для этого нам необходимо получить таблицу контактной информации, модифицировать её и записать обратно. Рассмотрим алгоритм действий по шагам.

Во-первых, мы обходим выборку контрагентов. Во-вторых, для каждого контрагента получаем его КИ. В-третьих, внутри таблицы КИ ищем строки, относящиеся к типу "Адрес электронной почты".


Спр = Справочники.Контрагенты.Выбрать();
Пока Спр.Следующий() Цикл
    МойКонтрагент = Спр.ПолучитьОбъект();
    // Получаем таблицу КИ
    КонтИнформация = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(МойКонтрагент, , ТекущаяДата, Ложь);
    
    Для каждого ТекСтрока ИЗ КонтИнформация Цикл
        // Идентифицируем Email по виду или типу
        Если Строка(ТекСтрока.Вид) = "Email" Или ТекСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
            ТекЕмаил = ТекСтрока.Представление;
            НовыйЕмаил = "test@mail.ru"; // Здесь ваша логика формирования адреса
            
            // Важно обновить и представление, и значения полей
            ТекСтрока.Представление = НовыйЕмаил;
            ТекСтрока.ЗначенияПолей = СтрЗаменить(ТекСтрока.ЗначенияПолей, ТекЕмаил, НовыйЕмаил);
        КонецЕсли;
    КонецЦикла;
    
    // Записываем обновленную таблицу обратно в объект
    УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта(МойКонтрагент, КонтИнформация);
    МойКонтрагент.Записать();
КонецЦикла;

Важный момент: просто изменить текст в Представление недостаточно. Контактная информация в БП 3.0 хранится в формате JSON (в более старых версиях — XML) в колонке ЗначенияПолей. Если вы измените только представление, при открытии карточки контрагента пользователь может увидеть старые данные, так как форма редактирования КИ считывает данные именно из структуры ЗначенияПолей.

Как добавить контактную информацию, если её нет

Если у контрагента еще нет записи об электронной почте, метод простого изменения строки в таблице не сработает — строку нужно создать. Рассмотрим самый надежный способ добавления через использование внутренних механизмов БСП, которые гарантируют корректное формирование структуры JSON/XML.

Для создания новой записи нам потребуются: ссылка на вид контактной информации и понимание типа КИ. Выясним причину, почему ручное заполнение таблицы значений часто приводит к ошибке "Значение не является значением объектного типа (РазрешитьВводНесколькихЗначений)". Эта ошибка возникает, когда в колонку Вид таблицы значений передается строка "Email", а не ссылка на справочник ВидыКонтактнойИнформации.

Разберем правильный код добавления новой почты:


АдресЭП = "test@test.ru";
Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
// Обязательно получаем ссылку на вид КИ
Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагенты;

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

// Записываем информацию
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(МойКонтрагент.Ссылка, ЗначенияПолей, Вид, Тип);

Обратите внимание на метод ЗаписатьКонтактнуюИнформацию. В отличие от УстановитьКонтактнуюИнформациюОбъекта, этот метод позволяет записывать данные, передавая Ссылку на объект, а не сам объект. Это значительно ускоряет работу при массовой обработке данных, так как не требует вызова ПолучитьОбъект() и последующей перезаписи всего контрагента со всеми его реквизитами и проверками при записи.

Оптимизация и проверка корректности

При работе с контактной информацией в промышленных масштабах (загрузка из Excel, интеграция с сайтом) рекомендуем придерживаться следующих правил:

  1. Проверка формата Email: Прежде чем записывать данные в базу, убедитесь, что адрес соответствует стандарту. В типовых решениях для этого есть функция: УправлениеКонтактнойИнформациейКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(НовыйЕмаил).
  2. Работа с историей: В последних версиях БСП контактная информация может храниться с историей изменений. Если ваша конфигурация настроена именно так, при добавлении записей в таблицу КИ нужно учитывать колонку ДействуетС.
  3. Использование JSON: Современная 1С:Бухгалтерия предпочитает JSON. Для генерации строки значений полей лучше использовать УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВJSON(ОбъектXDTO). Это гарантирует, что адрес корректно откроется в интерактивном окне редактирования.
  4. Поиск вида КИ: Не используйте поиск по наименованию, если есть возможность обратиться к предопределенным элементам. Например, Справочники.ВидыКонтактнойИнформации.EmailКонтрагенты — это надежный способ получить нужный вид.

Проанализировав ситуацию, можно сделать вывод: управление контактной информацией через программный код требует использования типовых функций общих модулей. Попытки напрямую манипулировать строками в табличных частях без понимания структуры ЗначенияПолей часто приводят к тому, что данные "ломаются": они видны в списках, но их невозможно отредактировать или использовать при отправке почты из программы.

← На главную