Особенности использования периодов и моментов времени

В версии 1С:Предприятия 8, в отличие от версии 1С:Предприятия 7.7, дата включает в себя время с точностью до секунды. То есть дата указывается вместе со временем. Если время не указано явно, то, по умолчанию, оно принимает значение 0 часов, 0 минут, 0 секунд. Разница между датами теперь вычисляется в секундах. Кроме того, эту особенность надо учитывать при указании периодов. Так, если раньше период с 01.01.2003 по 31.01.2003 означал период за весь месяц январь 2003 года, то теперь этот же период будет означать период с первой секунды 1 января 2003 года по первую секунду 31 января 2003 года. То есть период не будет включать почти весь день 31 января, кроме его первой секунды. Для указания в качестве периода всего месяца нужно указать период следующим образом: с 01.01.2003 00:00:00 по 31.01.2003 23:59:59. Указание периода с 01.01.2003 по 01.02.2003 тоже будет не верным, так как в данном случае в период попадет первая секунда 1 февраля 2003.

Обычно пользователь для указания периода вводит даты без указания времени. При этом пользователь, введя период с 01.01.2003 по 31.01.2003, подразумевает период за месяц в целом. Если эти значение передать в системные функции или запрос, то они будут восприняты буквально: с 01.01.2003 00:00:00 по 31.01.2003  00:00:00. Поэтому при передаче конечного периода в системную функцию нужно привести его значение к концу дня. Для приведения конечной границы периода удобно использовать функцию КонецДня. Эта функция возвращает дату равную последней секунде дня, то есть Дата(2003, 1, 31,  23, 59, 59) и КонецДня(Дата(2003, 1, 31)) приводят к одному и тому же результату.

Копировать в буфер обмена
Обороты = РегистрыНакопления.ДенежныеСредстваКомпании.Обороты(Дата(2003, 1, 1), КонецДня(Дата(2003, 1, 31)));

В 1С:Предприятии версии 7.7 была возможность задавать момент времени и период с точностью до документа. Эта возможность была сохранена и развита. Так как теперь документ может записывать движения в разные периоды времени, а не только совпадающие с его собственной датой, для указания момента времени с точностью до документа был введен новый объект МоментВремени, который задается датой и ссылкой на регистратор. При этом дата момента времени не обязательно должна совпадать с датой документа. Для получения момента времени, содержащего дату документа и сам документ, можно воспользоваться методом документа МоментВремени. Например, если нам надо вычислить остатки на документ, то передавать в метод, вычисляющий остатки в качестве параметра, ссылку на документ неправильно. Нужно передать в качестве параметра объект МоментВремени, который можно получить либо методом ссылки документа МоментВремени, либо сконструировав его с помощью оператора Новый.

Копировать в буфер обмена
Остатки = РегистрыНакопления.ДенежныеСредстваКомпании.Остатки(Документ.МоментВремени());

или

Копировать в буфер обмена
Остатки = РегистрыНакопления.ДенежныеСредстваКомпании.Остатки(Новый МоментВремени(Документ.Дата, Документ));

Параметры типа Дата и МоментВремени используются в системных функциях и виртуальных таблицах при вычислении остатков и оборотов. Остатки вычисляются на определенный момент времени. При указании момента времени для вычисления остатков, по умолчанию, считается, что момент времени задан исключительно. То есть если в качестве момента времени задана дата 21.11.2003 12:00:00, то остатки будут посчитаны на начало 12 часов 21 ноября 2003 года. Движения, сделанные в этот момент времени, не будут учтены при подсчете остатков. Например, есть следующие записи регистра накопления:

Период Регистратор Вид движения Товар Количество
21.11.2003 11:59:59 Приход товара №1 Приход Холодильник 5
21.11.2003 12:00:00 Расход товара №1 Расход Холодильник 2
21.11.2003 12:00:00 Расход товара №2 Расход Холодильник 1

Посчитав остатки на 21.11.2003 12:00:00, получим, что остаток по товару холодильник равен 5 штукам. Посчитав остатки на 21.11.2003 12:00:01, получим, что остаток по товару холодильник равен 2 штуки. Для того чтобы задать момент времени включительно, нужно воспользоваться объектом Граница. У этого объекта можно явно указать, задан момент времени включительно или исключительно. В предыдущем примере, посчитав остатки на границу заданную, как дата 21.11.2003 12:00:00 и вид границы включительно, получим остаток по товару холодильник равный 2 штукам. Важно отметить, что в данном случае были посчитаны записи и по документу Расход товара №1, и по документу Расход товара №2. Это произошло из-за того, что граница была заданна значением типа дата. Если задать границу моментом времени, состоящим из даты 21.11.2003 12:00:00 и регистратора Расход товара №1, то при подсчете остатков записи по документу расход товара №2 не будут учтены и остаток по товару холодильник будет равен 3 штукам. Следующая схема иллюстрирует расположение границ на оси времени:

Обороты, в отличие от остатков, вычисляются за определенный период времени. Период задается двумя границами. По умолчанию, обе границы задаются включительно. Для начальной и конечной границы понятия включительно и исключительно имеют разную интерпретацию. Для конечной границы эта интерпретация совпадает с тем, как интерпретируются данные понятия при вычислении остатков. То есть если граница задается датой, то для варианта включительно берется момент времени на конец секунды, для варианта исключительно берется момент на начало секунды. Для начальной границы интерпретация производится с точностью до наоборот. Для варианта включительно берется начало секунды, для варианта исключительно берется конец секунды. Допустим, считаются обороты за период с 21.11.2003 00:00:00 по 21.11.2003 23:59:59 включительно и исключительно, то периоды для обоих вариантов будут следующими: