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