В конфигурации 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, интеграция с сайтом) рекомендуем придерживаться следующих правил:
УправлениеКонтактнойИнформациейКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(НовыйЕмаил).ДействуетС.УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВJSON(ОбъектXDTO). Это гарантирует, что адрес корректно откроется в интерактивном окне редактирования.Справочники.ВидыКонтактнойИнформации.EmailКонтрагенты — это надежный способ получить нужный вид.Проанализировав ситуацию, можно сделать вывод: управление контактной информацией через программный код требует использования типовых функций общих модулей. Попытки напрямую манипулировать строками в табличных частях без понимания структуры ЗначенияПолей часто приводят к тому, что данные "ломаются": они видны в списках, но их невозможно отредактировать или использовать при отправке почты из программы.