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