При разработке отчетов на базе Системы Компоновки Данных (СКД) в 1С часто возникает необходимость дать пользователю возможность «проваливаться» (расшифровывать данные) вплоть до исходного документа. Разберем частую задачу: есть отчет по регистру накопления, построенный на виртуальной таблице оборотов. Нам нужно вывести поле Регистратор, чтобы открывать исходный документ, но в стандартном конструкторе запроса этого поля просто нет.
Посмотрим на типичный исходный запрос, с которым возникает проблема:
ВЫБРАТЬ
ПродажиИСебестоимостьОбороты.Организация КАК Организация,
ПродажиИСебестоимостьОбороты.Контрагент КАК Контрагент,
ПродажиИСебестоимостьОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
ПродажиИСебестоимостьОбороты.Номенклатура КАК Номенклатура,
ПродажиИСебестоимостьОбороты.КоличествоОборот КАК КоличествоОборот,
ПродажиИСебестоимостьОбороты.ВыручкаБезНДСОборот КАК ВыручкаБезНДСОборот,
ПродажиИСебестоимостьОбороты.СебестоимостьБезНДСОборот КАК СебестоимостьБезНДСОборот,
ПродажиИСебестоимостьОбороты.ВыручкаБезНДСОборот - ПродажиИСебестоимостьОбороты.СебестоимостьБезНДСОборот КАК МаржаБезНДС,
ПродажиИСебестоимостьОбороты.ДокументПартии КАК ДокументПартии
ИЗ
РегистрНакопления.ПродажиИСебестоимость.Обороты КАК ПродажиИСебестоимостьОбороты
Выясним причину такого поведения. Виртуальные таблицы оборотов формируются платформой 1С динамически. По умолчанию, если параметр периодичности не задан, система агрегирует (сворачивает) итоги за весь указанный в параметрах интервал. Группировка данных выполняется только по измерениям регистра. Чтобы оптимизировать запрос и уменьшить объем данных, поля Регистратор и НомерСтроки физически исключаются из результирующей выборки. Именно поэтому конструктор запросов их не отображает.
Проанализируем доступные способы решения этой задачи и выберем наиболее подходящий.
Рассмотрим первый вариант, который часто предлагают разработчики на форумах: отказаться от использования виртуальной таблицы оборотов и обратиться напрямую к физической таблице движений регистра.
При обращении к физической таблице (например, РегистрНакопления.ПродажиИСебестоимость вместо РегистрНакопления.ПродажиИСебестоимость.Обороты) вам становятся доступны абсолютно все поля записей, включая Регистратор, Период и НомерСтроки.
Однако этот подход имеет существенные минусы. Вам придется самостоятельно группировать данные по измерениям, суммировать ресурсы (обороты) и накладывать условия на активность записей (условие Активность = ИСТИНА). Это лишает вас главных преимуществ виртуальных таблиц, которые платформа оптимизирует автоматически. Поэтому данный способ стоит применять только в специфических случаях.
Разберем по шагам правильный и проверенный способ, который заставит платформу включить поле документа-регистратора в список доступных полей виртуальной таблицы. Для этого необходимо явно задать параметр периодичности.
РегистрНакопления.ПродажиИСебестоимость.Обороты).Авто или Регистратор.После подтверждения изменений вы увидите, что в левом списке полей таблицы появились новые данные: Регистратор, НомерСтроки, а также поля периодов (ПериодСекунда, ПериодДень и так далее). Теперь вы можете перетащить поле Регистратор в список выбранных полей запроса, и оно станет доступно для вывода и расшифровки в отчете.
При использовании данного метода учитывайте следующие нюансы работы платформы:
Регистратор означает, что платформа прекращает сворачивать данные до общих оборотов за весь период. Она начинает извлекать каждое отдельное движение документа. Это может замедлить выполнение запроса, особенно на больших базах.Проанализируем еще два полезных варианта работы с данными, если таблица оборотов по каким-то причинам вас не устраивает.
1. Использование таблицы «ОстаткиИОбороты»
Если ваш регистр является регистром остатков (а не просто оборотов), вы можете использовать виртуальную таблицу ОстаткиИОбороты. В ее параметрах также необходимо задать периодичность Авто или Регистратор. Этот подход особенно полезен, если помимо оборотов в отчете требуются начальные и конечные остатки в разрезе каждого документа.
2. Настройка стандартной расшифровки (Drill-down) в СКД
Если вы установите периодичность Авто, СКД позволяет не выводить поле Регистратор прямо в строки (детальные записи) отчета. Это поможет не перегружать внешний вид отчета лишней детализацией. Однако, само поле будет извлечено платформой и останется доступным во внутренних данных расшифровки. Таким образом, пользователь сможет сделать двойной клик по ячейке с суммой оборота и стандартными средствами СКД провалиться в документ-регистратор.