Страницы

05 сентября 2021

Дата, момент времени и граница в 1С


Сегодня рассмотрим важные прикладные объекты в 1С; Предприятие 8 - МоментВремени, Граница и тип "Дата". Выясним где их использовать и в чем разница.

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


Содержание

1. Исходная конфигурация для демонстрации
2. Тип "Дата"
2.1 КонецПериода = Дата(2021,08,06);
2.2 КонецПериода передадим дату = Дата(2021,08,06,00,00,01);
2.3 КонецПериода = КонецДня(Дата(2021,08,06));
3. Момент времени
4. Граница
4.1 КонецПериода = Новый Граница(Документ.Дата,ВидГраницы.Исключая)
4.2 КонецПериода = Новый Граница(Документ.Дата,ВидГраницы.Включая);
4.3 КонецПериода = Новый Граница(Документ.МоментВремени(),ВидГраницы.Исключая);
4.4 КонецПериода = Новый Граница(Документ.МоментВремени(),ВидГраницы.Включая);
5. Исходная конфигурация

1. Исходная конфигурация для демонстрации

Для демонстрации получения различных остатков и оборотов при использовании в отборе Даты, МоментаВремени или Границы подготовим конфигурацию со следующими объектами: справочник Номенклатура, документ Приходная накладная, регистр накопления Остатки номенклатуры.

Добавим 5 документов Приходная накладная с одной и той же номенклатурой (Карандаш - 1 шт.).

Внимание! Разница в дате и во времени между первым документом и вторым должна составлять одну секунду. Три документа создаем с одинаковой датой и временем вплоть до секунды. И один документ на конец дня.

В нашем примере:

  • Приходная накладная № 00001 Дата 06.08.2021 00:00:00
  • Приходная накладная № 00002 Дата 06.08.2021 00:00:01
  • Приходная накладная № 00003 Дата 06.08.2021 00:00:01
  • Приходная накладная № 00004 Дата 06.08.2021 00:00:01
  • Приходная накладная № 00005 Дата 06.08.2021 23:59:59

Во всех пяти Приходных накладных оприходуем на склад один карандаш, в итоге пятью документами на склад попадает 5 карандашей. Ниже представлен скрин первой Приходной накладной.

Получилась следующая хронология записанных документов.

Будем рассматривать два варианта, когда передаем период в виртуальную таблицу Регистра накопления обороты и когда передаем дату в виртуальную таблицу Регистра накопления остатки.

Для демонстрации создаем обработку, добавляем форму, на форме размещаем две команды (кнопки) в действии которых, с помощью меню Текст / Конструктор запроса с обработкой результата, генерирую код выполнения запроса и построения отчета. 

Весь код обработки выкладывать в статью не буду, рассмотрим только некоторые его блоки. В конце статьи можете скачать исходную конфигурацию.

На событие конопки Получить обороты, передаем период прописываем код с запросом к РегистрНакопления.ОстаткиНоменклатуры.Обороты.

...
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ | ОстаткиНоменклатурыОбороты.Период КАК Период, | ОстаткиНоменклатурыОбороты.Регистратор КАК Регистратор, | ОстаткиНоменклатурыОбороты.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОбороты.КоличествоОборот КАК Количество |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Обороты(&НачалоПериода, &КонецПериода, Регистратор, )
                КАК ОстаткиНоменклатурыОбороты"; 

Запрос.УстановитьПараметр("НачалоПериода"Дата(2021,08,05)); //Установится 05.08.2021 00:00:00
Запрос.УстановитьПараметр("КонецПериода", КонецПериода); //В переменную КонецПериода будем передавать разные варианты точки времени
РезультатЗапроса = Запрос.Выполнить();
...

На событие конопки Получить остатки, передаем точку времени прописываем код с запросом к РегистрНакопления.ОстаткиНоменклатуры.Остатки.

...
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(&КонецПериода, ) КАК ОстаткиНоменклатурыОстатки";

Запрос.УстановитьПараметр("КонецПериода", КонецПериода); //В переменную КонецПериода будем передавать разные варианты точки времени
РезультатЗапроса = Запрос.Выполнить();
...

2. Тип "Дата"

Тип "Дата" в 1С всегда указывается со временем, если время не указано явно, то, по умолчанию, оно принимает вид 00 часов, 00 минут, 00 секунд. Эту особенность важно учитывать.

