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