Почему в отчете валовая прибыль на СКД не выводится себестоимость и как это исправить

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

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

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

Анализ причин появления нулевой себестоимости

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

  1. Разные имена параметров периода. Проанализируем исходный текст запроса. В виртуальную таблицу РегистрНакопления.Продажи.Обороты передаются параметры &ДатаНач и &ДатаКон. При этом в подзапросе к таблице движений РегистрНакопления.ПродажиСебестоимость условие наложено через конструкцию ГДЕ ПродажиСебестоимость.Период МЕЖДУ &ДатаНачала И &ДатаКонца. В Универсальном отчете эти даты заполняются программно, а в СКД параметры &ДатаНачала и &ДатаКонца остаются пустыми. В результате подзапрос возвращает пустой набор данных, и функция ЕСТЬNULL(ТаблицаРегистраПродажиСебестоимость.СтоимостьОборот, 0) подставляет ноль.
  2. Служебные конструкции Построителя отчета. Запрос содержит директивы в фигурных скобках вида {ВЫБРАТЬ ...}, {ГДЕ ...}, {ИТОГИ ПО ...} и служебные комментарии. Хотя СКД способна компилировать подобные конструкции, секция ИТОГИ в теле запроса является избыточной, так как система компоновки данных рассчитывает итоги собственными механизмами на вкладках Ресурсы и Настройки.
  3. Параметры учетной политики. Для вычисления прибыли и рентабельности используется логический флаг &НеВключатьНДСВСтоимостьПартий. Если он не инициализирован в параметрах СКД, формулы расчета валовой прибыли возвращают некорректные значения.

Пошаговая настройка параметров в схеме компоновки данных

Чтобы отчет формировался корректно, а пользователю не приходилось заполнять несколько одинаковых интервалов дат, объединим управление периодом в СКД.

  1. Откроем схему компоновки данных и перейдем на вкладку Параметры.
  2. Добавим новый параметр с именем ПериодОтчета и типом данных СтандартныйПериод.
  3. Настроим автоматическое заполнение служебных параметров запроса через выражения:

    Для параметра ДатаНач укажем в колонке «Выражение»:

    &ПериодОтчета.ДатаНачала

    Для параметра ДатаКон укажем в колонке «Выражение»:

    КонецПериода(&ПериодОтчета.ДатаОкончания, "День")

    Для параметра ДатаНачала установим выражение:

    &ПериодОтчета.ДатаНачала

    Для параметра ДатаКонца установим выражение:

    КонецПериода(&ПериодОтчета.ДатаОкончания, "День")
  4. Для служебных параметров ДатаНач, ДатаКон, ДатаНачала и ДатаКонца установим флаг Ограничение доступности, чтобы скрыть их из пользовательских настроек.
  5. Для параметра НеВключатьНДСВСтоимостьПартий укажем значение типа Булево в соответствии с учетной политикой управленческого учета базы данных (как правило, Истина).
  6. На вкладке Настройки в список выбранных параметров пользователя выведем только параметр ПериодОтчета.

Адаптация текста запроса для СКД

Очистим текст запроса от инструкций построителя отчета и секций расчета итогов, оставив только логику соединения таблиц:


ВЫБРАТЬ
    ПродажиОбороты.Организация КАК Организация,
    ПродажиОбороты.Проект КАК Проект,
    ПродажиОбороты.Подразделение КАК Подразделение,
    ПродажиОбороты.Контрагент КАК Покупатель,
    ПродажиОбороты.ДоговорКонтрагента КАК ДоговорПокупателя,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
    ПродажиОбороты.Регистратор КАК Регистратор,
    ПродажиОбороты.Период КАК Период,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.СтоимостьОборот - ПродажиОбороты.НДСОборот КАК СтоимостьБезНДС,
    ПродажиОбороты.НДСОборот КАК НДС,
    ПродажиОбороты.СтоимостьОборот КАК Стоимость,
    ЕСТЬNULL(ТаблицаРегистраПродажиСебестоимость.СтоимостьОборот, 0) КАК Себестоимость
ИЗ
    РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПродажиОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ПродажиСебестоимость.Номенклатура КАК Номенклатура,
            ПродажиСебестоимость.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            ПродажиСебестоимость.ЗаказПокупателя КАК ЗаказПокупателя,
            ВЫБОР
                КОГДА ПродажиСебестоимость.ДокументДвижения <> НЕОПРЕДЕЛЕНО
                    ТОГДА ПродажиСебестоимость.ДокументДвижения
                ИНАЧЕ ПродажиСебестоимость.Регистратор
            КОНЕЦ КАК Регистратор,
            СУММА(ПродажиСебестоимость.Стоимость) КАК СтоимостьОборот
        ИЗ
            РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
        ГДЕ
            ПродажиСебестоимость.Период МЕЖДУ &ДатаНачала И &ДатаКонца
        СГРУППИРОВАТЬ ПО
            ПродажиСебестоимость.Номенклатура,
            ПродажиСебестоимость.ХарактеристикаНоменклатуры,
            ПродажиСебестоимость.ЗаказПокупателя,
            ВЫБОР
                КОГДА ПродажиСебестоимость.ДокументДвижения <> НЕОПРЕДЕЛЕНО
                    ТОГДА ПродажиСебестоимость.ДокументДвижения
                ИНАЧЕ ПродажиСебестоимость.Регистратор
            КОНЕЦ) КАК ТаблицаРегистраПродажиСебестоимость
        ПО ПродажиОбороты.Номенклатура = ТаблицаРегистраПродажиСебестоимость.Номенклатура
            И ПродажиОбороты.ХарактеристикаНоменклатуры = ТаблицаРегистраПродажиСебестоимость.ХарактеристикаНоменклатуры
            И ПродажиОбороты.ЗаказПокупателя = ТаблицаРегистраПродажиСебестоимость.ЗаказПокупателя
            И ПродажиОбороты.Регистратор = ТаблицаРегистраПродажиСебестоимость.Регистратор

Настройка ресурсов и вычисляемых полей

Перенесем расчет итоговых и относительных показателей в соответствующие механизмы СКД:

  1. Перейдем на вкладку Ресурсы и добавим числовые поля с выражением агрегации Сумма(...):
    • Количество
    • Стоимость
    • СтоимостьБезНДС
    • НДС
    • Себестоимость
  2. Добавим ресурс для расчета валовой прибыли: Сумма(СтоимостьБезНДС) - Сумма(Себестоимость)
  3. Для корректного расчета рентабельности в группировках и общих итогах зададим выражение ресурса Рентабельность:
    
    ВЫБОР 
        КОГДА Сумма(СтоимостьБезНДС) <> 0 
            ТОГДА 100 * (Сумма(СтоимостьБезНДС) - Сумма(Себестоимость)) / Сумма(СтоимостьБезНДС) 
        ИНАЧЕ 0 
    КОНЕЦ
    

Проверка движений в информационной базе

Если после настройки параметров себестоимость по-прежнему не выводится, проверим состояние данных партионного учета:

  1. В конфигурации «1С:Управление торговлей 10.3» записи в регистр ПродажиСебестоимость формируются при проведении по партиям. Убедимся, что выполнена регламентная обработка «Проведение по партиям» за выбранный период.
  2. Проверим регистр сведений «Учетная политика (управленческий учет)». Если списание партий отключено или настроено со списанием по нулевой стоимости, движения по себестоимости продаж формироваться не будут.
← На главную