Почему контактные данные партнера записываются в 1С:УТ 11, но не отображаются в карточке, и как это исправить?

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

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

Разберем по шагам, почему возникает такое поведение платформы и подсистемы БСП, а также рассмотрим проверенные способы корректного программного заполнения контактной информации.

Выясним причину: как подсистема контактной информации отображает данные

В конфигурациях на базе «Библиотеки стандартных подсистем» (БСП), таких как УТ 11, КА 2 и ERP, поля контактной информации на форме не являются жестко зашитыми статическими реквизитами. Они генерируются динамически при чтении объекта на сервере. Проанализируем основные факторы, из-за которых данные не появляются на форме:

  1. Некорректное заполнение поля ЗначенияПолей и Представление: форма считывает строку из табличной части и пытается разобрать структуру из реквизита ЗначенияПолей (XML/JSON-сериализация или строка параметров). Если в ЗначенияПолей записан простой текст без нужной структуры или пропущено обязательное поле Представление, механизм десериализации не может сформировать элемент управления и оставляет поле пустым. При интерактивной записи пустые реквизиты формы перетирают табличную часть.
  2. Несоответствие группы вида контактной информации: справочник ВидыКонтактнойИнформации содержит иерархию, привязанную к конкретным объектам (например, «Справочник "Партнеры"» и «Справочник "Контрагенты"`). Если для партнера указать вид контактной информации, принадлежащий контрагентам или физическим лицам (например, МобильныйТелефонФизическогоЛица вместо ТелефонПартнера), форма партнера проигнорирует эту запись.
  3. Разделение сущностей «Партнеры» и «Контрагенты»: партнер представляет собой управленческую сущность, а контрагент — регламентированное юридическое или физическое лицо. Запись контактных данных в один справочник автоматически не отображает их в карточке другого.

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

Наиболее надежный подход, гарантирующий совместимость при обновлениях конфигурации, — использование штатного API общего модуля УправлениеКонтактнойИнформацией. Метод самостоятельно выполняет сериализацию, формирует правильное представление и заполняет служебные поля.

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


ПартнерОбъект = Справочники.Партнеры.СоздатьЭлемент();
ПартнерОбъект.Наименование = "Новый Клиент";
ПартнерОбъект.Клиент = Истина;
ПартнерОбъект.Записать();

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

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

// Заполняем телефон партнера
ВидТелефона = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;
ТипТелефона = Перечисления.ТипыКонтактнойИнформации.Телефон;
ЗначениеТелефона = "+79991234567";

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

Способ 2. Формирование структуры и сериализация через служебные модули

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

Посмотрим на пример процедур для адреса, телефона и электронной почты:


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

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

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

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

Разберем пример заполнения табличной части:


// Добавление структурированного адреса
СтрокаКИ = ПартнерОбъект.КонтактнаяИнформация.Добавить();
СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.АдресПартнера;
СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
СтрокаКИ.Представление = "г. Москва, ул. Ленина, д. 5, кв. 12";
СтрокаКИ.ЗначенияПолей = "Город = Москва" + Символы.ПС 
                       + "Улица = Ленина" + Символы.ПС 
                       + "Дом = 5" + Символы.ПС 
                       + "Квартира = 12";

// Добавление телефона с предварительной очисткой от спецсимволов
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.Pattern = "[^0-9+]";
ОчищенныйТелефон = RegExp.Replace(ИсходныйТелефон, "");

СтрокаТел = ПартнерОбъект.КонтактнаяИнформация.Добавить();
СтрокаТел.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера;
СтрокаТел.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
СтрокаТел.Представление = ИсходныйТелефон;
СтрокаТел.НомерТелефона = ОчищенныйТелефон;
СтрокаТел.НомерТелефонаБезКодов = Сред(ОчищенныйТелефон, 4);
СтрокаТел.ЗначенияПолей = "НомерТелефона=" + ОчищенныйТелефон;

Чек-лист для проверки корректности записи

  1. Убедитесь, что реквизит Вид ссылается именно на предопределенный или пользовательский элемент из группы Партнеры, а не Контрагенты или Физические лица.
  2. Всегда заполняйте реквизит Представление — именно он используется интерфейсом для первичного отображения строки в поле ввода.
  3. Не оставляйте реквизит ЗначенияПолей с произвольным неформатированным текстом: используйте методы СериализацияКонтактнойИнформации или формат пар Ключ=Значение.
← На главную