При разработке механизмов загрузки данных в современные конфигурации на базе БСП (такие как 1С:Комплексная автоматизация 2.4, ERP 2.5 или УТ 11) программисты часто сталкиваются с ситуацией: данные в табличную часть КонтактнаяИнформация записываются, но адрес не разделяется на город, улицу и дом, а телефон вовсе не отображается в интерфейсе карточки контрагента. Разберем детально, почему это происходит и как правильно организовать программную запись контактной информации.
В коде часто используется метод КонтактнаяИнформацияXMLПоПредставлению. Важно понимать, что этот метод является эвристическим анализатором. Он пытается «угадать» структуру адреса, основываясь на текстовой строке. Проанализируем ситуацию: чтобы этот механизм сработал корректно и разложил адрес по полям (муниципальное или административно-территориальное деление), должны соблюдаться два условия:
Посмотрим на пример кода, который часто приводит к ошибке «неразбитого» адреса:
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
XMLПредставление = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(ТекстАдреса, ВидИнформации);
МодульУправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентСсылка, XMLПредставление, ВидИнформации, ТипИнформации);
Если ТекстАдреса содержит специфические сокращения или ошибки, которые анализатор не смог распознать, вы получите заполненное поле Представление в табличной части, но скрытая колонка ЗначенияПолей останется пустой или неполной. Именно из колонки ЗначенияПолей (в формате XML или JSON) форма 1С берет данные для отображения в детализированных полях.
Выясним причину, по которой данные есть в табличной части, но их «не видно» в карточке. Это происходит из-за строгого контроля метаданных в справочнике ВидыКонтактнойИнформации. Проанализируем ключевые моменты:
Перечисления.ТипыКонтактнойИнформации.Адрес, для телефона — Перечисления.ТипыКонтактнойИнформации.Телефон. Ошибка в этом поле приведет к тому, что стандартные обработчики формы не смогут инициализировать элемент управления.ЗначенияПолей, а вы записываете туда старый XML, форма может отобразить пустое значение, несмотря на наличие данных в базе.Чтобы гарантированно получить разбитый по полям адрес, особенно при использовании сервиса «1С:Контрагент», рекомендуется использовать методы, возвращающие уже готовую структуру, а не просто текстовое представление. Разберем по шагам, как это реализовать:
// 1. Получаем структурированные данные от сервиса или формируем вручную
ДанныеАдреса = Новый Структура;
ДанныеАдреса.Вставить("Город", "Москва");
ДанныеАдреса.Вставить("Улица", "Ленина");
ДанныеАдреса.Вставить("Дом", "1");
// 2. Преобразуем структуру в формат хранения (JSON/XML)
// Используем метод, который понимает текущая версия БСП
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(ДанныеАдреса, ВидИнформации);
// 3. Записываем данные в объект
НоваяСтрока = ОбъектКонтрагент.КонтактнаяИнформация.Добавить();
НоваяСтрока.Вид = ВидИнформации;
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяСтрока.Представление = "г. Москва, ул. Ленина, д. 1";
НоваяСтрока.ЗначенияПолей = ЗначенияПолей;
Для телефона ситуация аналогична. Если вы запишете только представление «+7 (999) 000-00-00», в карточке может быть пусто, так как поле ввода телефона ожидает разбивку на код страны, код города и номер. Проанализируем структуру телефона в формате ЗначенияПолей:
// Правильное формирование данных телефона
СтруктураТелефона = Новый Структура;
СтруктураТелефона.Вставить("КодСтраны", "7");
СтруктураТелефона.Вставить("КодГорода", "999");
СтруктураТелефона.Вставить("Номер", "0000000");
СтруктураТелефона.Вставить("Добавочный", "");
// Преобразование и запись
ЗначенияПолейТелефона = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(СтруктураТелефона, ВидТелефона);
Если данные всё равно не отображаются, выполните следующие действия:
КонтактнаяИнформация у объекта. Обратите особое внимание на колонку Вид. Это должна быть ссылка на элемент справочника ВидыКонтактнойИнформации, который входит в группу «Контактная информация справочника Контрагенты».Объект.Записать(). Если вы используете процедуру УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию, она записывает данные напрямую в базу, поэтому объект в памяти нужно перечитать (ОбновитьКонтактнуюИнформацию).Таким образом, для успешной разбивки адреса необходимо либо обеспечить наличие классификатора для работы парсера, либо передавать уже готовую структуру полей. Для корректного отображения данных на форме критически важно соблюдать соответствие Вида контактной информации и формата хранения данных (JSON или XML) в колонке ЗначенияПолей.