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

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

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

Разберем механизм работы функции формирования XML

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

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

Посмотрим на пример кода, который часто приводит к ошибке «неразбитого» адреса:


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

Если ТекстАдреса содержит специфические сокращения или ошибки, которые анализатор не смог распознать, вы получите заполненное поле Представление в табличной части, но скрытая колонка ЗначенияПолей останется пустой или неполной. Именно из колонки ЗначенияПолей (в формате XML или JSON) форма 1С берет данные для отображения в детализированных полях.

Проблема видимости телефона и адреса на форме

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

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

Рассмотрим правильный способ записи через структуру

Чтобы гарантированно получить разбитый по полям адрес, особенно при использовании сервиса «1С:Контрагент», рекомендуется использовать методы, возвращающие уже готовую структуру, а не просто текстовое представление. Разберем по шагам, как это реализовать:


// 1. Получаем структурированные данные от сервиса или формируем вручную
ДанныеАдреса = Новый Структура;
ДанныеАдреса.Вставить("Город", "Москва");
ДанныеАдреса.Вставить("Улица", "Ленина");
ДанныеАдреса.Вставить("Дом", "1");

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

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

Особенности работы с номерами телефонов

Для телефона ситуация аналогична. Если вы запишете только представление «+7 (999) 000-00-00», в карточке может быть пусто, так как поле ввода телефона ожидает разбивку на код страны, код города и номер. Проанализируем структуру телефона в формате ЗначенияПолей:


// Правильное формирование данных телефона
СтруктураТелефона = Новый Структура;
СтруктураТелефона.Вставить("КодСтраны", "7");
СтруктураТелефона.Вставить("КодГорода", "999");
СтруктураТелефона.Вставить("Номер", "0000000");
СтруктураТелефона.Вставить("Добавочный", "");

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

Рекомендации по отладке

Если данные всё равно не отображаются, выполните следующие действия:

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

← На главную