Как программно заполнить контактную информацию контрагента в 1С:Управление торговлей 11.3?

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

При работе с современными конфигурациями 1С, такими как Управление торговлей 11.3, разработчики часто сталкиваются с ситуацией: программный код по добавлению адреса или телефона выполняется без ошибок, данные физически записываются в табличную часть КонтактнаяИнформация, их можно увидеть через консоль запросов, но на самой форме элемента в режиме «1С:Предприятие» поля остаются пустыми. Это происходит из-за особенностей работы подсистемы «Контактная информация» из состава Библиотеки стандартных подсистем (БСП).

В этой статье мы подробно разберем, почему данные могут не отображаться, изучим разницу в хранении информации для партнеров и контрагентов, а также рассмотрим несколько рабочих способов программного заполнения контактной информации (КИ).

Причины, по которым данные не видны на форме

Проанализируем основные причины «невидимости» данных, которые обсуждались в рамках технической проблемы:

  1. Некорректный Вид контактной информации. В системе жестко разделены виды КИ для разных справочников. Например, для справочника Партнеры используются одни элементы справочника ВидыКонтактнойИнформации, а для Контрагенты — другие. Если записать в контрагента телефон с видом «Телефон партнера», стандартная форма его просто не отфильтрует для показа.
  2. Отсутствие структурированных данных в поле ЗначенияПолей. Начиная с определенных версий БСП, 1С хранит контактную информацию не просто строкой, а в формате JSON (ранее XML). Форма элемента при открытии «распаршивает» этот JSON. Если в табличную часть записано только «Представление», но поле ЗначенияПолей пустое или заполнено некорректно, форма посчитает данные поврежденными и ничего не выведет.
  3. Путаница между Партнерами и Контрагентами. В УТ 11 реализована концепция CRM, где Партнер — это управленческая сущность, а Контрагент — юридическое лицо. Часто в настройках программы включено отображение контактной информации партнера в формах контрагента. Если заполнить данные только одному объекту, во втором они могут не появиться автоматически.

Рассмотрим способы правильного заполнения этих данных.

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

Самый надежный метод — использовать экспортные процедуры общих модулей. Это гарантирует, что все служебные поля (включая JSON-структуру) будут сформированы правильно. Разберем пример добавления адреса электронной почты для контрагента.


// Определим исходные данные
АдресЭП = "info@example.com";
ТипКИ = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;

// Формируем структуру данных через XDTO (внутренний механизм БСП)
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(АдресЭП, ТипКИ);
ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);

// Записываем информацию в объект
// КонтрагентОбъект — это предварительно полученный объект справочника
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентОбъект, ЗначенияПолей, ВидКИ, ТипКИ);
КонтрагентОбъект.Записать();

В данном примере функция КонтактнаяИнформацияXDTOВXML (или аналогичная для JSON в более свежих версиях) создает ту самую строку, которую «понимает» форма. Обратите внимание, что метод ЗаписатьКонтактнуюИнформацию сам управляет очисткой старых записей и добавлением новых с тем же видом.

Способ 2. Программное заполнение через структуру JSON

Если в вашей версии УТ 11.3 уже используется формат JSON, то подход через прямое формирование структуры будет более эффективным. Рассмотрим ситуацию с заполнением номера телефона, где важно правильно разделить код страны, код города и номер.


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

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

Вызов функции ОписаниеНовойКонтактнойИнформации позволяет получить пустой шаблон структуры, соответствующий требованиям БСП. Это избавляет нас от необходимости вручную прописывать ключи JSON-объекта.

Способ 3. Прямое заполнение табличной части (ручной метод)

Этот метод мы проанализируем как наиболее подверженный ошибкам, но иногда необходимый для быстрой отладки или простых типов данных (например, поле «Заметка»). Главное правило здесь — заполнить все обязательные реквизиты строки табличной части КонтактнаяИнформация.


НоваяСтрока = КонтрагентОбъект.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
НоваяСтрока.Представление = "8 (999) 123-45-67";

// Критически важные поля для телефонов:
НоваяСтрока.НомерТелефона = "9991234567";
НоваяСтрока.НомерТелефонаБезКодов = "1234567";

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

// Оставлять пустым ЗначенияПолей в новых версиях НЕЛЬЗЯ. 
// Как минимум, запишите туда XML или JSON структуру представления.
НоваяСтрока.ЗначенияПолей = "<Structure xmlns=""http://v8.1c.ru/8.1/data/core""><Property name=""Представление""><Value xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xsi:type=""xs:string"">" + НоваяСтрока.Представление + "</Value></Property></Structure>";

КонтрагентОбъект.Записать();

Важный момент: Если вы заполняете адрес, использование ручного метода крайне не рекомендуется. Адреса в 1С привязаны к классификатору ФИАС (ГАР). Чтобы адрес считался валидным и отображался в соответствующих полях (город, улица, дом), необходимо использовать сложные функции парсинга из модуля УправлениеКонтактнойИнформациейКлиентСервер.

Синхронизация данных Партнера и Контрагента

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

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

Если вы открываете форму контрагента, а видите там данные партнера, значит, в конфигурации настроено динамическое считывание КИ. В этом случае программная запись напрямую в табличную часть контрагента может не дать визуального эффекта до тех пор, пока данные не будут синхронизированы с партнером.

Резюме для разработчика

Чтобы программное заполнение контактной информации в УТ 11.3 работало корректно, придерживайтесь следующих правил:

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

Следуя этим рекомендациям и используя встроенные механизмы БСП, вы сможете избежать проблем с отображением данных и обеспечите корректную работу всех механизмов системы 1С.

← На главную