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