Так же если указываем период без времени, к примеру с 1 августа 2021 года по 31 августа 2021 года он интерпретируется в период со временем следующим образом: с 01.08.2021 00:00:00 до 31.08.2021 00:00:01. Получается из периода выпадает целый день кроме времени до первой секунды. Поэтому при указании периода нужно указывать его со временем до секунды, к примеру с 01.08.2021 00:00:00 по 31.08.2021 23:59:59. Указание периода с 01.08.2021 по 01.09.2021 тоже будет не верным, так как в данном случае в период попадет первая секунда 1 сентября 2021.

2.1 КонецПериода = Дата(2021,08,06);

В параметр КонецПериода передадим Дата(2021,08,06);

Сформируем обороты.

Как видим из регистра оборотов в период с 05.08.2021 по 06.08.2021 попали документы записанные с 05.08.2021 00:00:00 до 06.08.2021 00:00:01.

Сформируем остатки.

Как видим из регистра остатков на дату 06.08.2021 не попал ни один документ.

2.2 КонецПериода передадим дату = Дата(2021,08,06,00,00,01);

Проведем еще один эксперимент, в параметр КонецПериода передадим Дата(2021,08,06,00,00,01);

Сформируем обороты.

Как видим из регистра оборотов в период с 05.08.2021 по 06.08.2021 00:00:01 попали документы записанные с 05.08.2021 00:00:00 до 06.08.2021 00:00:02.

Сформируем остатки.

Как видим из регистра остатков на дату 06.08.2021  00:00:01 попал один документ Приходная накладная №00001.

2.3 КонецПериода = КонецДня(Дата(2021,08,06));

Рассмотрим вариант когда параметр КонецПериода = КонецДня(Дата(2021,08,06));

Сформируем обороты.

Как видим из регистра оборотов в период с 05.08.2021 по 06.08.2021 23:59:59 попали документы записанные с 05.08.2021 00:00:00 до 07.08.2021 00:00:00.

Сформируем остатки.

Как видим из регистра остатков на дату 06.08.2021  23:59:59 попали первые 4 документа, документ Приходная накладная №00005 от 06.08.2021 23:59:59 не попал.

3. Момент времени

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

Важно! Момент времени документа может не совпадать с датой и временем документа.

Рассмотрим пример получения данных когда в параметр КонецПериода передаем Документ.МоментВремени(); В качестве документа выберем Приходную накладную №00003 от 06.08.2021 00:00:01. Интересно посмотреть данный документ, так как в промежутке от 00:00:01 до 00:00:02 записано три документа (№00002, №00003 и №00004) и наш выбранный документ находится по центу временной оси.

Сформируем обороты.

Как видим из регистра оборотов в период с 05.08.2021 по МоментВремни() документа Приходная накладная 00003 от 06.08.2021 0:00:01 попали документы записанные с 05.08.2021 00:00:00 по документ включительно Приходная накладная 00003 от 06.08.2021 0:00:01.

Сформируем остатки.

Как видим из регистра оборотов в период с 05.08.2021 по МоментВремни() документа Приходная накладная 00003 от 06.08.2021 0:00:01 попали документы записанные с 05.08.2021 00:00:00 до документа Приходная накладная 00003 от 06.08.2021 0:00:01 исключая его самого, то есть этот документ не попал в остатки.

4. Граница

Объект "Граница" предназначен для точного получения некоторого интервала значений включая или исключая выбранное время. Для этого используется параметр ВидГраницы:
ВидГраницы.Включая - Граница включает граничное значение.
ВидГраницы.Исключая - Граница исключает граничное значение.

4.1 КонецПериода = Новый Граница(Документ.Дата,ВидГраницы.Исключая)

Рассмотрим пример получения данных, когда в параметр КонецПериода передадим Новый Граница(Документ.Дата,ВидГраницы.Исключая); В качестве документа выберем Приходную накладную №00003 от 06.08.2021 00:00:01. Интересно посмотреть данный документ, так как в промежутке от 00:00:01 до 00:00:02 записано три документа (№00002, №00003 и №00004) и наш выбранный документ находится по центу временной оси.

Сформируем обороты.

Можно заметить в отбор попал документ №00001 в период с 05.05.2021 00:00:00 до 06.08.2021 00:00:01. Документ №00002 не попал, так как в качестве источника значения границы выбрали дату документа №00003 (06.08.2021 00:00:001), а по параметру ВидГаницы.Исключить эта дата исключается из периода. 

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

