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

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

При программном заполнении базы данных в решениях на платформе «1С:Предприятие 8» (таких как 1С:Комплексная автоматизация 2.5, 1С:ERP 2.5 или 1С:Управление торговлей 11) разработчики часто сталкиваются с неожиданным поведением: контактная информация успешно записана через процедуры БСП в объект справочника Контрагенты, данные присутствуют в табличной части, однако при открытии карточки контрагента в пользовательском интерфейсе нужные поля (например, Email или телефон) остаются пустыми или содержат старые значения. Разберем детально архитектурные причины такого поведения и способы корректного решения проблемы.

Архитектурная связь справочников Партнеры и Контрагенты

Проанализируем структуру хранения данных в типовых конфигурациях линейки ERP/КА/УТ. В отличие от 1С:Бухгалтерии, где справочник Контрагенты является единственным держателем всех реквизитов, в торговых и производственных конфигурациях используется разделение понятий:

  1. Партнеры — отражают управленческую сущность контрагента, группу компаний или клиента с точки зрения взаимодействия. Именно к партнеру привязывается основная коммуникационная контактная информация: рабочий телефон, основной Email, адрес доставки и фактический адрес.
  2. Контрагенты — представляют собой официальные юридические лица с регламентированными реквизитами (ИНН, КПП, ОГРН, юридический адрес, банковские счета).

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

Причина несовпадения видов контактной информации

Рассмотрим структуру справочника ВидыКонтактнойИнформации. В нем элементы строго разделены по группам владельцев:

  1. Группа Справочник "Контрагенты" (содержит юридический адрес, почтовый адрес, телефон по юридическому адресу и т.д.).
  2. Группа Справочник "Партнеры" (содержит рабочий Email, телефон, фактический адрес и т.д.).

Механизм динамического построения формы БСП читает только те виды контактной информации, которые жестко сопоставлены с элементами формы. Если мы с помощью процедуры УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию записываем строку в табличную часть контрагента, но поле на форме связано с контактной информацией партнера, в интерфейсе новые сведения отображены не будут.

Пошаговый алгоритм решения проблемы

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

  1. Определяем связанного партнера: получаем ссылку на партнера из реквизита КонтрагентОбъект.Партнер.
  2. Проверяем заполненность партнера: если партнер указан, открываем его на редактирование через метод ПолучитьОбъект().
  3. Используем правильные виды контактной информации: для контрагента передаем вид КИ из группы контрагентов, а для партнера — соответствующий вид КИ из группы партнеров (например, EmailПартнера).
  4. Записываем оба объекта: обновляем контактную информацию в обоих справочниках и сохраняем изменения.

Посмотрим на пример правильного программного кода:


// Получаем объект контрагента для модификации
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();

// 1. Запись контактной информации в самого контрагента (если требуется для регламентированного учета)
ВидКИКонтрагента = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(
    КонтрагентОбъект,
    НовыйEmail,
    ВидКИКонтрагента,
    Дата(1, 1, 1),
    Истина
);
КонтрагентОбъект.Записать();

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

Дополнительные нюансы работы с контактной информацией БСП

Выясним еще несколько важных технических деталей, о которых необходимо помнить при интеграциях и переносе данных:

  1. Хранение истории изменений: в БСП предусмотрена опция ведения истории изменения контактов. Если для определенного вида КИ включена настройка «Хранить историю изменений», передача пустой даты (Дата(1, 1, 1)) может привести к тому, что запись не попадет в срез актуальных данных при чтении на текущую дату. Если для вида включена история, в параметрах процедуры рекомендуется указывать текущую дату сеанса (ТекущаяДатаСеанса()).
  2. Сериализация сложных типов: строковые значения подходят для простых форматов (Email, телефон). При программном добавлении адресов необходимо учитывать, что в актуальных версиях БСП адресная информация хранится в специальном структурированном виде (поле ЗначенияПолей в формате XML/JSON). Если записать адрес простой строкой, форма может не распознать структуру адреса по ФИАС/ГАР.
  3. Валидация форматов: перед вызовом процедуры записи целесообразно выполнять проверку корректности передаваемой строки (корректность синтаксиса адреса электронной почты или маски номера телефона) с использованием встроенных функций общего модуля УправлениеКонтактнойИнформациейКлиентСервер.

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

← На главную