Программная работа с контактной информацией (КИ) в современных конфигурациях 1С, таких как Управление торговлей 11.4, ERP 2.4 или Комплексная автоматизация 2, часто вызывает затруднения у разработчиков. Это связано с переходом подсистемы «Контактная информация» (в составе БСП) на новый формат хранения данных. Если раньше основным форматом был XML, то начиная с версии БСП 3.0, приоритет отдается формату JSON. В этой статье мы подробно разберем, как правильно заполнять адреса программно, почему данные могут не отображаться в интерфейсе и как избежать типичных ошибок, связанных с типизацией видов КИ.
Прежде чем переходить к коду, давайте проанализируем, как данные хранятся в табличных частях объектов. Обычно это табличная часть КонтактнаяИнформация. В ней есть несколько ключевых полей:
ТипыКонтактнойИнформации (Адрес, Телефон, E-mail и т.д.).ВидыКонтактнойИнформации. Это критически важное поле.Рассмотрим распространенную ситуацию: разработчик пытается заполнить адрес для справочника Партнеры, но использует вид контактной информации, предназначенный для Контрагентов. В этом случае система проигнорирует запись или она просто не отобразится в карточке объекта, так как механизмы БСП фильтруют КИ по владельцу.
Одной из главных причин неудач при программном заполнении является "замыленный глаз" программиста. В конфигурациях, основанных на УТ 11, справочники Партнеры и Контрагенты разделены. Следовательно, и виды КИ у них разные.
Например, попытка использовать Справочники.ВидыКонтактнойИнформации.ФактАдресОрганизации для записи адреса партнера приведет к тому, что в базе запись появится, но в форме партнера вы ее не увидите. Для партнеров следует использовать соответствующие предопределенные элементы или искать их в группе, относящейся к метаданным Справочник.Партнеры. Например, Справочники.ВидыКонтактнойИнформации.АдресПартнера.
Рассмотрим пошагово, как программно сформировать адрес в "свободной форме". Это наиболее частая задача, когда нам нужно просто записать строку адреса, не разбирая её по классификатору ФИАС (ГАР).
Для начала воспользуемся методами общего модуля УправлениеКонтактнойИнформацией. Проанализируем пример кода, который формирует необходимые структуры JSON и XML:
// Определяем вид КИ и объект-владелец
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПартнера; // Важно выбрать правильный вид!
ОбъектПартнер = СсылкаНаПартнера.ПолучитьОбъект();
ПредставлениеАдреса = "197374, г. Санкт-Петербург, ул. Планерная, д. 20";
// Получаем структуру КИ по представлению.
// БСП попытается разобрать строку, но для свободного формата нам важен сам факт генерации структуры.
ЗначениеJSON = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, ВидКИ);
ЗначенияПолейXML = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(ПредставлениеАдреса, ВидКИ);
// Очистим старую информацию этого вида, если она была
СтрокиДляУдаления = ОбъектПартнер.КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", ВидКИ));
Для Каждого Стр Из СтрокиДляУдаления Цикл
ОбъектПартнер.КонтактнаяИнформация.Удалить(Стр);
КонецЦикла;
// Добавляем новую строку
НоваяСтрока = ОбъектПартнер.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = ВидКИ.Тип;
НоваяСтрока.Вид = ВидКИ;
НоваяСтрока.Представление = ПредставлениеАдреса;
НоваяСтрока.Значение = ЗначениеJSON;
НоваяСтрока.ЗначенияПолей = ЗначенияПолейXML;
// Если в метаданных ТЧ есть поле ВидДляСписка (характерно для новых БСП), его тоже нужно заполнить
Если ОбщегоНазначения.ЕстьРеквизитТабличнойЧастиОбъекта("ВидДляСписка", "КонтактнаяИнформация", ОбъектПартнер.Метаданные()) Тогда
НоваяСтрока.ВидДляСписка = ВидКИ;
КонецЕсли;
ОбъектПартнер.Записать();
Выясним, почему просто заполнить Представление недостаточно. Механизмы БСП при открытии формы адреса считывают данные из поля Значение (JSON). Если это поле пустое или содержит некорректную структуру, форма редактирования адреса откроется пустой, даже если в представлении на основной форме текст виден.
Структура JSON для адреса в свободной форме должна выглядеть примерно так:
{
"value": "г. Санкт-Петербург, ул. Планерная, д. 20",
"type": "Адрес",
"addressType": "FreeForm",
"country": "РОССИЯ",
"countryCode": "643"
}
Обратите внимание на параметр addressType. Значение FreeForm (или в некоторых версиях ВСвободнойФорме) сообщает системе, что адрес не нужно валидировать по классификатору. Также рекомендуется всегда заполнять countryCode (код страны по ОКСМ, для России — 643), так как без этого некоторые отчеты и печатные формы могут работать некорректно.
В составе БСП есть более высокоуровневый метод, который позволяет упростить процедуру. Проанализируем ситуацию, когда мы хотим использовать типовой механизм добавления, не заботясь о ручном заполнении строк табличной части. Выясним, как работает метод ДобавитьКонтактнуюИнформацию.
ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресПартнера;
Представление = "Россия, г. Москва, ул. Ленина, д. 1";
// Подготавливаем данные КИ
РезультатКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(Представление, ВидКИ);
// Используем программный интерфейс БСП для добавления
// Важно: если передаем объект, метод модифицирует его коллекцию в памяти.
// Если передаем ссылку, метод может создать запись в регистре (если настройки КИ это предполагают).
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(ОбъектПартнер, РезультатКИ, ВидКИ);
// Не забываем записывать объект-владелец
ОбъектПартнер.Записать();
Важный момент: если вы используете метод ДобавитьКонтактнуюИнформацию, и при этом в настройках Вида КИ стоит запрет на редактирование или включена проверка корректности, метод может вернуть пустой результат, если строка Представление не прошла валидацию. Поэтому для произвольных строк всегда проверяйте настройки самого Вида КИ в режиме "1С:Предприятие" (флажок "Разрешать ввод в свободной форме").
Подведем итог нашего анализа. Для успешного программного заполнения адреса в УТ 11.4 / БСП 3.0 необходимо соблюдать три условия:
КонтактнаяИнформацияПоПредставлению и КонтактнаяИнформацияXMLПоПредставлению для генерации корректных строк.Вид в поле ВидДляСписка, если оно присутствует в вашей версии конфигурации.Если после выполнения кода данные всё равно не видны, проверьте запрос к табличной части через "Консоль запросов". Если данные в ТЧ есть, но в форме их нет — проблема в 100% случаев связана с неверным Видом КИ. Система просто не находит нужную строку, так как ожидает увидеть Адрес партнера, а находит Фактический адрес организации.