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

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

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

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

Анализ типовой ошибки при заполнении табличной части

Рассмотрим исходный код, который часто пытаются использовать разработчики:


&НаСервере
Процедура ДобавлениеАдр(НашКод, КРегион, КГород)
    Элемен = Справочники.ФизическиеЛица.НайтиПоКоду(НашКод).ПолучитьОбъект();
    СтрокаСостава = Элемен.КонтактнаяИнформация.Добавить();
    СтрокаСостава.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
    СтрокаСостава.Страна = "Россия";
    СтрокаСостава.Регион = КРегион;
    СтрокаСостава.Город = КГород;
    Элемен.Записать();
КонецПроцедуры

Проанализируем, почему этот подход не работает в типовых решениях на базе Библиотеки стандартных подсистем (БСП):

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

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

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

Рассмотрим пример формирования структуры адреса и его записи через штатный API:


// 1. Получаем объект физического лица
ОбъектФизЛицо = Справочники.ФизическиеЛица.НайтиПоКоду(НашКод).ПолучитьОбъект();

// 2. Формируем описание структуры контактной информации
АдресСтруктура = УправлениеКонтактнойИнформацией.ОписаниеНовойКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес);
АдресСтруктура.country = "РОССИЯ";
АдресСтруктура.area = КРегион;
АдресСтруктура.city = КГород;

// 3. Преобразуем структуру в формат хранения (JSON или XML в зависимости от версии БСП)
ЗначениеДляЗаписи = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(АдресСтруктура);

// 4. Записываем контактную информацию в объект
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;

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

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

Способ 2. Запись адреса в виде произвольной строки

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


ТекстАдреса = "г. Москва, ул. Ленина, д. 10";
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;

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

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

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

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

Выясним структуру XML-пакета, которая используется для хранения адреса в формате БСП:


СтрокаСостава = Элемен.КонтактнаяИнформация.Добавить();
СтрокаСостава.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
СтрокаСостава.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
СтрокаСостава.Представление = "Россия, " + КРегион + ", " + КГород;

// Формируем XML-структуру для ЗначенияПолей
ТекстXML = 
"<КонтактнаяИнформация xmlns=""http://www.v8.1c.ru/ssl/contactinfo"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" Представление=""" + СтрокаСостава.Представление + """>" +
    "<Комментарий/>" +
    "<Состав xsi:type=""Адрес"" Страна=""РОССИЯ"">" +
        "<Состав xsi:type=""АдресРФ"">" +
            "<СубъектРФ>" + КРегион + "</СубъектРФ>" +
            "<Город>" + КГород + "</Город>" +
        "</Состав>" +
    "</Состав>" +
"</КонтактнаяИнформация>";

СтрокаСостава.ЗначенияПолей = ТекстXML;
Элемен.Записать();

Важное ограничение: ручное формирование XML/JSON не связывает адрес с классификатором ФИАС/ГАР и не заполняет служебные идентификаторы (ОКТМО, GUID элементов). Для задач регламентированной отчетности и сдачи сведений в государственные органы всегда отдавайте предпочтение штатным функциям подсистемы УправлениеКонтактнойИнформацией.

← На главную