Почему в отчете СКД есть папка «Показатели» и почему поле «ЦенаПоступления» отсутствует в запросе?

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

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

Что такое папка «Показатели» в СКД и как она формируется

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

Создается такая структура следующими способами:

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

В тексте запроса СУБД никаких папок не существует, поэтому искать в тексте запроса конструкцию вида Показатели.ЦенаПоступления бессмысленно — запрос оперирует плоскими именами и псевдонимами полей.

Почему поле «ЦенаПоступления» отсутствует в тексте запроса

Проанализируем, почему такое поле, как ЦенаПоступления, не удается обнаружить в секциях ВЫБРАТЬ основного запроса. Этому есть несколько технических причин, связанных с архитектурой СКД и методикой расчета экономических показателей:

  1. Неаддитивность показателей и расчет на вкладке «Ресурсы»: Цена — это неаддитивная величина. Ее нельзя складывать простым суммированием в группировках строк и общих итогах. Если сложить цены за единицу товара по нескольким строкам, результат будет математически и экономически неверен. Поэтому в запросе выбираются только аддитивные величины (сумма стоимости и количество), а сама цена рассчитывается непосредственно в ресурсах СКД делением общей стоимости на общее количество.
  2. Использование вычисляемых полей: Поле может быть создано на вкладке «Вычисляемые поля». Вычисляемые поля обрабатываются на уровне детальных записей до агрегации, и в исходном тексте запроса набора данных они не фигурируют.
  3. Переопределение путей к данным и заголовков: Поле в запросе может иметь один псевдоним (например, формироваться сложным выражением без явного имени или с техническим псевдонимом), а в таблице описания полей набора данных ему назначен иной пользовательский «Заголовок» или другой «Путь к данным».
  4. Динамическая модификация запроса в модуле отчета: В типовых решениях (включая 1С:ERP) отчеты строятся на базе подсистемы вариантов отчетов БСП. Исходная схема компоновки в метаданных может быть лишь шаблоном. Фактический текст запроса динамически дополняется и изменяется в коде процедуры ПриКомпоновкеРезультата модуля объекта в зависимости от учетной политики (метод списания ФИФО, средняя стоимость) или выбранных пользователем настроек.

Как правильно рассчитывается средняя цена в СКД

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

Посмотрим на пример правильного расчета средневзвешенной цены в выражении ресурса. В поле выражения для ресурса ЦенаПоступления на вкладке «Ресурсы» прописывается расчет с защитой от деления на ноль:


ВЫБОР 
    КОГДА ЕстьNull(Сумма(Количество), 0) = 0 ТОГДА 0 
    ИНАЧЕ Сумма(Стоимость) / Сумма(Количество) 
КОНЕЦ

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

Как увидеть реальный запрос с учетом динамических изменений

Если требуется исследовать финальный текст запроса, который отправляется в СУБД с учетом программных алгоритмов типовой конфигурации, выполним следующие шаги:

  1. Откроем модуль объекта отчета и найдем предопределенную процедуру ПриКомпоновкеРезультата.
  2. Установим точку останова после выполнения процедур инициализации компоновщика и формирования макета компоновки данных.
  3. Проанализируем свойство ВыполняемыйЗапрос у нужного набора данных внутри сформированного объекта МакетКомпоновкиДанных либо воспользуемся внешней обработкой «Консоль системы компоновки данных», загрузив в нее текущую схему и пользовательские настройки.
← На главную