При разработке собственных аналитических отчетов в конфигурации «1С:Управление торговлей 10.3» разработчики часто берут за основу готовые запросы из типовых отчетов, таких как «Валовая прибыль». Однако при простой вставке текста запроса в схему компоновки данных (СКД) возникает распространенная проблема: показатели выручки и количества заполняются корректно, а Себестоимость остается равной нулю.
Разберем подробно, почему возникает такая ситуация, проанализируем структуру типового запроса и настроим схему компоновки данных для корректного расчета всех показателей.
В типовой конфигурации «Управление торговлей 10.3» отчет «Валовая прибыль» построен на базе универсального отчета с использованием механизма Построителя отчета. При переносе запроса в СКД без адаптации возникают следующие проблемы:
РегистрНакопления.Продажи.Обороты передаются параметры &ДатаНач и &ДатаКон. При этом в подзапросе к таблице движений РегистрНакопления.ПродажиСебестоимость условие наложено через конструкцию ГДЕ ПродажиСебестоимость.Период МЕЖДУ &ДатаНачала И &ДатаКонца. В Универсальном отчете эти даты заполняются программно, а в СКД параметры &ДатаНачала и &ДатаКонца остаются пустыми. В результате подзапрос возвращает пустой набор данных, и функция ЕСТЬNULL(ТаблицаРегистраПродажиСебестоимость.СтоимостьОборот, 0) подставляет ноль.{ВЫБРАТЬ ...}, {ГДЕ ...}, {ИТОГИ ПО ...} и служебные комментарии. Хотя СКД способна компилировать подобные конструкции, секция ИТОГИ в теле запроса является избыточной, так как система компоновки данных рассчитывает итоги собственными механизмами на вкладках Ресурсы и Настройки.&НеВключатьНДСВСтоимостьПартий. Если он не инициализирован в параметрах СКД, формулы расчета валовой прибыли возвращают некорректные значения.Чтобы отчет формировался корректно, а пользователю не приходилось заполнять несколько одинаковых интервалов дат, объединим управление периодом в СКД.
ПериодОтчета и типом данных СтандартныйПериод.Для параметра ДатаНач укажем в колонке «Выражение»:
&ПериодОтчета.ДатаНачала
Для параметра ДатаКон укажем в колонке «Выражение»:
КонецПериода(&ПериодОтчета.ДатаОкончания, "День")
Для параметра ДатаНачала установим выражение:
&ПериодОтчета.ДатаНачала
Для параметра ДатаКонца установим выражение:
КонецПериода(&ПериодОтчета.ДатаОкончания, "День")
ДатаНач, ДатаКон, ДатаНачала и ДатаКонца установим флаг Ограничение доступности, чтобы скрыть их из пользовательских настроек.НеВключатьНДСВСтоимостьПартий укажем значение типа Булево в соответствии с учетной политикой управленческого учета базы данных (как правило, Истина).ПериодОтчета.Очистим текст запроса от инструкций построителя отчета и секций расчета итогов, оставив только логику соединения таблиц:
ВЫБРАТЬ
ПродажиОбороты.Организация КАК Организация,
ПродажиОбороты.Проект КАК Проект,
ПродажиОбороты.Подразделение КАК Подразделение,
ПродажиОбороты.Контрагент КАК Покупатель,
ПродажиОбороты.ДоговорКонтрагента КАК ДоговорПокупателя,
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
ПродажиОбороты.Регистратор КАК Регистратор,
ПродажиОбороты.Период КАК Период,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот - ПродажиОбороты.НДСОборот КАК СтоимостьБезНДС,
ПродажиОбороты.НДСОборот КАК НДС,
ПродажиОбороты.СтоимостьОборот КАК Стоимость,
ЕСТЬNULL(ТаблицаРегистраПродажиСебестоимость.СтоимостьОборот, 0) КАК Себестоимость
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ПродажиСебестоимость.Номенклатура КАК Номенклатура,
ПродажиСебестоимость.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПродажиСебестоимость.ЗаказПокупателя КАК ЗаказПокупателя,
ВЫБОР
КОГДА ПродажиСебестоимость.ДокументДвижения <> НЕОПРЕДЕЛЕНО
ТОГДА ПродажиСебестоимость.ДокументДвижения
ИНАЧЕ ПродажиСебестоимость.Регистратор
КОНЕЦ КАК Регистратор,
СУММА(ПродажиСебестоимость.Стоимость) КАК СтоимостьОборот
ИЗ
РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
ГДЕ
ПродажиСебестоимость.Период МЕЖДУ &ДатаНачала И &ДатаКонца
СГРУППИРОВАТЬ ПО
ПродажиСебестоимость.Номенклатура,
ПродажиСебестоимость.ХарактеристикаНоменклатуры,
ПродажиСебестоимость.ЗаказПокупателя,
ВЫБОР
КОГДА ПродажиСебестоимость.ДокументДвижения <> НЕОПРЕДЕЛЕНО
ТОГДА ПродажиСебестоимость.ДокументДвижения
ИНАЧЕ ПродажиСебестоимость.Регистратор
КОНЕЦ) КАК ТаблицаРегистраПродажиСебестоимость
ПО ПродажиОбороты.Номенклатура = ТаблицаРегистраПродажиСебестоимость.Номенклатура
И ПродажиОбороты.ХарактеристикаНоменклатуры = ТаблицаРегистраПродажиСебестоимость.ХарактеристикаНоменклатуры
И ПродажиОбороты.ЗаказПокупателя = ТаблицаРегистраПродажиСебестоимость.ЗаказПокупателя
И ПродажиОбороты.Регистратор = ТаблицаРегистраПродажиСебестоимость.Регистратор
Перенесем расчет итоговых и относительных показателей в соответствующие механизмы СКД:
Сумма(...):
КоличествоСтоимостьСтоимостьБезНДСНДССебестоимость
Сумма(СтоимостьБезНДС) - Сумма(Себестоимость)
Рентабельность:
ВЫБОР
КОГДА Сумма(СтоимостьБезНДС) <> 0
ТОГДА 100 * (Сумма(СтоимостьБезНДС) - Сумма(Себестоимость)) / Сумма(СтоимостьБезНДС)
ИНАЧЕ 0
КОНЕЦ
Если после настройки параметров себестоимость по-прежнему не выводится, проверим состояние данных партионного учета:
ПродажиСебестоимость формируются при проведении по партиям. Убедимся, что выполнена регламентная обработка «Проведение по партиям» за выбранный период.