Как программно получить адрес доставки из реализации в 1С:УТ 10.3, если он введен вручную?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В типовой конфигурации «Управление торговлей 10.3» разработчики часто сталкиваются с ситуацией, когда прямое обращение к реквизиту документа АдресДоставки возвращает пустую строку, хотя на форме адрес заполнен. Это происходит из-за особенностей архитектуры хранения контактной информации. Давайте подробно разберем, почему так происходит, и как правильно извлечь эти данные программным способом.

Почему стандартное обращение через точку не работает?

Проанализируем ситуацию: в документе РеализацияТоваровУслуг действительно существует реквизит АдресДоставки. Однако в УТ 10.3 реализован сложный механизм работы с контактной информацией. Когда пользователь вводит адрес вручную (не выбирая его из карточки контрагента), система может вести себя двояко:

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

Если Ссылка.АдресДоставки возвращает пустоту, значит, ваш случай — второй. Адрес стал «записью регистра», привязанной к конкретному документу.

Метод 1. Получение адреса с помощью запроса к регистру сведений

Это самый надежный и быстрый способ получения данных. Нам необходимо обратиться к регистру КонтактнаяИнформация. Важно помнить, что при ручном вводе адреса без использования классификатора, вся текстовая строка попадает в поле Представление. Поля Город, Улица и другие при этом могут оставаться пустыми.

Рассмотрим пример кода для получения адреса через запрос:


Функция ПолучитьРучнойАдресДоставки(СсылкаНаДокумент) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	КонтактнаяИнформация.Представление КАК Адрес
        |ИЗ
        |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        |ГДЕ
        |	КонтактнаяИнформация.Объект = &Объект
        |	И КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
        |	И КонтактнаяИнформация.Вид = &ВидАдреса";
    
    // В УТ 10.3 вид адреса обычно называется "Адрес доставки"
    // Его можно найти в справочнике ВидыКонтактнойИнформации
    ВидАдресаДоставки = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Адрес доставки");
    
    Запрос.УстановитьПараметр("Объект", СсылкаНаДокумент);
    Запрос.УстановитьПараметр("ВидАдреса", ВидАдресаДоставки);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Адрес;
    КонецЕсли;
    
    Возврат "";
    
КонецФункции

Важный нюанс: Обратите внимание на условие КонтактнаяИнформация.Объект = &Объект. Мы передаем туда ссылку на сам документ Реализация товаров и услуг. Именно это позволяет найти адрес, который был вписан «руками» в конкретной сделке, даже если он отличается от юридического или фактического адреса контрагента в его карточке.

Метод 2. Использование типовых функций конфигурации

В конфигурации УТ 10.3 предусмотрены общие модули для работы с контактной информацией. Вместо написания собственных запросов, мы можем воспользоваться встроенными инструментами. Проанализируем возможности модуля УправлениеКонтактнойИнформацией.

Для получения представления адреса можно использовать функцию ПолучитьПредставлениеСоставаОбъекта или аналогичные методы. Однако наиболее простым и «чистым» способом будет обращение к функции получения адреса по объекту.


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

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

Если ЗначениеЗаполнено(АдресСтрокой) Тогда
    Сообщить("Найден адрес доставки: " + АдресСтрокой);
Иначе
    Сообщить("Адрес не задан или реквизит пуст.");
КонецЕсли;

Метод 3. Проверка реквизитов грузополучателя

Иногда путаница возникает из-за того, что адрес доставки в УТ 10.3 тесно связан с сущностью Грузополучатель. Выясним причину, по которой адрес может не отображаться. Если в документе выбран грузополучатель, отличный от покупателя, адрес может подтягиваться из контактной информации этого контрагента.

Если вам нужно получить адрес именно так, как он виден пользователю на форме, следует проверить следующий алгоритм:

  1. Проверить наличие записи в РегистрСведений.КонтактнаяИнформация, где владельцем является ДокументСсылка.
  2. Если записи нет, проверить реквизит документа АдресДоставки (строка).
  3. Если и он пуст, проверить адрес доставки у Контрагента-Грузополучателя (реквизит документа Грузополучатель).

Особенности ручного ввода (без классификатора)

Когда пользователь вносит изменения в поле адреса вручную, 1С помечает такую запись как «свободный формат». В структуре хранения XML или в отдельных полях регистра (город, улица, дом) данные могут не распределиться. Всегда запрашивайте именно поле Представление. Это гарантирует, что вы получите полную строку текста, которую видит пользователь на экране.

Рассмотрим ситуацию, когда нам нужно программно записать такой адрес. При программной записи важно соблюдать ту же логику: создаем набор записей регистра сведений, устанавливаем измерение Объект равным нашему документу и записываем строку в Представление.

Резюме

Для гарантированного получения «ручного» адреса доставки в УТ 10.3 выполните следующие шаги:

Этот подход позволит корректно обрабатывать даже те случаи, когда адрес не соответствует классификатору КЛАДР/ФИАС и был введен пользователем произвольно. Для комплексной работы с доставкой и печати путевых документов по накладным можно использовать обработку для формирования маршрутов экспедиторов.

← На главную