Как в СКД вывести остатки товаров на конец периода вместе с валовой прибылью?

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

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

Разберем причину некорректного вывода остатков

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

Другой важный нюанс — это момент времени. В 1С остатки на дату 31.03.2020 23:59:59 могут не включать движения, сделанные в эту самую секунду, если не использовать специальный объект Граница. Однако в самой схеме компоновки данных мы работаем с выражениями параметров, где нужно явно указывать, какую именно точку во времени мы хотим получить.

Способ 1: Переименование параметров и управление автозаполнением

Первым делом проанализируем ситуацию с конфликтом параметров. Если у вас включена галочка «Автозаполнение» на закладке «Наборы данных», СКД пытается самостоятельно связать параметры виртуальных таблиц с общими параметрами отчета. Чтобы взять этот процесс под контроль, выполним следующие шаги:

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

Рассмотрим пример настройки выражения. Если вы используете стандартный период &Период, то выражение для остатков должно выглядеть так:

&Период.ДатаОкончания

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

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

Это выражение сдвигает точку получения остатков на начало следующего дня (00:00:00), что в терминах платформы 1С соответствует остаткам «включая» последнюю секунду выбранного периода.

Способ 2: Настройка ролей полей для корректного расчета итогов

Часто остатки отображаются верно в детальных записях, но в общих итогах или группировках по складам/номенклатуре они суммируются некорректно. Проанализируем настройки на закладке Наборы данных.

Для поля, отвечающего за остаток (например, ВНаличииОстаток), необходимо настроить колонку Роль. Если этого не сделать, СКД будет воспринимать остаток как обычное число и просто складывать его по всем строкам группировки, что приведет к огромным и неверным цифрам.

Выполним настройку роли следующим образом:

  1. Нажмем на кнопку редактирования в колонке «Роль» для поля остатка.
  2. Установим тип Остаток.
  3. Укажем вид Конечный.
  4. В поле «Имя» обязательно укажем связь с измерениями (например, Номенклатура или Склад). Это критически важно для того, чтобы СКД понимала, в разрезе каких объектов нужно рассчитывать итоги.

Способ 3: Использование функции ЕСТЬNULL при левом соединении

Посмотрим на ситуацию со стороны формирования запроса. Обычно отчет «Валовая прибыль» строится на таблице ВыручкаИСебестоимостьПродаж.Обороты, к которой мы присоединяем СвободныеОстатки.Остатки. Мы используем ЛЕВОЕ СОЕДИНЕНИЕ, чтобы увидеть продажи, даже если товара нет на остатке.

Если по какой-то позиции были продажи в периоде, но на момент формирования отчета остаток равен нулю, виртуальная таблица остатков не вернет строку для этой позиции. В результате в колонке остатка будет значение NULL.

Для корректного отображения и возможности участия этого поля в вычисляемых выражениях, в тексте запроса всегда используйте функцию:

ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК ОстатокНаКонец

Проверка через консоль компоновки данных

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

В консоли СКД мы можем увидеть реальные значения параметров, которые подставляются в виртуальные таблицы. Обратите внимание на параметры &П, &П2 и так далее, которые генерирует система. Если вы видите, что в таблицу Обороты и в таблицу Остатки передается один и тот же параметр (например, начало периода), значит, автозаполнение работает против вас и нужно вернуться к Способу 1 — ручному именованию параметров.

Важные замечания по составу даты

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

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

← На главную