При разработке обработок загрузки данных из внешних файлов программисты часто сталкиваются с ситуацией: процедура добавления контактной информации отрабатывает без ошибок, объект записывается, однако в пользовательском интерфейсе карточки физического лица адрес остается пустым либо не отображается в списке.
Разберем по шагам, почему простая запись в реквизиты табличной части не дает результата и как правильно сохранять контактную информацию в современных конфигурациях 1С.
Рассмотрим исходный код, который часто пытаются использовать разработчики:
&НаСервере
Процедура ДобавлениеАдр(НашКод, КРегион, КГород)
Элемен = Справочники.ФизическиеЛица.НайтиПоКоду(НашКод).ПолучитьОбъект();
СтрокаСостава = Элемен.КонтактнаяИнформация.Добавить();
СтрокаСостава.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
СтрокаСостава.Страна = "Россия";
СтрокаСостава.Регион = КРегион;
СтрокаСостава.Город = КГород;
Элемен.Записать();
КонецПроцедуры
Проанализируем, почему этот подход не работает в типовых решениях на базе Библиотеки стандартных подсистем (БСП):
Страна, Регион, Город, Улица и подобные оставлены в табличной части КонтактнаяИнформация преимущественно для обратной совместимости. Формы объектов и отчетов напрямую эти поля не читают.ЗначенияПолей (в формате XML для БСП 2.x или JSON в БСП 3.x).Представление. Если реквизиты ЗначенияПолей и Представление не заполнены, для пользователя строка выглядит абсолютно пустой.КонтактнаяИнформация.Для корректной работы с контактной информацией без ручной сборки сложных XML- или JSON-строк рекомендуется использовать экспортные методы подсистемы БСП из общего модуля УправлениеКонтактнойИнформацией.
Рассмотрим пример формирования структуры адреса и его записи через штатный API:
// 1. Получаем объект физического лица
ОбъектФизЛицо = Справочники.ФизическиеЛица.НайтиПоКоду(НашКод).ПолучитьОбъект();
// 2. Формируем описание структуры контактной информации
АдресСтруктура = УправлениеКонтактнойИнформацией.ОписаниеНовойКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес);
АдресСтруктура.country = "РОССИЯ";
АдресСтруктура.area = КРегион;
АдресСтруктура.city = КГород;
// 3. Преобразуем структуру в формат хранения (JSON или XML в зависимости от версии БСП)
ЗначениеДляЗаписи = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(АдресСтруктура);
// 4. Записываем контактную информацию в объект
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ОбъектФизЛицо, ЗначениеДляЗаписи, ВидКИ, ТипКИ);
Штатная процедура ЗаписатьКонтактнуюИнформацию самостоятельно определит место хранения данных (табличная часть или регистр сведений), сформирует корректное Представление и обновит сериализованные данные.
Если из внешнего файла поступает неразбитый текст адреса и нет возможности точно сопоставить отдельные поля (регион, город, улицу), можно воспользоваться механизмом преобразования строки в контактную информацию:
ТекстАдреса = "г. Москва, ул. Ленина, д. 10";
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
ОбъектXDTO = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(ТекстАдреса, ТипКИ);
ЗначениеXML = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTO);
ОбъектФизЛицо = Справочники.ФизическиеЛица.НайтиПоКоду(НашКод).ПолучитьОбъект();
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ОбъектФизЛицо, ЗначениеXML, ВидКИ, ТипКИ);
Если по какой-то причине штатные методы подсистемы недоступны, необходимо заполнять реквизиты Представление и ЗначенияПолей вручную.
Выясним структуру 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 элементов). Для задач регламентированной отчетности и сдачи сведений в государственные органы всегда отдавайте предпочтение штатным функциям подсистемы УправлениеКонтактнойИнформацией.