Почему программно добавленная контактная информация не отображается в карточке контрагента 1С?

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

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

Причина 1: Неоднозначный поиск вида контактной информации

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

  1. Юридический адрес (для справочника Контрагенты)
  2. Юридический адрес (для справочника Организации)
  3. Телефон (для контрагентов, организаций и физических лиц)

Когда в коде используется простой поиск:


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

Платформа возвращает первый попавшийся элемент с указанным наименованием. Если функция вернет ссылку на вид контактной информации, относящийся к организациям, запись в регистр сведений запишется без ошибок. Однако форма контрагента при открытии накладывает жесткий фильтр по реквизиту ВидОбъектаКонтактнойИнформации и игнорирует записи, не принадлежащие к объектам типа Контрагенты.

Решение: Точная привязка видов контактной информации

Рассмотрим правильные способы получения ссылки на нужный вид контактной информации.

Способ 1. Использование предопределенных элементов (рекомендуемый)

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


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

// Для фактического адреса контрагента
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;

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

// Для электронной почты
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;

Способ 2. Поиск запросом с отбором по объекту контактной информации

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	ВидыКИ.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ВидыКонтактнойИнформации КАК ВидыКИ
    |ГДЕ
    |	ВидыКИ.Наименование = &Наименование
    |	И ВидыКИ.ВидОбъектаКонтактнойИнформации = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовКонтактнойИнформации.Контрагенты)";

Запрос.УстановитьПараметр("Наименование", СокрЛП(СтрокаТаблицы.КонтактнаяИнформацияВид));
Результат = Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    НоваяЗапись.Вид = Выборка.Ссылка;
КонецЕсли;

Причина 2: Незаполненное строковое «Представление»

Визуальный интерфейс карточки контрагента и большинство типовых печатных форм считывают и выводят данные из ресурса Представление регистра сведений. Если при загрузке были заполнены только структурные поля (Поле1, Поле2 и т.д.), но поле Представление осталось пустым, строка адреса или телефона визуально будет казаться незаполненной.

Разберем соответствие числовых полей адреса в архитектуре конфигурации:

  1. Поле1 — Почтовый индекс;
  2. Поле2 — Регион;
  3. Поле3 — Район;
  4. Поле4 — Город;
  5. Поле5 — Населенный пункт;
  6. Поле6 — Улица;
  7. Поле7 — Номер дома;
  8. Поле8 — Номер корпуса / строения;
  9. Поле9 — Номер квартиры / офиса;
  10. Поле10 — Дополнительный классификатор.

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

Обратим внимание на производительность: использование СоздатьМенеджерЗаписи() с постоянным вызовом Прочитать() в цикле по тысячам контрагентов создает избыточную нагрузку на базу данных. При пакетной обработке эффективнее использовать НаборЗаписей:


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

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = КонтрагентСсылка;
НоваяЗапись.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
НоваяЗапись.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяЗапись.Представление = "101000, г. Москва, ул. Мясницкая, д. 1";
НоваяЗапись.Поле1 = "101000";
НоваяЗапись.Поле2 = "77";
НоваяЗапись.Поле4 = "Москва";
НоваяЗапись.Поле6 = "Мясницкая";
НоваяЗапись.Поле7 = "1";

НаборЗаписей.Записать(Истина);

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

← На главную