Почему при переносе запроса отчета «Валовая прибыль» в СКД себестоимость выводится нулевой?

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

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

Анализ структуры запроса и механизма соединения

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


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

Основная проблема при переносе такого кода в СКД заключается в том, что система компоновки данных динамически управляет составом полей. Если поле Регистратор не выведено в группировки или не участвует в итоговом результате, СКД может попытаться оптимизировать запрос, что приведет к некорректной работе соединения во вложенных таблицах. Выясним основные причины «потери» данных.

Причина 1: Несоответствие параметров периода

В типовых отчетах часто используются специфические имена параметров, такие как &ДатаНач и &ДатаКон. При создании схемы компоновки данных (СКД) автоматически создается стандартный параметр Период. Рассмотрим, как это влияет на результат:

  1. Если во вложенном запросе к таблице ПродажиСебестоимость используются параметры &ДатаНачала и &ДатаКонца, а в настройках СКД пользователь заполняет стандартный Период, то внутренние параметры могут остаться пустыми или принять значения по умолчанию.
  2. Решение: На закладке «Параметры» в СКД необходимо настроить связь. Для параметров &ДатаНачала и &ДатаКонца в колонке «Выражение» следует указать &СтандартныйПериод.ДатаНачала и &СтандартныйПериод.ДатаОкончания соответственно.

Причина 2: Ошибки в настройке ресурсов

Проанализируем вкладку «Ресурсы». Часто программисты допускают ошибку, ограничивая расчет ресурса конкретными группировками. Если для поля Себестоимость в колонке «Рассчитывать по...» указана только группировка Номенклатура, то в общем итоге или в группировках выше (например, Организация или Контрагент) значение будет равно 0.

Рассмотрим правильную настройку ресурсов:

Важно убедиться, что для базовых суммовых полей (Стоимость, Себестоимость) расчет итогов разрешен по всем доступным группировкам.

Причина 3: Оптимизация запроса СКД и роли полей

СКД анализирует запрос и может изменять его структуру для повышения производительности. Если соединение идет по полю Регистратор, но этот Регистратор не выбран в настройках отчета, соединение может отработать не так, как ожидалось.

Посмотрим на поле Регистратор в наборе данных. Убедимся, что для него установлена правильная роль. Если мы используем виртуальные таблицы оборотов, СКД должна понимать, что Регистратор является периодом и обязательным полем для связи, если логика отчета завязана на документы движения. Однако, для отчета «Валовая прибыль» в СКД зачастую надежнее использовать соединение по Номенклатуре, Характеристике и Заказу, предварительно сгруппировав данные до этого уровня, чтобы избежать проблем с дублированием записей из-за регистраторов.

Причина 4: Специфика партионного учета (УТ 10.3)

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

Проверим следующие моменты:

  1. Установлена ли в настройках параметров учета галочка «Списывать партии при проведении документов».
  2. Если галочка не установлена, выполнен ли регламентный документ Проведение по партиям за исследуемый период.
  3. Существуют ли записи в регистре накопления ПродажиСебестоимость напрямую (через «Операции» — «Регистры накопления»).

Итоговые рекомендации по исправлению

Для того чтобы себестоимость начала отображаться в вашем отчете на базе СКД, выполним следующие шаги:

  1. Проверим параметры: Убедимся, что &ДатаНачала и &ДатаКонца внутри вложенного запроса получают актуальные данные из настроек пользователя.
  2. Упростим соединение: Попробуем временно убрать связь по полю Регистратор в запросе. Если цифры появятся — значит, проблема в несовпадении регистраторов в таблицах Продажи и ПродажиСебестоимость (например, из-за использования документа Корректировка стоимости списания).
  3. Сбросим настройки ресурсов: Удалим все записи на закладке «Ресурсы» и добавим их заново простым суммированием, без указания конкретных группировок.
  4. Проверим права доступа: Убедимся, что у пользователя, под которым запускается отчет, есть права на чтение регистра ПродажиСебестоимость. Использование конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ при отсутствии прав вернет пустой результат по таблице себестоимости, не выдавая ошибки.

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

← На главную