Как вывести контактную информацию контрагентов в отчете на СКД

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

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

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

Проанализируем типичную ошибку при составлении текста запроса. Когда в конструкторе запроса выбирается синтаксическая конструкция с круглыми скобками:


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.КонтактнаяИнформация.(
        АдресЭП,
        НомерТелефона,
        НомерТелефонаБезКодов
    )
ИЗ
    Справочник.Контрагенты КАК Контрагенты

В результате создается поле составного типа — Вложенная таблица. Механизм СКД по умолчанию не разворачивает вложенные таблицы в плоский список на одном уровне с полями группировки. Если в настройках отчета просто добавить поля АдресЭП или НомерТелефона в список выбранных полей группировки верхнего уровня, значения не отобразятся.

Кроме того, в типовых конфигурациях на базе Библиотеки стандартных подсистем (включая линейку 1С:Розница 2.0, 1С:Управление торговлей 11, 1С:ERP) реквизиты табличной части АдресЭП и НомерТелефона могут не заполняться при стандартном вводе данных. Итоговый текст контакта всегда хранится в реквизите Представление, а тип записи определяется значением из Перечисление.ТипыКонтактнойИнформации или ссылкой на Справочник.ВидыКонтактнойИнформации.

Способ 1. Запрос напрямую к табличной части и настройка подчиненных группировок

Рассмотрим вариант, когда запрос обращается непосредственно к табличной части справочника. В этом случае данные перестают быть вложенной таблицей и становятся плоским набором записей.

Текст запроса к табличной части:


ВЫБРАТЬ
    КонтактнаяИнформация.Ссылка КАК Контрагент,
    КонтактнаяИнформация.Вид КАК Вид,
    КонтактнаяИнформация.Тип КАК Тип,
    КонтактнаяИнформация.Представление КАК Представление
ИЗ
    Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация

Разберем по шагам настройку схемы компоновки данных:

  1. Перейдем на вкладку Настройки в схеме СКД.
  2. Добавим группировку верхнего уровня по полю Контрагент.
  3. Добавим подчиненную группировку (детальные записи или группировку по полю Вид) под полем Контрагент.
  4. В выбранные поля подчиненной группировки выведем Представление, Вид и Тип.

Ограничение способа: если у контрагента нет ни одной записи в контактной информации, при прямом запросе к табличной части такой контрагент вовсе не попадет в отчет.

Способ 2. Левое соединение для вывода контактов в одну строку

Посмотрим на наиболее удобный для пользователей сценарий: когда каждый контрагент выводится строго одной строкой, а телефон и адрес электронной почты отображаются в отдельных колонках. Для этого используем левое соединение справочника с его же табличной частью по соответствующим типам контактной информации.

Пример запроса:


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

Рассмотрим преимущества данного подхода:

  1. В отчет гарантированно попадают все контрагенты, включая тех, у кого контакты не заполнены.
  2. Данные выводятся компактно — в одну строчку без дублирования наименования контрагента.
  3. В настройках СКД достаточно создать группировку Детальные записи и выбрать поля Контрагент, Телефон, АдресЭП.

Способ 3. Группировка с агрегатными функциями и условием ВЫБОР

Если у одного контрагента может быть несколько записей одного типа (например, рабочий и мобильный телефон) и необходимо исключить размножение строк, применим группировку с условным оператором ВЫБОР.

Посмотрим на пример запроса:


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

Этот вариант обеспечивает корректное отображение контактных данных даже в сложных конфигурациях и полностью предотвращает появление пустых колонок в отчетах на базе СКД.

← На главную