К статье
Практический материал

Разработка и Конфигурация · 10 мин

Момент времени в 1С: что это и как с ним работать

Что такое момент времени в 1С, из чего он состоит, как получить и сравнить моменты времени в запросах и коде, типичные ошибки разработчиков.

Момент времени — одна из базовых концепций платформы 1С:Предприятие, без понимания которой сложно корректно работать с проведением документов, остатками регистров и запросами. Ошибки, связанные с неправильным сравнением или получением момента времени, приводят к неверным остаткам, «потерянным» движениям и трудноуловимым дефектам в отчётах.

Момент времени — это не просто дата. Это уникальная позиция объекта на временной оси, которая позволяет платформе однозначно упорядочить документы и другие объекты, даже если у них совпадает дата с точностью до секунды. Именно момент времени определяет, какой документ «раньше», а какой «позже» при расчёте итогов регистров.

Материал рассчитан на разработчиков и внедренцев 1С: разберём состав момента времени, способы его получения в коде и запросах, типичные ошибки и ситуации, когда момент времени действительно нужен, а когда достаточно обычной даты.

Из чего состоит момент времени

Момент времени — составное значение, включающее два компонента: дату (с точностью до секунды) и ссылку на объект базы данных, обычно на документ. Два документа, записанные в одну и ту же секунду, всё равно получат разные моменты времени, потому что ссылки у них разные, а сравнение ссылок внутри платформы детерминировано.

Такое устройство решает фундаментальную задачу учётной системы: движения по регистрам должны накапливаться в строго определённом порядке. Если бы упорядочивание шло только по дате, документы с одинаковым временем могли бы меняться местами, и остатки «на документ» стали бы непредсказуемыми. Ссылка как второй компонент гарантирует стабильный порядок.

В языке запросов момент времени представлен виртуальным полем МоментВремени, доступным у документов и у записей регистров, подчинённых регистратору. Встроенный тип «МоментВремени» также существует как самостоятельный объект, который можно создать конструктором Новый МоментВремени(Дата, Ссылка).

Зачем платформе нужен момент времени

Основное применение — расчёт остатков и оборотов регистров на конкретную границу. Когда отчёт строится «на документ», платформе нужно знать, включать движения этого документа в итог или нет. Именно момент времени задаёт эту границу: виртуальные таблицы остатков принимают его как параметр периодичности.

Вторая задача — последовательности и восстановление проведения. Механизмы контроля последовательности документов опираются на момент времени, чтобы определить, с какой точки нарушен порядок проведения и какие документы нужно перепровести.

Третья задача — корректное сравнение документов в коде и запросах. Сравнение «документ А раньше документа Б» через простые даты ненадёжно: при совпадении секунд результат не определён. Сравнение моментов времени даёт однозначный ответ.

Как получить момент времени в коде

У объекта документа момент времени доступен через свойство МоментВремени. У ссылки на документ момент времени напрямую не хранится — его получают либо через объект, либо запросом, либо создают конструктором, если дата известна.

bsl
// Получение момента времени через объект документа
ДокОбъект = ДокументСсылка.ПолучитьОбъект();
Момент = ДокОбъект.МоментВремени;

// Создание момента времени вручную
Момент = Новый МоментВремени(ДокументСсылка.Дата, ДокументСсылка);

// Сравнение моментов времени
Если ДокОбъект1.МоментВремени < ДокОбъект2.МоментВремени Тогда
	// Документ 1 расположен раньше на временной оси
КонецЕсли;

Обратите внимание: конструктор Новый МоментВремени(Дата, Ссылка) корректно работает, только если переданная дата совпадает с фактической датой документа. Если документ после получения момента времени перепровели со сменой даты, сохранённое ранее значение устареет.

Для проверки того, что момент времени по-прежнему актуален, полезно сравнить его с запрошенным из базы значением. Это особенно важно в долгих операциях, где между чтением данных и записью проходит заметное время.

Момент времени в запросах

В языке запросов поле МоментВремени есть у таблиц документов и у таблиц регистров, подчинённых регистратору. Через него удобно упорядочивать выборку и отбирать записи до или после конкретного документа.

Типовой приём — получить остатки регистра на границу документа. Для этого в параметр периодичности виртуальной таблицы остатков передают момент времени документа, а не просто дату:

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

Есть тонкость: при передаче момента времени в виртуальную таблицу остатков движения самого документа-границы в результат включаются или не включаются в зависимости от того, как платформа обрабатывает границу, и это поведение нужно проверять на тестовых данных конкретной конфигурации. Если нужна граница строго «до документа», часто используют объект типа «Граница» с видом «Исключая».

Для упорядочивания записей регистра по времени внутри одной секунды сортировки по полю Период недостаточно — добавляйте в упорядочивание МоментВремени или Регистратор.

