Как программно заполнить поле адрес в справочнике Контрагенты в 1С:Бухгалтерия 8.3

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

При интеграции 1С с внешними сервисами (например, при загрузке контрагентов по ИНН/УНП с портала налоговой службы или сторонних API) разработчики часто сталкиваются с проблемой заполнения контактной информации. Вы можете успешно получить строку адреса, записать её в базу данных, но на управляемой форме элемента справочника Контрагенты поле адреса всё равно будет оставаться пустым. Либо, наоборот, данные визуально заполняются, но не сохраняются при записи.

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

---

Почему адрес не заполняется стандартным способом?

Для того чтобы понять суть проблемы, проанализируем архитектуру подсистемы «Контактная информация» в БСП. В старых версиях платформ и конфигураций адреса хранились в обычной табличной части объекта. В современных конфигурациях (таких как «1С:Бухгалтерия», «1С:ERP», «1С:Управление торговлей») логика работы кардинально изменилась:

  1. Динамическое отображение на форме. На управляемой форме элемента справочника нет прямой привязки полей адреса к табличной части КонтактнаяИнформация. Вместо этого БСП динамически генерирует элементы интерфейса при открытии формы. Данные для отображения считываются из специальной коллекции — реквизита формы КонтактнаяИнформацияОписаниеДополнительныхРеквизитов. Если вы просто запишете данные в объект, форма об этом «не узнает» до тех пор, пока элемент не будет закрыт и открыт заново.
  2. Строгая типизация видов контактной информации. Каждый вид адреса привязан к конкретному типу владельца. Разработчики часто путают предопределенные элементы справочника ВидыКонтактнойИнформации. Например, попытка записать адрес контрагента с использованием вида ЮрАдресОрганизации приведет к тому, что БСП проигнорирует запись, так как данный вид предназначен исключительно для собственных организаций, а не для сторонних контрагентов.
  3. Сериализация данных. Адрес в БСП хранится не просто как строка свободного формата, а как сложная структурированная XML или JSON строка (в зависимости от версии БСП), содержащая коды ФИАС/КЛАДР, типы улиц, номера домов и т.д. Простая запись текста в поле представления без формирования внутренней структуры может привести к некорректной работе адреса при попытке его интерактивного редактирования.

---

Вариант 1. Универсальный метод (через обновление данных формы)

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

Этот код необходимо разместить в модуле управляемой формы элемента справочника Контрагенты (например, в обработчике команды заполнения по ИНН):


&НаСервере
Процедура ЗаполнитьАдресКонтрагентаНаСервере(СтрокаАдреса)
    
    // Шаг 1. Получаем правильный вид контактной информации для контрагента.
    // Обратите внимание: используем именно ЮрАдресКонтрагента (или ЮридическийАдресКонтрагента в некоторых конфигурациях)
    ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
    ТипКИ = ВидКИ.Тип;
    
    // Шаг 2. Преобразуем плоскую строку адреса в структурированный XML БСП.
    // Этот метод автоматически упакует произвольный текст в формат, понятный подсистеме контактной информации
    АдресXML = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(СтрокаАдреса, ТипКИ);
    
    // Шаг 3. Записываем подготовленные данные в объект на форме.
    // Метод обновляет табличную часть "КонтактнаяИнформация" в реквизите "Объект"
    УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Объект, АдресXML, ВидКИ, ТипКИ);
    
    // Шаг 4. Принудительно обновляем элементы формы.
    // Без этого вызова пользователь увидит пустые поля на экране, хотя в объекте данные уже изменены
    УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтотОбъект, Объект);
    
КонецПроцедуры

Проанализируем детально, что происходит на каждом шаге:

---

Вариант 2. Прямое заполнение коллекции формы (для новых версий БСП)

В более современных версиях БСП (начиная с версий 3.0 и выше) работа с контактной информацией на форме полностью абстрагирована. Форма управляет адресами через коллекцию КонтактнаяИнформацияОписаниеДополнительныхРеквизитов. Мы можем обойтись без непосредственной перезаписи объекта на форме и внести изменения напрямую в коллекцию отображения.

Давайте посмотрим на пример реализации этого подхода:


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

Этот способ работает очень быстро, так как исключает лишние серверные вызовы по перезаписи табличных частей объекта. При сохранении элемента справочника сама платформа перенесет измененные данные из коллекции формы в физическую таблицу базы данных.

---

Рекомендации по отладке и частые ошибки

Если после внедрения кода адрес все равно не отображается, рекомендуем проверить следующие моменты:

  1. Проверьте точное имя предопределенного элемента. В разных локализациях и версиях конфигураций имя предопределенного элемента может отличаться. Проверьте в конфигураторе или через запуск в режиме предприятия справочник ВидыКонтактнойИнформации. Для контрагентов это может быть ЮрАдресКонтрагента, ЮридическийАдресКонтрагента или АдресКонтрагента.
  2. Использование служебных модулей. Не используйте методы из модулей с суффиксом Служебный (например, УправлениеКонтактнойИнформациейСлужебный или КонтактнаяИнформацияСлужебный). Эти модули могут менять свой экспортный интерфейс при обновлениях конфигурации. Всегда используйте публичный программный интерфейс общего модуля УправлениеКонтактнойИнформацией.
  3. Контекст выполнения. Всегда выполняйте процедуры изменения контактной информации на сервере (&НаСервере), так как работа со справочниками видов контактной информации и сериализация XML/JSON требуют обращения к базе данных и недоступны на тонком клиенте.

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

← На главную