Рассмотрим виртуальные таблицы в СКД 1С: Обороты, Остатки, ОстаткиИобороты.
Дано: регистр накопления(остатки) в котором есть запись на 31.12.2021 23:59:59
Виртуальная таблица Остатки строится на начало секунды, указанной в параметре Период, другими словами не включают дату. Об этом рассказано в статье ИТС Особенности использования периодов и моментов времени при получении остатков. Таким образом следующий запрос:
ВЫБРАТЬ Остатки.Товар КАК Товар, Остатки.Склад КАК Склад, Остатки.КоличествоОстаток КАК Остаток ИЗ РегистрНакопления.ТоварныеЗапасы.Остатки(&Период, Товар = &Товар) КАК Остатки
при использовании различных параметров приведет к разным результатам
Период | Остаток | Примечание |
31.12.2021 23:59:59 | 10 | Остаток на начало секунды. Не совсем то что мы хотели |
01.01.2022 0:00:00 | 9 | Остаток на начало следующей секунды. То что нужно! |
Граница Включая; 31.12.2021 23:59:59 | 9 | Используется объект Граница с видом Включая. То что нужно! |
Виртуальные таблицы Обороты, Остатки и обороты включают дату начала и дата окончания. Об этом написано в статье ИТС Особенности использования периодов и моментов времени при получении оборотов. Проверим это следующим запросом:
ВЫБРАТЬ Обороты.Товар КАК Товар, Обороты.Склад КАК Склад, Обороты.КоличествоОборот КАК Количество ИЗ РегистрНакопления.ТоварныеЗапасы.Обороты(&НачалоПериода, &КонецПериода, , Товар = &Товар) КАК Обороты
При параметрах НачалоПериода = 01.01.2021 12:00:00 и КонецПериода = 31.12.2021 23:59:59 получаем значение в поле Количество = 9
Также существует миф что СКД учитывает остатки на конец секунды когда передаем параметр период в виртуальную таблицу Остатки. Но это не так, так как в наборе данных запрос используется обычный запрос. Поэтому при получении остатков также следует учитывать то что остатки будут получены на начало секунды, и позаботиться о том чтобы установить значение параметра период +1 секунда.
Важно! при использовании объекта Стандартный период — дата начала это начало дня, дата окончания это всегда конец дня, если дата окончания указана. При такой настройке параметров
если в параметре СтандартныйПериод выбрать 01.12.2021 — 31.12.2021, то значения параметров НачалоПериода, КонецПериода будут вычислены начало и конец дня, соответственно:
Это интересно. В то же время при передаче в функцию ДобавитьКДате() параметра Стандартный период.ДатаОкончания если дата окончания не заполнена то результатом вычисления функции будет пустая дата. Другими словами, дополнительно проверять, что значение заполнено не требуется.
СтандартныйПериод с пустой датой окончания и значение параметра ДатаОстатков:
В итоге, учитывая все вышеперечисленное всегда стоит помнить, что при использовании виртуальной таблицы остатки при получении остатков всегда надо добавлять секунду к периоду, даже если используется объект Стандартный период.