При выполнении интеграций, переносе данных или пакетной загрузке реквизитов контрагентов разработчики часто сталкиваются с ситуацией: программный код успешно создает записи в регистре сведений КонтактнаяИнформация, данные физически присутствуют в базе, однако при открытии формы элемента справочника Контрагенты поля адресов, телефонов и email остаются пустыми. Разберем детально, почему так происходит и как правильно организовать запись контактной информации.
Проанализируем структуру справочника ВидыКонтактнойИнформации. В типовых конфигурациях (таких как 1С:Бухгалтерия предприятия 2.0) справочник хранит настройки для совершенно разных сущностей системы: контрагентов, организаций, физических лиц, контактных лиц и пользователей. При этом наименования элементов в разных группах часто полностью совпадают, например:
Контрагенты)Организации)Когда в коде используется простой поиск:
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию(СтрокаТаблицы.КонтактнаяИнформацияВид);
Платформа возвращает первый попавшийся элемент с указанным наименованием. Если функция вернет ссылку на вид контактной информации, относящийся к организациям, запись в регистр сведений запишется без ошибок. Однако форма контрагента при открытии накладывает жесткий фильтр по реквизиту ВидОбъектаКонтактнойИнформации и игнорирует записи, не принадлежащие к объектам типа Контрагенты.
Рассмотрим правильные способы получения ссылки на нужный вид контактной информации.
Способ 1. Использование предопределенных элементов (рекомендуемый)
Для типовых видов контактной информации безопаснее и быстрее всего обращаться напрямую к предопределенным значениям метаданных. Это исключает зависимость от наименований и переименований пользователями:
// Для юридического адреса контрагента
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
// Для фактического адреса контрагента
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
// Для телефона контрагента
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
// Для электронной почты
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;
Способ 2. Поиск запросом с отбором по объекту контактной информации
Если вы работаете с пользовательскими (непредопределенными) видами, выполним поиск с обязательным отбором по реквизиту ВидОбъектаКонтактнойИнформации:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ВидыКИ.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКИ
|ГДЕ
| ВидыКИ.Наименование = &Наименование
| И ВидыКИ.ВидОбъектаКонтактнойИнформации = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовКонтактнойИнформации.Контрагенты)";
Запрос.УстановитьПараметр("Наименование", СокрЛП(СтрокаТаблицы.КонтактнаяИнформацияВид));
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
НоваяЗапись.Вид = Выборка.Ссылка;
КонецЕсли;
Визуальный интерфейс карточки контрагента и большинство типовых печатных форм считывают и выводят данные из ресурса Представление регистра сведений. Если при загрузке были заполнены только структурные поля (Поле1, Поле2 и т.д.), но поле Представление осталось пустым, строка адреса или телефона визуально будет казаться незаполненной.
Разберем соответствие числовых полей адреса в архитектуре конфигурации:
Поле1 — Почтовый индекс;Поле2 — Регион;Поле3 — Район;Поле4 — Город;Поле5 — Населенный пункт;Поле6 — Улица;Поле7 — Номер дома;Поле8 — Номер корпуса / строения;Поле9 — Номер квартиры / офиса;Поле10 — Дополнительный классификатор.Обратим внимание на производительность: использование СоздатьМенеджерЗаписи() с постоянным вызовом Прочитать() в цикле по тысячам контрагентов создает избыточную нагрузку на базу данных. При пакетной обработке эффективнее использовать НаборЗаписей:
НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(КонтрагентСсылка);
НаборЗаписей.Отбор.Вид.Установить(Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = КонтрагентСсылка;
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
НоваяЗапись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяЗапись.Представление = "101000, г. Москва, ул. Мясницкая, д. 1";
НоваяЗапись.Поле1 = "101000";
НоваяЗапись.Поле2 = "77";
НоваяЗапись.Поле4 = "Москва";
НоваяЗапись.Поле6 = "Мясницкая";
НоваяЗапись.Поле7 = "1";
НаборЗаписей.Записать(Истина);
Также в типовых конфигурациях для автоматического формирования строкового представления и корректной записи рекомендуется использовать методы общего модуля УправлениеКонтактнойИнформацией, такие как ЗаписатьКонтактнуюИнформацию() и СформироватьПредставлениеАдреса().