Как программно заполнить контактную информацию БСП и сразу обновить ее на форме?

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

Приветствуем вас! При разработке различных интеграций — например, автозаполнения реквизитов контрагента по ИНН через внешние сервисы (Интерфакс, DaData и другие) — разработчики часто сталкиваются с одной и той же неприятной особенностью Библиотеки стандартных подсистем (БСП). Мы пишем красивый код, заполняем контактную информацию в объекте, но на открытой форме пользователя новые адреса и телефоны упорно не отображаются до тех пор, пока карточка не будет закрыта и открыта заново.

Давайте подробно разберем, почему так происходит, проанализируем внутренние механизмы работы подсистемы «Контактная информация» БСП и рассмотрим правильные технические решения этой задачи.

Выясняем причину: почему стандартное заполнение не обновляет форму

Дело в том, что БСП не выводит табличную часть КонтактнаяИнформация напрямую на управляемую форму. Вместо этого при создании формы программно генерируются динамические реквизиты вида КонтактнаяИнформацияПоле[УникальныйИдентификатор]. Связующим звеном выступает служебная таблица значений на форме — КонтактнаяИнформацияОписаниеДополнительныхРеквизитов. В ней хранятся метаданные полей, их представления и XML/JSON-структуры.

Если мы просто добавим записи в табличную часть Объект.КонтактнаяИнформация на сервере, динамические реквизиты формы останутся пустыми. Переоткрытие карточки решает проблему только потому, что при инициализации формы БСП заново считывает данные из объекта и заполняет свои динамические структуры. Наша задача — научить форму обновляться мгновенно «на лету» без лишних действий со стороны пользователя.

Решение 1. Обновление через служебную таблицу формы (Рекомендуемый способ)

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

Разберем по шагам реализацию этого метода на сервере:


&НаСервере
Процедура ЗаполнитьПолеКонтактнойИнформацииНаФорме(ВидКИ, ПредставлениеАдреса, XMLЗначение = "", JSONЗначение = "")
    
    // Шаг 1. Ищем строку метаданных для конкретного вида контактной информации
    Отбор = Новый Структура("Вид", ВидКИ);
    СтрокиМетаданных = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
    
    Если СтрокиМетаданных.Количество() > 0 Тогда
        ДанныеСтроки = СтрокиМетаданных[0];
        
        // Шаг 2. Заполняем служебную строку актуальными данными
        ДанныеСтроки.Представление = ПредставлениеАдреса;
        ДанныеСтроки.ЗначенияПолей = XMLЗначение; // XML, сформированный по схеме XDTO
        ДанныеСтроки.Значение       = JSONЗначение; // JSON-формат для новых версий БСП
        
        // Шаг 3. Записываем значение в динамический реквизит формы
        ИмяРеквизитаФормы = ДанныеСтроки.ИмяРеквизита;
        ЭтотОбъект[ИмяРеквизитаФормы] = ПредставлениеАдреса;
    КонецЕсли;
    
КонецПроцедуры

Преимущество этого метода заключается в том, что он работает исключительно в контексте формы. Когда пользователь нажмет кнопку «Записать», стандартные механизмы БСП сами увидят изменения в этой таблице, корректно перенесут их в объект и сохранят в базу данных.

Решение 2. Полная реинициализация контактной информации на форме

Проанализируем ситуацию, когда нам необходимо заполнить сразу большой объем контактной информации (юридический, фактический, почтовый адреса, несколько телефонов, email). В этом случае точечное заполнение строк может перегрузить код. Мы можем пойти путем перезапуска стандартной инициализации БСП.

Для этого выполним следующие действия:

  1. Очистим или заполним новыми данными табличную часть Объект.КонтактнаяИнформация.
  2. Программно очистим значения динамических реквизитов формы, чтобы избежать конфликтов наложения данных.
  3. Вызовем повторную инициализацию формы с помощью стандартного метода БСП: УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация").

Важно: Стоит учитывать, что этот способ более ресурсоемкий, так как платформа заново генерирует элементы интерфейса, что может вызвать визуальное «моргание» формы у пользователя.

Важный нюанс: Правильное форматирование данных (XML и JSON)

Просто передать строку «г. Москва, ул. Ленина, д. 1» в поле адреса недостаточно. Если пользователь попытается открыть детальную форму ввода адреса (где выбираются регион, город, улица), она окажется пустой, так как система ожидает структурированные данные ФИАС/ГАР.

БСП требует, чтобы адреса и телефоны хранились в виде сериализованного XML или JSON. Чтобы сделать это правильно, мы должны типизировать текстовые строки. Посмотрим на пример использования встроенных функций БСП:


// Получение структурированного XML по текстовому представлению
ОбъектXDTO = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(ТекстАдреса, Перечисления.ТипыКонтактнойИнформации.Адрес);
СтрокаXML = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTO);

Для новых версий конфигураций на платформе 1С, где активно используется формат JSON, применяются методы взаимного преобразования, такие как УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXMLВJSON.

Использование этих методов гарантирует, что адрес не просто отобразится на форме в виде текста, но и будет полностью валидным для интеграции с государственными адресными реестрами.

Таким образом, комбинируя правильную типизацию контактной информации и обновление динамических реквизитов через служебную таблицу формы БСП, мы получаем стабильное, быстрое и полностью стандартное решение, которое не «ломает» логику типовых конфигураций.

← На главную