Момент времени и граница: в чём разница

Рядом с моментом времени в платформе существует тип «Граница». Граница — это момент времени плюс признак включения: «Включая» или «Исключая». Она уточняет, попадает ли сам объект-граница в выборку.

Сравнение вариантов

Дата

Подходит для отбора по периоду в целом. Не даёт однозначного порядка при совпадении секунд и не подходит для границ документов.

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

Однозначно позиционирует документ на временной оси. Используется для сравнения документов и как параметр виртуальных таблиц.

Граница

Момент времени с признаком включения. Применяется, когда нужно точно указать, входит ли граничный документ в выборку (например, в методе ВыбратьДвиженияСОстатками).

Типичный сценарий использования границы — метод регистра ВыбратьДвиженияСОстатками, который возвращает движения документа вместе с остатками на заданную границу. Передав границу «Исключая», вы получите остатки до движений документа, что часто нужно при контроле остатков в обработке проведения.

Типичные ошибки при работе с моментом времени

Типичные ошибки
01
Сравнение документов только по дате: при совпадении секунд порядок не определён, и логика «последний документ дня» работает нестабильно.
02
Передача в виртуальную таблицу остатков даты вместо момента времени: остатки считаются на начало секунды, без учёта позиции документа, что искажает контроль остатков при проведении.
03
Кэширование момента времени надолго: после перепроведения документа с новой датой сохранённое значение перестаёт соответствовать реальности.
04
Попытка получить момент времени у незаписанного документа: до записи у объекта нет ссылки, и позиция на временной оси не определена.

Отдельно стоит ошибка с часовыми поясами. Дата документа хранится без явного указания часового пояса сеанса, и в распределённых системах или при обмене данными между базами в разных поясах сравнение моментов времени может давать неожиданные результаты. Если база обслуживает несколько регионов, унифицируйте правило установки дат документов.

Как проверить корректность логики

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

Контрольные точки

Как проверить результат

Порядок документов с одинаковой датой
Норма

Сортировка по моменту времени стабильна, итоги не меняются от перепроведения

Тревожный признак

Остатки «прыгают» в зависимости от порядка проведения документов

Остатки на документ в отчёте
Норма

Виртуальная таблица получает момент времени, движения граничного документа учтены ожидаемо

Тревожный признак

В параметр передана только дата, движения документа учитываются непредсказуемо

Контроль остатков при проведении
Норма

Используется момент времени или граница «Исключая», минуса ловятся корректно

Тревожный признак

Контроль пропускает отрицательные остатки при документах в одну секунду

Полезный приём отладки — вывести момент времени в сообщение или журнал вместе с датой документа. Если два документа показывают одинаковую дату, но разный порядок в запросе, причина почти всегда в ссылочной части момента времени, и это нормальное поведение платформы, а не ошибка данных.

Итог

Что важно запомнить

Момент времени = дата + ссылка, он уникален для каждого объекта и задаёт стабильный порядок на временной оси. Используйте его вместо даты при сравнении документов и в параметрах виртуальных таблиц остатков, а для управления включением границы применяйте тип «Граница».

FAQ

Чем момент времени отличается от даты документа?

Дата — это просто отметка времени с точностью до секунды, она может совпадать у многих документов. Момент времени дополнительно включает ссылку на объект, поэтому уникален и позволяет однозначно упорядочить документы даже при совпадающих датах.

Можно ли получить момент времени, имея только ссылку на документ?

Напрямую из ссылки — нет. Получите момент времени запросом к таблице документа (поле МоментВремени), через объект документа или создайте конструктором Новый МоментВремени(Ссылка.Дата, Ссылка), если дата вам известна и актуальна.

Что передавать в виртуальную таблицу остатков: дату или момент времени?

Если остатки нужны на документ (например, для контроля при проведении) — передавайте момент времени документа. Дата подходит только для отчётов «на конец дня» или произвольный период, где позиция конкретного документа не важна.

Что произойдёт с моментом времени при изменении даты документа?

Момент времени изменится, так как дата — его составная часть. Если вы сохранили момент времени до перепроведения, он станет неактуальным: получайте значение заново после записи или проведения документа.

Нужен ли момент времени для независимых регистров сведений?

Нет. Момент времени имеет смысл для объектов, упорядоченных на временной оси: документов и записей регистров, подчинённых регистратору. У независимых регистров сведений есть только период, ссылочной части и момента времени у их записей нет.

Как сравнить два документа: какой проведён раньше?

Сравните их моменты времени оператором «меньше»/«больше» в коде или упорядочьте запрос по полю МоментВремени. Сравнение только по датам ненадёжно: при совпадении секунд результат будет непредсказуемым.