Программное заполнение контактной информации — одна из частых задач при загрузке данных о контрагентах из внешних систем или файлов. Однако при работе с типовыми конфигурациями на базе Библиотеки стандартных подсистем (БСП) разработчики нередко сталкиваются с ситуацией, когда добавленный адрес не отображается на форме контрагента либо система выдает предупреждение «Некорректный формат контактной информации». Разберем по шагам, почему возникают эти ошибки и как правильно записывать адресные данные контрагентов.
Рассмотрим частый сценарий: разработчик пытается вручную собрать 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"";" +
"Представление=""" + ТекущийАдрес[1] + """><Комментарий/><Состав xsi:type=""Адрес"" Страна=""РОССИЯ""><Состав xsi:type=""АдресРФ""><ОКТМО>0</ОКТМО><ДопАдрЭл ТипАдрЭл=""10100000"" Значение=""""/>" +
"<Адрес_по_документу>" + ТекущийАдрес[1] + "</Адрес_по_документу></Состав></Состав></КонтактнаяИнформация>";
НоваяСтрока = НовыйОбъект.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Юридический адрес");
НоваяСтрока.Представление = ТекущийАдрес[1];
НоваяСтрока.ЗначенияПолей = xmlАдрес;
В этом коде кроются сразу две критические проблемы:
ВидыКонтактнойИнформации элементы сгруппированы по владельцам. Вызов метода НайтиПоНаименованию("Юридический адрес") может вернуть элемент для организации, физического лица или контактного лица, а не контрагента. Если вид привязан к другому справочнику, форма контрагента проигнорирует эту строку и адрес не отобразится. Для контрагентов следует обращаться к предопределенному элементу: Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента (или ФактАдресКонтрагента).xmlns="...contactinfo";) или нарушение структуры пакета XDTO http://www.v8.1c.ru/ssl/contactinfo делают строку нечитаемой. При открытии формы БСП пытается выполнить десериализацию и выдает сообщение «Некорректный формат контактной информации». Кроме того, в более новых версиях БСП формат хранения изменился с XML на JSON.Проанализируем самый быстрый способ, когда адрес требуется сохранить исключительно в текстовом виде (в свободной форме) без привязки к адресному классификатору (ФИАС/ГАР). Для этого достаточно заполнить текстовое представление и оставить поле ЗначенияПолей пустым:
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
// Находим существующую строку или добавляем новую
СтрокаКИ = КонтрагентОбъект.КонтактнаяИнформация.Найти(
Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента,
"Вид"
);
Если СтрокаКИ = Неопределено Тогда
СтрокаКИ = КонтрагентОбъект.КонтактнаяИнформация.Добавить();
СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
КонецЕсли;
СтрокаКИ.Представление = ТекстовыйАдрес;
СтрокаКИ.ЗначенияПолей = "";
КонтрагентОбъект.Записать();
Важное ограничение: этот способ подходит для простых задач отображения адреса на форме и в печатных формах первичных документов. Однако при выгрузке регламентированной отчетности (например, деклараций по НДС), формировании файлов для ФНС или использовании модуля 1С:ЭДО программа обращается к структурированным данным (ОКТМО, код региона, коды ФИАС/ГАР). Если поле ЗначенияПолей не заполнено, электронные документы не пройдут форматно-логический контроль.
Выясним, как подсистема управления контактной информацией БСП позволяет решать эту задачу корректно. Чтобы не формировать служебные строки вручную, воспользуемся штатным API подсистемы.
Для версий БСП 2.x (включая конфигурации 1С:Бухгалтерия 3.0 на этой версии библиотеки) предназначен общий модуль УправлениеКонтактнойИнформацией:
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
// Формируем корректный сериализованный XML с помощью штатного метода БСП
ЗначенияПолейXML = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(
ТекстовыйАдрес,
ВидАдреса
);
// Записываем данные в табличную часть объекта
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(
КонтрагентОбъект,
ЗначенияПолейXML,
ВидАдреса,
Перечисления.ТипыКонтактнойИнформации.Адрес
);
// Метод ЗаписатьКонтактнуюИнформацию только изменяет табличную часть,
// поэтому обязательна явная запись самого объекта:
КонтрагентОбъект.Записать();
Разберем подробнее, что выполняет процедура УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию:
Представление.Если требуется низкоуровневая конвертация строки в XML по схеме XDTO, можно использовать функции служебного модуля:
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;
// Преобразование строки представления в объект XDTO
ОбъектXDTO = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(
ТекстовыйАдрес,
ТипКИ
);
// Сериализация объекта XDTO в XML-строку
ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTO);
Использование официального API БСП гарантирует валидность структуры XML (или JSON в более поздних версиях), предотвращает ошибки десериализации на форме и обеспечивает корректную работу типовых проверок конфигурации.