При разработке отчетов по контактным данным клиентов и контрагентов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда в отчете выводится только наименование или ссылка на контрагента, а колонки с телефонами и адресами электронной почты остаются пустыми. Выясним причину такого поведения и разберем корректные способы построения запросов и структуры СКД.
Проанализируем типичную ошибку при составлении текста запроса. Когда в конструкторе запроса выбирается синтаксическая конструкция с круглыми скобками:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.КонтактнаяИнформация.(
АдресЭП,
НомерТелефона,
НомерТелефонаБезКодов
)
ИЗ
Справочник.Контрагенты КАК Контрагенты
В результате создается поле составного типа — Вложенная таблица. Механизм СКД по умолчанию не разворачивает вложенные таблицы в плоский список на одном уровне с полями группировки. Если в настройках отчета просто добавить поля АдресЭП или НомерТелефона в список выбранных полей группировки верхнего уровня, значения не отобразятся.
Кроме того, в типовых конфигурациях на базе Библиотеки стандартных подсистем (включая линейку 1С:Розница 2.0, 1С:Управление торговлей 11, 1С:ERP) реквизиты табличной части АдресЭП и НомерТелефона могут не заполняться при стандартном вводе данных. Итоговый текст контакта всегда хранится в реквизите Представление, а тип записи определяется значением из Перечисление.ТипыКонтактнойИнформации или ссылкой на Справочник.ВидыКонтактнойИнформации.
Рассмотрим вариант, когда запрос обращается непосредственно к табличной части справочника. В этом случае данные перестают быть вложенной таблицей и становятся плоским набором записей.
Текст запроса к табличной части:
ВЫБРАТЬ
КонтактнаяИнформация.Ссылка КАК Контрагент,
КонтактнаяИнформация.Вид КАК Вид,
КонтактнаяИнформация.Тип КАК Тип,
КонтактнаяИнформация.Представление КАК Представление
ИЗ
Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация
Разберем по шагам настройку схемы компоновки данных:
Контрагент.Вид) под полем Контрагент.Представление, Вид и Тип.Ограничение способа: если у контрагента нет ни одной записи в контактной информации, при прямом запросе к табличной части такой контрагент вовсе не попадет в отчет.
Посмотрим на наиболее удобный для пользователей сценарий: когда каждый контрагент выводится строго одной строкой, а телефон и адрес электронной почты отображаются в отдельных колонках. Для этого используем левое соединение справочника с его же табличной частью по соответствующим типам контактной информации.
Пример запроса:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
КИ_Телефон.Представление КАК Телефон,
КИ_Почта.Представление КАК АдресЭП
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ_Телефон
ПО КИ_Телефон.Ссылка = Контрагенты.Ссылка
И КИ_Телефон.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ_Почта
ПО КИ_Почта.Ссылка = Контрагенты.Ссылка
И КИ_Почта.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
ГДЕ
НЕ Контрагенты.ЭтоГруппа
Рассмотрим преимущества данного подхода:
Контрагент, Телефон, АдресЭП.Если у одного контрагента может быть несколько записей одного типа (например, рабочий и мобильный телефон) и необходимо исключить размножение строк, применим группировку с условным оператором ВЫБОР.
Посмотрим на пример запроса:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
МАКСИМУМ(ВЫБОР
КОГДА КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
ТОГДА КИ.Представление
ИНАЧЕ ""
КОНЕЦ) КАК Телефон,
МАКСИМУМ(ВЫБОР
КОГДА КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
ТОГДА КИ.Представление
ИНАЧЕ ""
КОНЕЦ) КАК АдресЭП
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
ПО КИ.Ссылка = Контрагенты.Ссылка
ГДЕ
НЕ Контрагенты.ЭтоГруппа
СГРУППИРОВАТЬ ПО
Контрагенты.Ссылка
Этот вариант обеспечивает корректное отображение контактных данных даже в сложных конфигурациях и полностью предотвращает появление пустых колонок в отчетах на базе СКД.