В процессе автоматизации загрузки данных из внешних источников или при интеграции с другими системами часто возникает задача программного добавления контактной информации (КИ) для контрагентов. В конфигурации 1С:Розница (начиная с версии 2.2 и выше), как и во многих других решениях на базе Библиотеки стандартных подсистем (БСП), работа с контактной информацией имеет свои нюансы. Если просто добавить строку в табличную часть, данные могут не отобразиться в интерфейсе или привести к ошибкам в работе системы. Рассмотрим подробно, как правильно решить эту задачу.
Прежде чем переходить к коду, разберем, где именно хранятся телефоны, адреса и электронная почта. В справочнике Контрагенты (а также в справочниках ФизическиеЛица, Организации и др.) предусмотрена табличная часть под названием КонтактнаяИнформация.
Многие начинающие разработчики совершают ошибку, заполняя только реквизит НомерТелефона. Однако для того, чтобы система "увидела" эту запись и корректно отобразила её в карточке контрагента на вкладке "Адреса и телефоны", необходимо заполнить целый ряд обязательных полей. Проанализируем основные реквизиты этой табличной части:
Перечисления.ТипыКонтактнойИнформации.Телефон. Определяет характер данных.Справочники.ВидыКонтактнойИнформации. Это конкретный "слот" в интерфейсе (например, "Телефон контрагента" или "Мобильный телефон").Рассмотрим пример кода, который позволяет добавить телефонный номер в объект контрагента. Этот метод подходит, когда у вас уже открыт объект для редактирования или вы создаете нового контрагента.
// Предположим, у нас есть ОбъектКонтрагента (тип СправочникОбъект.Контрагенты)
// и переменная СтроковыйНомер, содержащая телефон
НоваяСтрока = ОбъектКонтрагента.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
// Важно правильно определить Вид. Обычно это предопределенный элемент
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
// Заполняем номер и ОБЯЗАТЕЛЬНО представление
НоваяСтрока.НомерТелефона = СтроковыйНомер;
НоваяСтрока.Представление = СтроковыйНомер;
// Для корректной работы поиска рекомендуется очистить номер от лишних символов
// (скобок, тире, пробелов) и записать в специальное поле
НоваяСтрока.НомерТелефонаБезКодов = СтрСоединить(СтрРазделить(СтроковыйНомер, "+-() ", Ложь), "");
ОбъектКонтрагента.Записать();
Проанализируем ситуацию: если вы выполнили этот код, но телефон все равно не виден, основной причиной является отсутствие заполненного поля Представление. Система 1С в управляемых формах часто использует именно это поле для первичного отображения данных в списках и карточках.
В современных версиях "Розницы" реализована мощная подсистема управления контактной информацией. Использование прямого обращения к табличной части — не самый гибкий путь, так как структура хранения может включать в себя XML-сериализованные данные в поле ЗначенияПолей. Чтобы не формировать этот XML вручную, правильно будет использовать программный интерфейс БСП.
Рассмотрим вариант использования общего модуля УправлениеКонтактнойИнформацией. Этот способ гарантирует, что все служебные поля будут заполнены корректно согласно настройкам системы.
// Ссылка на контрагента, которому добавляем номер
СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИННИзФайла);
Если Не СсылкаНаКонтрагента.Пустая() Тогда
Объект = СсылкаНаКонтрагента.ПолучитьОбъект();
ВидТелефона = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
// Подготовим структуру с данными
ДанныеКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(СтроковыйНомер, ВидТелефона);
// Метод добавит или обновит информацию в табличной части объекта
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Объект, ДанныеКИ, ВидТелефона, Перечисления.ТипыКонтактнойИнформации.Телефон);
Объект.Записать();
КонецЕсли;
Разберем несколько критических моментов, которые помогут избежать ошибок при внедрении данного функционала:
Добавить(), выясним, нет ли уже у этого контрагента телефона такого же вида. Если в настройках вида КИ не стоит флаг "Разрешить ввод нескольких записей", то добавление новой строки может привести к тому, что старая информация будет скрыта или возникнет конфликт при записи.УправлениеКонтактнойИнформацией позволяет избежать этой проблемы, так как они автоматически парсят строку и заполняют структуру.Таким образом, мы проанализировали два основных подхода к добавлению телефона контрагенту в конфигурации 1С:Розница. Использование прямого заполнения ТЧ КонтактнаяИнформация допустимо для простых задач, при условии обязательного заполнения реквизита Представление. Однако для обеспечения целостности данных и корректной работы всех механизмов платформы, рекомендуется применять методы общего модуля УправлениеКонтактнойИнформацией.