При разработке отчетов и печатных форм в конфигурации «1С:Управление торговлей 11» разработчики часто сталкиваются с ситуацией, когда левое соединение с табличной частью контактной информации возвращает пустые значения (NULL), хотя в пользовательском интерфейсе карточки контрагента адрес заполнен. Разберем основные причины такого поведения и рассмотрим надежные варианты получения контактных данных как с помощью языка запросов, так и через механизмы Библиотеки стандартных подсистем (БСП).
Проанализируем архитектурные особенности конфигурации УТ 11, из-за которых прямой запрос к табличной части Справочник.Контрагенты.КонтактнаяИнформация может не возвращать данные:
Партнеры, тогда как за справочником Контрагенты закрепляется строго регламентированная информация (например, юридический адрес). В форме контрагента система может выводить сводную контактную информацию партнера и контрагента одновременно.ФактАдресКонтрагента может не использоваться в конкретной базе, если адрес был записан как ФактАдресПартнера или создан пользователем вручную. Пользовательские виды контактной информации не являются предопределенными, поэтому конструкция ЗНАЧЕНИЕ(...) в запросе не сопоставит строки.Если требуется сформировать единый пакетный запрос для выборки данных, скорректируем условия соединения. Рассмотрим вариант передачи вида контактной информации через параметры или выборку по типу контактной информации:
ВЫБРАТЬ
ДоговорыКонтрагентов.Ссылка КАК Договор,
КонтрагентыКонтактнаяИнформация.Представление КАК Адрес
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
ПО ДоговорыКонтрагентов.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка
И КонтрагентыКонтактнаяИнформация.Вид = &ВидКонтактнойИнформации
ГДЕ
ДоговорыКонтрагентов.Ссылка = &Ссылка
Если фактический адрес закреплен за партнером, выполним соединение с табличной частью справочника Партнеры через соответствующий реквизит договора:
ВЫБРАТЬ
ДоговорыКонтрагентов.Ссылка КАК Договор,
ПартнерыКонтактнаяИнформация.Представление КАК ФактическийАдрес
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
ПО ДоговорыКонтрагентов.Партнер = ПартнерыКонтактнаяИнформация.Ссылка
И ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресПартнера)
ГДЕ
ДоговорыКонтрагентов.Ссылка = &Ссылка
Для печатных форм удобнее всего использовать штатные функции БСП, которые автоматически собирают все необходимые реквизиты организации или контрагента (включая адреса, банковские счета, ИНН и КПП) на указанную дату. Разберем пример работы с общим модулем ФормированиеПечатныхФорм:
ДанныеКонтрагента = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Контрагент, ТекущаяДатаСеанса());
СведенияСтрокой = ФормированиеПечатныхФорм.ОписаниеОрганизации(
ДанныеКонтрагента,
"ПолноеНаименование,ИНН,КПП,ФактическийАдрес,ЮридическийАдрес,Телефоны"
);
Метод СведенияОЮрФизЛице возвращает структуру со всеми контактными и регистрационными данными, к которым можно обращаться напрямую через свойства структуры (например, ДанныеКонтрагента.ФактическийАдрес или ДанныеКонтрагента.ЮридическийАдрес).
Если необходимо точечно получить строковое представление конкретного адреса или телефона без формирования громоздких левых соединений в запросе, применим методы общего модуля УправлениеКонтактнойИнформацией:
// Получение строкового представления адреса для одного объекта
Адрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
Контрагент,
Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента,
ТекущаяДатаСеанса(),
Истина
);
Если требуется обработать массив ссылок для вывода списочного отчета, воспользуемся пакетным методом БСП:
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Контрагент);
МассивВидов = Новый Массив;
МассивВидов.Добавить(Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
МассивВидов.Добавить(Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента);
ТаблицаАдресов = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(
МассивОбъектов,
МассивВидов,
ТекущаяДатаСеанса()
);
Использование встроенных функций БСП позволяет избежать ошибок при обновлении конфигурации, корректно обрабатывает структуру хранения контактных данных (включая JSON-формат полей ФИАС) и автоматически учитывает права доступа пользователя к объектам.