Почему СКД не выводит некоторые группировки и поля, хотя запрос в консоли работает?

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с загадочной ситуацией: один и тот же запрос в консоли запросов выдает полные данные, включая всех контрагентов и партнеров, но в самом отчете СКД поле остается пустым или группировка вовсе исчезает. Особенно часто это проявляется в современных типовых конфигурациях, таких как 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация 2.

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

Причина 1: Влияние функциональных опций (ФО)

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

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

Причина 2: Проблемы составного типа данных в Ключах аналитики

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

Когда СКД сталкивается с составным типом, она может некорректно определять доступные поля (реквизиты) этого объекта. Если система не уверена, что в данной строке находится именно справочник Контрагенты, она может заблокировать доступ к его реквизитам (например, к ИНН или Наименованию) для вывода в отчет.

Решение 1: Использование оператора ВЫРАЗИТЬ

Первое, что мы должны сделать для «подсказки» механизму СКД — это явно привести тип данных в тексте запроса. Это позволяет системе однозначно понять, к какой таблице обращаться за реквизитами. Проанализируем пример изменения запроса:


ВЫБРАТЬ
    ВЫРАЗИТЬ(КлючиАналитикиУчетаПоПартнерам.Контрагент КАК Справочник.Контрагенты) КАК Контрагент,
    КлючиАналитикиУчетаПоПартнерам.Партнер КАК Партнер,
    Приход.СтоимостьОборот КАК СтоимостьОборот
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК Приход

Использование ВЫРАЗИТЬ помогает снять неопределенность составного типа, и в большинстве случаев поле становится доступным для группировок.

Решение 2: Явное левое соединение со справочниками

Если прямое обращение через точку от ключа аналитики не помогает (что часто бывает из-за тех самых функциональных опций), необходимо использовать левое соединение. Однако здесь есть важный нюанс для конфигураций на базе ERP/УТ 11.

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

  1. Берем данные из регистра.
  2. Соединяем с Справочник.Партнеры по ссылке из аналитики.
  3. Соединяем с Справочник.Контрагенты, используя владельца или связь из справочника партнеров.

Разберем, как это выглядит в коде запроса:


ВЫБРАТЬ
    втПродажи.Организация,
    втПродажи.КонтрагентСсылка КАК Контрагент,
    втПродажи.СтоимостьОборот
ПОМЕСТИТЬ втИтоговыеДанные
ИЗ
    (ВЫБРАТЬ
        Аналитика.Организация КАК Организация,
        СпрКонтрагенты.Ссылка КАК КонтрагентСсылка,
        Продажи.СтоимостьОборот КАК СтоимостьОборот
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлючиАналитикиУчетаПоПартнерам КАК Аналитика
            ПО Продажи.АналитикаУчетаПоПартнерам = Аналитика.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты
            ПО Аналитика.Контрагент = СпрКонтрагенты.Ссылка) КАК втПродажи

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

Решение 3: Проверка настроек полей набора данных в СКД

Если запрос написан верно, но поле всё равно не выводится, проанализируем вкладку «Наборы данных» в схеме компоновки:

  1. Проверьте колонку «Ограничение поля». Убедитесь, что для поля Контрагент не стоят галочки в колонках «Поле», «Условие» или «Группировка».
  2. Посмотрите на колонку «Роль». Иногда СКД автоматически назначает полю роль «Игнорировать» или неправильно определяет родителя для измерения. Попробуйте очистить роль или настроить её вручную.
  3. Убедитесь, что в поле «Доступные значения» не задан список, исключающий ваших контрагентов.

Решение 4: Программное отключение проверки функциональных опций

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

Установка параметра ПроверятьДоступностьПолейПоФункциональнымОпциям в значение Ложь заставит СКД игнорировать настройки ФО и выводить все поля, которые физически есть в базе данных и описаны в наборе данных.

Выводы и рекомендации

Для надежного вывода контрагентов в отчетах УТ 11/ERP придерживайтесь следующих правил:

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

← На главную