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