Как программно добавить адрес контрагента в 1С:УНФ и не записать его простой строкой?

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

При программном создании или обновлении контрагентов в 1С:УНФ часто возникает задача добавить адрес. Многие начинающие разработчики сталкиваются с проблемой: простая запись адреса в виде строки в соответствующее поле не работает или работает некорректно. Давайте вместе разберемся, почему так происходит и как правильно решить эту задачу, используя стандартные механизмы платформы.

Выясним причину проблемы. Ключевая особенность хранения контактной информации в типовых конфигурациях 1С, включая УНФ, заключается в том, что она хранится не в виде простой строки, а в структурированном формате XML. Это позволяет системе корректно разбирать адрес на составные части (индекс, город, улица) и использовать его в печатных формах и отчетах. Прямая запись строки "г. Москва, ул. Ленина, д. 1" в поле адреса приведет к ошибке, так как система ожидает XML-данные.

Рассмотрим несколько подходов к решению этой задачи.

Решение 1: Используем стандартные механизмы Библиотеки стандартных подсистем (БСП)

Это самый правильный и рекомендуемый способ, который обеспечивает совместимость и корректность данных. Он заключается в использовании готовых функций и процедур из общего модуля УправлениеКонтактнойИнформацией. Разберем по шагам, как это сделать.

  1. Подготовка структуры с данными адреса.

    Сначала нам нужно создать структуру, которая будет содержать все части адреса. Для этого идеально подходит функция ОписаниеНовойКонтактнойИнформации, которой мы сообщаем, что хотим создать именно "Адрес".

    
    // Создаем структуру для нового адреса
    СтруктураАдреса = УправлениеКонтактнойИнформацией.ОписаниеНовойКонтактнойИнформации("Адрес");
    
  2. Заполнение полей структуры.

    Теперь, когда у нас есть "шаблон" адреса, заполним его конкретными значениями. Поля структуры интуитивно понятны.

    
    // Заполняем поля адреса
    ЗаполнитьЗначенияСвойств(СтруктураАдреса, Новый Структура(
        "Страна, Регион, Город, Улица, Дом, Корпус",
        "РОССИЯ", "77 г. Москва", "Москва", "Лесная", "10", "1"
    ));
    
    // Также можно заполнять поля по отдельности
    СтруктураАдреса.Индекс = "125047";
    
  3. Преобразование структуры в XML.

    Система не может напрямую записать структуру. Ее нужно преобразовать в текстовое представление XML. Для этого в БСП есть специальная служебная функция КонтактнаяИнформацияXDTOВXML.

    
    // Преобразуем заполненную структуру в XML-строку
    АдресXML = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(СтруктураАдреса);
    
  4. Запись контактной информации.

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

    
    // Получаем ссылку на нашего контрагента
    СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
    
    // Добавляем адрес
    УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(
        СсылкаНаКонтрагента,
        АдресXML,
        Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента // Указываем вид адреса
    );
    

    Важный момент: убедитесь, что вид контактной информации (в примере это ЮрАдресКонтрагента) существует в вашем справочнике ВидыКонтактнойИнформации и имеет тип "Адрес".

Решение 2: Анализ существующей записи и создание по аналогии

Иногда бывает полезно посмотреть, как система хранит уже существующий, корректно введенный адрес. Этот метод поможет лучше понять структуру данных и может быть полезен для отладки.

  1. Найдите контрагента с уже заполненным адресом через пользовательский интерфейс.

  2. Получите его контактную информацию программно. Используйте функцию КонтактнаяИнформацияОбъекта, чтобы выгрузить все данные в таблицу.

    
    СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоНаименованию("ООО Лютик");
    ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаКонтрагента);
    
    // Теперь можно проанализировать содержимое таблицы в отладчике
    // Нас интересует колонка "Представление" и "ЗначениеXML" (или похожее название)
    
  3. Проанализируйте полученную XML-строку. Вы увидите структуру, которую 1С использует для хранения адреса. На основе этого анализа вы сможете формировать свои XML-строки для записи, хотя подход из первого решения является более надежным, так как он не зависит от возможных изменений в формате XML в будущих версиях конфигурации.

Решение 3: Использование внешних сервисов

Для автоматизации и повышения точности ввода адресов можно интегрировать 1С с внешними сервисами, такими как "DaData.ru". Такие сервисы по ИНН или названию компании могут вернуть не только реквизиты, но и адрес, уже приведенный к стандартному формату ФИАС/КЛАДР.

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

← К списку