Как правильно получить адрес контрагента в 1С:Управление торговлей 11?

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

При разработке отчетов и печатных форм в конфигурации «1С:Управление торговлей 11» разработчики часто сталкиваются с ситуацией, когда левое соединение с табличной частью контактной информации возвращает пустые значения (NULL), хотя в пользовательском интерфейсе карточки контрагента адрес заполнен. Разберем основные причины такого поведения и рассмотрим надежные варианты получения контактных данных как с помощью языка запросов, так и через механизмы Библиотеки стандартных подсистем (БСП).

Причины возникновения проблемы при запросе к контактной информации

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

  1. Разделение сущностей «Партнеры» и «Контрагенты». В конфигурациях на базе ERP/УТ контактная информация разделена: общие контакты и фактические адреса доставки нередко закрепляются за справочником Партнеры, тогда как за справочником Контрагенты закрепляется строго регламентированная информация (например, юридический адрес). В форме контрагента система может выводить сводную контактную информацию партнера и контрагента одновременно.
  2. Несовпадение предопределенного вида контактной информации. Элемент ФактАдресКонтрагента может не использоваться в конкретной базе, если адрес был записан как ФактАдресПартнера или создан пользователем вручную. Пользовательские виды контактной информации не являются предопределенными, поэтому конструкция ЗНАЧЕНИЕ(...) в запросе не сопоставит строки.
  3. Использование истории изменений контактной информации. В ряде версий БСП данные контактной информации хранятся с учетом периодичности в отдельном регистре сведений, из-за чего прямое обращение к табличной части объекта может возвращать неактуальные строки.

Способ 1. Корректировка запроса к табличным частям

Если требуется сформировать единый пакетный запрос для выборки данных, скорректируем условия соединения. Рассмотрим вариант передачи вида контактной информации через параметры или выборку по типу контактной информации:


ВЫБРАТЬ
    ДоговорыКонтрагентов.Ссылка КАК Договор,
    КонтрагентыКонтактнаяИнформация.Представление КАК Адрес
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
        ПО ДоговорыКонтрагентов.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка
        И КонтрагентыКонтактнаяИнформация.Вид = &ВидКонтактнойИнформации
ГДЕ
    ДоговорыКонтрагентов.Ссылка = &Ссылка

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


ВЫБРАТЬ
    ДоговорыКонтрагентов.Ссылка КАК Договор,
    ПартнерыКонтактнаяИнформация.Представление КАК ФактическийАдрес
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
        ПО ДоговорыКонтрагентов.Партнер = ПартнерыКонтактнаяИнформация.Ссылка
        И ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресПартнера)
ГДЕ
    ДоговорыКонтрагентов.Ссылка = &Ссылка

Способ 2. Использование программных методов подсистемы печати

Для печатных форм удобнее всего использовать штатные функции БСП, которые автоматически собирают все необходимые реквизиты организации или контрагента (включая адреса, банковские счета, ИНН и КПП) на указанную дату. Разберем пример работы с общим модулем ФормированиеПечатныхФорм:


ДанныеКонтрагента = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Контрагент, ТекущаяДатаСеанса());
СведенияСтрокой = ФормированиеПечатныхФорм.ОписаниеОрганизации(
    ДанныеКонтрагента,
    "ПолноеНаименование,ИНН,КПП,ФактическийАдрес,ЮридическийАдрес,Телефоны"
);

Метод СведенияОЮрФизЛице возвращает структуру со всеми контактными и регистрационными данными, к которым можно обращаться напрямую через свойства структуры (например, ДанныеКонтрагента.ФактическийАдрес или ДанныеКонтрагента.ЮридическийАдрес).

Способ 3. Получение контактной информации через модуль «УправлениеКонтактнойИнформацией»

Если необходимо точечно получить строковое представление конкретного адреса или телефона без формирования громоздких левых соединений в запросе, применим методы общего модуля УправлениеКонтактнойИнформацией:


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

Если требуется обработать массив ссылок для вывода списочного отчета, воспользуемся пакетным методом БСП:


МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Контрагент);

МассивВидов = Новый Массив;
МассивВидов.Добавить(Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
МассивВидов.Добавить(Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента);

ТаблицаАдресов = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(
    МассивОбъектов,
    МассивВидов,
    ТекущаяДатаСеанса()
);

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

← На главную