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