Момент времени 1с что это
Общие приемы и механизмы решения задач – тема № 3:
Что такое момент времени и для чего он используется
Для документа реквизит Дата включает в себя дату и время с точностью до секунды. При этом в случае неоперативного проведения документов возможна ситуация, когда для двух и более документов установлена одинаковая дата и одинаковое время:
Рисунок 1 – Список документов с одинаковой датой и временем
Чтобы данные документы разместить в хронологическом порядке, платформа использует объект Момент времени:
Рисунок 2 – Расположение документов на оси времени
Момент времени создается платформой автоматически, и изменить его в пределах одной секунды невозможно. Изменить хронологию документов можно, только переместив дату одного из документов на следующую секунду.
Момент времени представляет собой поле Дата+Ссылка:
Рисунок 3 – Представление момента времени
Момент времени используется для решения следующих задач:
Принципиален вопрос, как получать остатки из регистров накопления: на Дату документа или на Момент времени?
К сожалению, у Вас недостаточно прав для дальнейшего просмотра.
Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.
Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.
Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.
Особенности использования периодов и моментов времени
В версии 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)) приводят к одному и тому же результату.
В 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 включительно и исключительно, то периоды для обоих вариантов будут следующими:
АйТиБложик
Маленький IT блог с характером 1С.
Понятие момента времени. МоментВремени.
Для определения положения документа на временной оси используется реквизит документа Дата, он является стандартным реквизитом.
1. Стандартные реквизиты документа |
Дата содержит время с точностью до секунды. Это позволяет контролировать последовательность внесения документов в базу данных.
2. Расположение документов на оси времени |
Однако при большом объеме создаваемых документов может возникнуть ситуация, когда несколько документов будут иметь одинаковое значение даты (т. е. будут созданы в течение одной секунды). Возникает вопрос, как в этом случае определить в какой последовательности были созданы документы?
Для обработки подобных ситуаций было введено понятие момент времени. Момент времени представляет собой совокупность даты, времени и ссылки на объект базы данных (МоментВремени = Дата + Ссылка). Он позволяет однозначно идентифицировать положение любого объекта ссылочного типа базы данных на временной оси, но имеет смысл в основном только для документов. Документ имеет виртуальное поле МоментВремени, которое не хранится в базе данных и доступно при построении запросов. Кроме того, момент времени позволяет идентифицировать и не объектные данные, например, записи регистров, подчиненных регистратору.
Понятие момента времени реализовано во встроенном языке при помощи универсального объекта МоментВремени. Этот объект имеет свойства Дата и Ссылка, которые позволяют получить «составляющие» момента времени, и один метод – Сравнить(), при помощи которого возможно сравнение двух моментов времени между собой. Кроме этого объект МоментВремени имеет конструктор и может быть создан в явном виде для любого объекта базы данных ссылочного типа. Используется в качестве значений свойств и параметров методов других объектов, имеющих тип МоментВремени. Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XML. Доступен: тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Для нескольких документов, имеющих одинаковую дату и время, последовательность их на оси событий определяется системой исходя из ссылок на эти документы. Она может не совпадать с последовательностью создания документов и быть недоступна для изменения пользователем.
Даты в 1С:Предприятие 8
В 1С:Предприятии 8 используется несколько типов для указания точки на временной оси: дата, момент времени, граница. Разберемся в чем разница между этими типами.
Тип Дата всегда включает в себя дату и время с точностью до секунды.
При создании реквизитов объектов и реквизитов форм можно ограничить ввод допустимых значений, задав свойство «состав даты»:
Вне зависимости от указанного свойства «состав даты», в базе данных дата хранится в едином формате, с точностью до секунды.
Как программно указать конкретную дату
В языке 1С можно задать с помощью:
Литерал типа дата представляет собой строку цифр вида ‘ГГГГММДДччммсс’, заключенную в одинарные кавычки, например:
Час, минуту и секунду указывать не обязательно.
В литерале даты допускается использование различных разделителей:
Функция Дата () имеет два варианта синтаксиса:
Пример указания пустой даты:
Как указать конкретную дату в запросе
В запросе для указания даты можно использовать:
Момент времени
Момент времени содержит дату, время и ссылку на объект базы данных, что позволяет однозначно идентифицировать объект на оси времени. Примеры получения момента времени:
Граница
Граница содержит точку на оси времени (например, секунду) и вид границы этой точки (Включая, Исключая).
Данный тип используется в тех случаях, когда важно указание включения или исключения граничного значения, например, при получении остатков в запросе.
Остались вопросы?
Спросите в комментариях к статье.
2 комментария
Для чего передавать в МоментВремени() Дату, если передается ссылка на сам документ? Какой смысл в момент времени передать дату, отличную от даты документа, переданного в качестве второго параметра? Или передавать ту же самую дату, что есть в документе, ведь она уже там есть…Точнее ведь не будет =)
Никак не могу для себя ответить на этот вопрос.
Дело в том, что документ может делать движения не только на дату документа, но и на произвольную дату.
Проведение документов
Рассмотрим подробно свойства документа на вкладке «Движения»
Процедура ОбработкаПроведения
Формирование новых наборов записей регистров включает в себя операции, состоящие:
Следует учитывать, что при автоматической записи движений они будут записаны с замещением, то есть старые движения документа будут замещены новыми. Фактически, платформа неявно выполнит код:
Действие данного параметра проявляется в случае, если на момент записи нового (или модифицированного) набора записей в регистре присутствуют еще записи, подчиненные данному же регистратору.
Подробнее о формировании движений
С точки зрения платформы отдельного процесса «проведение» не существует. Есть запись документа с проведением, причем в рамках одной транзакции. Таким образом, в момент выполнения обработчика события ОбработкаПроведения документ уже записан.
Свойство «Удаление движений» документа как объекта конфигурации стандартно устанавливается платформой в значение «Удалять автоматически при отмене проведения». Это значит, что при перепроведении документа движения, подчиненные данному документу, перезаписываются, а при отмене проведения движения документа автоматически удаляются.
Если разработчик захочет реализовать нестандартный вариант проведения документа и установит свойство «Удаление движений» в значение «Удалять автоматически», то при записи документа с проведением сначала будут удалены все старые движения документа. То есть на момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа.
При записи с проведением система автоматически запишет выбранные и незаписанные наборы записей, находящиеся в свойстве «Движения». Отсюда следуют два важных вывода:
В случаях, если необходимо программно вызвать саму обработку проведения, инициируется запись документа с проведением. Пример программного вызова проведения документа в оперативном режиме:
Пример перепроведения документов РеализацияТоваров в интервале с ДатаНачала по ДатаОкончания :
Оперативное и неоперативное проведение
Оперативное и неоперативное проведение подразумевает, что работа пользователей может происходить в двух принципиально разных по своей сути режимах. Оперативное проведение документов пользователями выполняется в режиме «реального времени», то есть отображает изменения, факты, свершающиеся в настоящее время. Поэтому при этом способе проведения документов следует осуществлять максимум проверок, способных исключить ошибки при вводе данных пользователями.
Например, при оперативном проведении следует выполнять контроль остатков на складе списываемой номенклатуры с тем, чтобы исключить одновременную продажу одного товара несколькими продавцами. При оперативном проведении документа система, прежде всего, проверит положение даты документа относительно текущей даты сеанса. Если дата проводимого документа совпадает с текущей датой сеанса, то система будет проводить такой документ в оперативном режиме, и в обработке проведения об этом можно узнать, чтобы выстроить определенный алгоритм проведения документа.
Если дата проводимого документа меньше текущей даты сеанса, то такой документ система будет проводить в неоперативном режиме. Неоперативное проведение документов подразумевает отражение в базе данных фактов, которые свершились в прошлом или которые точно будут совершены в будущем. Поэтому задача неоперативного проведения документов — просто отразить в информационной базе данные о совершенных операциях.
При неоперативном проведении документов не имеет смысла производить целый ряд проверок, в частности контроль остатков. Подразумевается, что если в процессе неоперативного проведения документов были допущены ошибки (например, списано такое количество номенклатуры, которого не было на складе на дату проведения документа), то анализ полученного состояния базы данных является отдельной задачей, не относящейся к неоперативному проведению.
С оперативным проведением документов связано понятие оперативной отметки времени и понятие момента времени.
Понятие момента времени
Для определения положения документа на оси времени используется реквизит документа «Дата». Дата содержит время с точностью до секунды. Это позволяет контролировать последовательность записи документов. Однако при большом объеме создаваемых документов вероятна ситуация, когда несколько документов будут иметь одинаковое значение даты (т. е. будут созданы в течение одной секунды). Как в этом случае определить последовательность созданных документов?
Для обработки подобных ситуаций было введено понятие момент времени. Момент времени представляет собой совокупность даты, времени и ссылки на объект базы данных. Он позволяет однозначно идентифицировать любой объект ссылочного типа базы данных на оси событий, но имеет смысл в основном только для документов. Кроме того, момент времени позволяет идентифицировать и необъектные данные, например, записи регистров, подчиненных регистратору.
Для нескольких документов, имеющих одинаковую дату и время, последовательность их на оси событий определяется системой исходя из ссылок на эти документы. Она может не совпадать с последовательностью создания документов, и она недоступна для изменения пользователем, то есть нельзя каким-либо образом повлиять на последовательность документов внутри одной секунды или вычислить, что один документ создан раньше, а другой — позже.
Оперативная отметка времени создается системой каждый раз при оперативном проведении документа. Ее значение формируется исходя из текущей даты сеанса и последней созданной оперативной отметки. Если последняя оперативная отметка меньше текущей даты сеанса, в качестве новой оперативной отметки принимается текущая дата сеанса. Если последняя оперативная отметка равна или больше текущей даты сеанса, в качестве новой оперативной отметки принимается значение на одну секунду большее, чем старая оперативная отметка времени.
Таким образом, если у объекта конфигурации Документ установлено свойство оперативного проведения, последовательность действий системы будет следующей: