При работе с виртуальной таблицей ОстаткиИОбороты в консоли запросов или СКД часто возникает ситуация, когда при выводе данных за несколько периодов (например, по годам) сумма остатков в промежуточных периодах выглядит неверно. Давайте разберемся, почему так происходит и как с этим работать правильно.
Основная проблема заключается в том, как платформа обрабатывает поля, которые содержат остатки. Когда вы в тексте запроса складываете несколько полей, например СтоимостьНачальныйОстаток + ДопРасходыНачальныйОстаток, система перестает воспринимать результат как «остаток». Для механизма итогов 1С это становится обычным числовым полем (оборотом).
При выводе итогов по годам платформа автоматически применяет к таким ресурсам функцию Сумма. В результате остаток на конец 2018 года прибавляется к остатку на конец 2019 года, что математически неверно. Остаток — это состояние на конкретный момент времени, его нельзя суммировать по периодам.
Чтобы отчет работал корректно, необходимо правильно настроить ресурсы в СКД. Рассмотрим шаги по исправлению ситуации:
СтоимостьНачальныйОстаток, ДопРасходыНачальныйОстаток) отдельным полем.Сумма нужно использовать функции, которые корректно обрабатывают иерархию, например Максимум или ПоследнееЗначение (в зависимости от настроек группировки).Остаток.Важно помнить, что виртуальная таблица ОстаткиИОбороты возвращает записи только за те периоды, в которых были движения (обороты). Если в течение 2019 года движений по конкретной номенклатуре не было, записи за этот период в выборке не будет, что приводит к «разрывам» в итогах.
Чтобы избежать этой проблемы, рекомендуется выполнить следующие действия:
Рассмотрим метод использования вложенных запросов:
ВЫБРАТЬ
Партии.Номенклатура,
Партии.СтоимостьКонечныйОстаток
ИЗ
РегистрНакопления.СебестоимостьТоваров.ОстаткиИОбороты(&Начало, &Конец, Авто, , ) КАК Партии
ГДЕ
Партии.Период = &НужнаяДата
Если вам нужно получить полные данные, включая периоды без оборотов, используйте объединение с таблицей периодов или связку наборов данных в СКД, где один набор содержит все необходимые даты, а второй — данные регистра.
Часто ошибки возникают из-за разницы между датой и границей периода. Поскольку регламентные операции в 1С (например, расчет себестоимости) часто записываются на 23:59:59, важно использовать функцию КонецПериода в параметрах запроса:
ВЫБРАТЬ
Партии.СтоимостьНачальныйОстаток
ИЗ
РегистрНакопления.СебестоимостьТоваров.ОстаткиИОбороты(
&НачалоПериода,
КонецПериода(&КонецПериода, ДЕНЬ),
Авто, ,
) КАК Партии
Итак, мы выяснили, что:
Сумма, а как ПоследнееЗначение.КонецПериода для корректного захвата данных регламентных операций.Применяя эти методы, вы добьетесь того, что начальный остаток каждого периода будет в точности равен конечному остатку предыдущего.