Почему расшифровка в отчете СКД выводит все данные без учета группировок и как это исправить?

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

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

Суть проблемы и контекст ситуации

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

Проанализируем ситуацию: почему штатный механизм 1С «теряет» фильтры группировок при переходе к детальным записям? Чаще всего это происходит из-за тонких настроек набора данных и компоновщика настроек.

Причина №1: Отключенное автозаполнение и отсутствие полей отбора

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

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

Как исправить:

  1. Перейдем на закладку «Набор данных» в схеме СКД.
  2. Если флаг «Автозаполнение» снят, найдем в списке полей те, по которым строятся группировки.
  3. Убедимся, что в колонке «Отбор» для этих полей стоят соответствующие галочки.
  4. Проверим, что поле, по которому мы хотим получить расшифровку (например, Ссылка документа), также доступно для отбора.

Причина №2: Использование фигурных скобок в запросе

Если мы работаем с отключенным автозаполнением, нам необходимо явно указать СКД, в какие места запроса она может подставлять условия. Для этого используются расширения языка запросов — фигурные скобки {...}.

Посмотрим на пример запроса, который может вызвать проблемы при расшифровке:


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

В данном случае, если мы попытаемся сделать расшифровку, система может не понять, куда именно вставить условие ГДЕ Номенклатура = &ЗначениеИзГруппировки. Правильным подходом будет использование секции ГДЕ с описанием доступных полей отбора в фигурных скобках.

Рассмотрим правильный вариант оформления секции условий:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.Регистратор КАК Документ
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ПродажиОбороты
{ГДЕ
    ПродажиОбороты.Номенклатура.*,
    ПродажиОбороты.Регистратор.*}

Синтаксис Поле.* сообщает системе компоновки, что данное поле (и все его реквизиты) может быть использовано для динамического наложения фильтров при выполнении расшифровки.

Причина №3: Роли полей и связи наборов данных

Выясним еще одну важную деталь. Чтобы СКД понимала, как связаны ресурсы с измерениями, у каждого поля должна быть правильно настроена Роль. Для виртуальных таблиц оборотов крайне важно, чтобы измерения регистра имели роль «Измерение».

Если вы используете временные таблицы в запросе, проанализируем ситуацию: СКД не всегда может автоматически проследить связь между итоговой временной таблицей и исходными таблицами БД. Если поле Документ выбирается из временной таблицы, убедитесь, что в настройках поля на закладке «Набор данных» указано, что это поле является обязательным для отбора или имеет правильные роли связей.

Особенности расшифровки в типовых формах (например, БП 3.0)

Если вы разрабатываете отчет для конфигурации «1С:Бухгалтерия предприятия 3.0» или любой другой на базе БСП, помните, что расшифровка там часто обрабатывается программно. В модуле формы типового отчета может присутствовать процедура РезультатОбработкаРасшифровки.

Если вы вносили изменения в программную часть, проверьте следующие моменты:

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

Итоговый чек-лист для проверки

Если ваша расшифровка вываливает «всю выборку», пройдитесь по этому списку:

  1. Автозаполнение: Включите его для проверки. Если расшифровка заработала — значит, при выключенном флаге вы забыли описать доступные поля отбора.
  2. Поля отбора: На закладке «Набор данных» проверьте наличие галочек в колонке «Отбор» для всех группировочных полей и поля-регистратора.
  3. Фигурные скобки: В тексте запроса добавьте секцию {ГДЕ...} с указанием всех значимых полей.
  4. Роли полей: Убедитесь, что измерения регистра помечены как измерения, а регистратор имеет соответствующую роль (период или ссылка).
  5. Параметры виртуальных таблиц: Если используются обороты, убедитесь, что параметры &НачалоПериода и &КонецПериода установлены корректно и доступны для СКД.

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

← На главную