Сегодня рассмотрим важные прикладные объекты в 1С; Предприятие 8 - МоментВремени, Граница и тип "Дата". Выясним где их использовать и в чем разница.
При получении различных срезов по измерениям из регистров важно передать правильное значение даты в отбор для вывода из регистра достоверной информации учитывая хронологию всех зависимых документов. Например, при получении остатков номенклатуры при реализации.
Содержание
1. Исходная конфигурация для демонстрации2. Тип "Дата"
2.1 КонецПериода = Дата(2021,08,06);3. Момент времени
2.2 КонецПериода передадим дату = Дата(2021,08,06,00,00,01);
2.3 КонецПериода = КонецДня(Дата(2021,08,06));
4. Граница
4.1 КонецПериода = Новый Граница(Документ.Дата,ВидГраницы.Исключая)5. Исходная конфигурация
4.2 КонецПериода = Новый Граница(Документ.Дата,ВидГраницы.Включая);
4.3 КонецПериода = Новый Граница(Документ.МоментВремени(),ВидГраницы.Исключая);
4.4 КонецПериода = Новый Граница(Документ.МоментВремени(),ВидГраницы.Включая);
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 карандашей. Ниже представлен скрин первой Приходной накладной.
Получилась следующая хронология записанных документов.
Будем рассматривать два варианта, когда передаем период в виртуальную таблицу Регистра накопления обороты и когда передаем дату в виртуальную таблицу Регистра накопления остатки.
Для демонстрации создаем обработку, добавляем форму, на форме размещаем две команды (кнопки) в действии которых, с помощью меню Текст / Конструктор запроса с обработкой результата, генерирую код выполнения запроса и построения отчета.
Весь код обработки выкладывать в статью не буду, рассмотрим только некоторые его блоки. В конце статьи можете скачать исходную конфигурацию.
На событие конопки Получить обороты, передаем период прописываем код с запросом к РегистрНакопления.ОстаткиНоменклатуры.Обороты.
На событие конопки Получить остатки, передаем точку времени прописываем код с запросом к РегистрНакопления.ОстаткиНоменклатуры.Остатки.
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 включая его самого.
Просто и понятно. Без воды.
ОтветитьУдалитьСпасибо!
Удалить