Сформируем остатки.

При формировании остатков мы получили тот же результат. В остатки попал документ №00001 в период на дату 06.08.2021 00:00:01. Документ №00002 не попал, так как в качестве источника значения границы выбрали дату документа №00003 (06.08.2021 00:00:001), а по параметру ВидГаницы.Исключить эта дата исключается из периода. 

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

4.2 КонецПериода = Новый Граница(Документ.Дата,ВидГраницы.Включая);

Рассмотрим пример получения данных, когда в параметр КонецПериода передадим Новый Граница(Документ.Дата,ВидГраницы.Включая); В качестве документа выберем Приходную накладную №00003 от 06.08.2021 00:00:01. Интересно посмотреть данный документ, так как в промежутке от 00:00:01 до 00:00:02 записано три документа (№00002, №00003 и №00004) и наш выбранный документ находится по центу временной оси.

Сформируем обороты.

Можно заметить в отбор попали документы №00001, №00002, №00003 и №00004 в период с 05.05.2021 00:00:00 по 06.08.2021 00:00:01 включительно. Документ №00004 попал, так как в качестве источника значения границы выбрали дату документа №00003 (06.08.2021 00:00:001), а по параметру ВидГаницы.Включить эта дата включается в период. 

Если для документа важно знать только предыдущие операции, такой вариант использовать не правильно, так как попадают все документы проведенные в эту секунду даже после текущего документа (важно понимать как работает Оперативный режим, там такой ситуации не будет).

Сформируем остатки.

При формировании остатков мы получили тот же результат. В остатки попали документы №00001, №00002, №00003 и №00004 на дату 06.08.2021 00:00:01 включительно. Документ №00004 попал, так как в качестве источника значения границы выбрали дату документа №00003 (06.08.2021 00:00:001), а по параметру ВидГаницы.Включить эта дата включается в период. 

Если для документа важно знать только предыдущие операции, такой вариант использовать не правильно, так как попадают все документы проведенные в эту секунду даже после текущего документа (важно понимать как работает Оперативный режим, там такой ситуации не будет).

4.3 КонецПериода = Новый Граница(Документ.МоментВремени(),ВидГраницы.Исключая);

Рассмотрим пример получения данных, когда в параметр КонецПериода передадим Новый Граница(Документ.МоментВремени(),ВидГраницы.Исключая); В качестве документа выберем Приходную накладную №00003 от 06.08.2021 00:00:01. Интересно посмотреть данный документ, так как в промежутке от 00:00:01 до 00:00:02 записано три документа (№00002, №00003 и №00004) и наш выбранный документ находится по центу временной оси.

Сформируем обороты.

Можно заметить в отбор попали документы №00001 и №00002 в период с 05.05.2021 00:00:00 до документа Приходная накладная №00003 от 06.08.2021 00:00:01 исключая из отбора его самого. 

Сформируем остатки.

Можно заметить в остатки попали документы №00001 и №00002 на момент времени 06.05.2021 00:00:01; Приходная накладная №00003 от 06.08.2021 00:00:01 исключая из остатков его самого. 

4.4 КонецПериода = Новый Граница(Документ.МоментВремени(),ВидГраницы.Включая);

Рассмотрим пример получения данных, когда в параметр КонецПериода передадим Новый Граница(Документ.МоментВремени(),ВидГраницы.Включая); В качестве документа выберем Приходную накладную №00003 от 06.08.2021 00:00:01. Интересно посмотреть данный документ, так как в промежутке от 00:00:01 до 00:00:02 записано три документа (№00002, №00003 и №00004) и наш выбранный документ находится по центу временной оси.

Сформируем обороты.

Можно заметить в отбор попали документы №00001, №00002 и №00003 в период с 05.05.2021 00:00:00 по документ Приходная накладная №00003 от 06.08.2021 00:00:01 включая в отбор его самого. 

Сформируем остатки.

Можно заметить в остатки попали документы №00001, №00002 и №00003 на момент времени 06.05.2021 00:00:01; Приходная накладная №00003 от 06.08.2021 00:00:01 включая его самого. 

5. Исходная конфигурация

Проверено на платформе 1С:Предприятие 8.3 (8.3.19.1229).

2 комментария: