Разработка и Конфигурация · 10 мин
Момент времени в 1С: что это такое и как с ним работать
Момент времени в 1С — составное значение из даты и ссылки на документ. Разбираем, зачем нужен, как используется в проведении, запросах и границах последовательностей.
Момент времени в 1С — это специальный тип данных, который однозначно определяет позицию документа на временной оси. В отличие от обычной даты, он состоит из двух компонентов: даты документа и ссылки на сам документ. Такая конструкция нужна потому, что несколько документов могут иметь одинаковую дату с точностью до секунды, и платформе требуется способ различать их порядок.
Каждый документ в информационной базе автоматически получает свой момент времени при записи. Именно по нему платформа сортирует документы в журналах, определяет актуальность движений по регистрам и вычисляет границы последовательностей. Понимание этого механизма критично для разработчиков, которые пишут запросы к остаткам, настраивают проведение или восстанавливают последовательности.
Ошибки в работе с моментом времени — частая причина некорректных остатков и «потерянных» документов в отчётах. Например, сравнение документов только по дате приводит к неоднозначным результатам, когда два документа проведены в одну секунду. Ниже разберём устройство типа, практические сценарии использования и типичные ошибки.
Из чего состоит момент времени и почему одной даты недостаточно
Дата в 1С хранится с точностью до секунды. На практике два и более документов легко могут получить одинаковую дату: при пакетной загрузке, обмене данными или одновременной работе пользователей. Если бы платформа упорядочивала документы только по дате, она не смогла бы определить, какой из них «раньше», а значит — не смогла бы корректно считать остатки на конкретный документ.
Момент времени решает эту задачу: при равных датах документы сравниваются по ссылке (внутреннему уникальному идентификатору). В результате порядок документов на оси времени всегда однозначен и воспроизводим. Это фундамент, на котором строятся виртуальные таблицы остатков и механизм последовательностей.
Важно понимать: момент времени не является самостоятельным объектом базы данных. Он вычисляется на лету из даты и ссылки документа, поэтому «изменить момент времени» напрямую нельзя — можно только изменить дату документа или перепровести его.
Как получить момент времени в коде
Во встроенном языке момент времени создаётся конструктором Новый МоментВремени(Дата, Ссылка). У документа готовое значение доступно через свойство МоментВремени объекта или ссылки. Для сравнения позиций двух документов существует метод Сравнить(), который возвращает -1, 0 или 1.
Момент = Новый МоментВремени(Документ.Дата, Документ.Ссылка);
Если Документ1.МоментВремени().Сравнить(Документ2.МоментВремени()) < 0 Тогда
// Документ1 расположен раньше на оси времени
КонецЕсли;Типичная задача — определить, какой из двух документов проведён «позже» в логике учёта, а не по факту записи. Сравнение дат здесь ненадёжно, сравнение моментов времени — корректно всегда. Учтите, что сравнение ссылок напрямую (операторами < и >) не даёт гарантированного хронологического порядка и не предназначено для этой цели.
Момент времени в запросах и виртуальных таблицах
При обращении к виртуальным таблицам остатков регистров накопления и сведений параметр «Период» может принимать не только дату, но и момент времени. Разница существенная: если передать дату, остатки рассчитаются на начало этой секунды; если передать момент времени документа — остатки будут включать движения самого документа (для таблицы «Остатки» с границей, заданной моментом, документ попадает в расчёт).
Это критично при проведении документа с контролем остатков: нужно получить остатки именно на позицию текущего документа, чтобы не учитывать более поздние документы и не потерять свои же движения при перепроведении. Для этого в запрос передают &МоментВремени, где параметр — момент времени проводимого документа.
Для точного управления включением граничных записей в запросах используется объект «Граница» с видом «Включая» или «Исключая». Конструкция Новый Граница(МоментВремени, ВидГраницы.Включая) явно задаёт, входит ли документ в выборку. Это надёжнее, чем полагаться на поведение по умолчанию.
Момент времени и последовательности документов
Последовательности документов — механизм, который отслеживает актуальность проведения связанных документов. Граница последовательности — это как раз момент времени: позиция, начиная с которой документы требуют перепроведения. Если бухгалтер задним числом изменил приходную накладную, граница сдвигается на момент времени этого документа.
Восстановление последовательности означает перепроведение всех документов от границы до текущей позиции в порядке их моментов времени. Платформа гарантирует, что каждый документ при этом увидит остатки, рассчитанные с учётом всех предыдущих документов, — именно благодаря однозначному упорядочиванию.
- 1Откройте в режиме 1С:Предприятие меню «Операции» — «Проведение документов» — «Восстановление последовательностей» (или аналог в вашей конфигурации)
- 2Посмотрите дату и документ, на которых стоит граница
- 3Если граница в прошлом — выполните восстановление последовательности либо перепроведите документы с этой позиции
- 4Проверьте отчёт по остаткам: после восстановления значения должны стать корректными
Перед массовым перепроведением обязательно сделайте резервную копию базы. Восстановление последовательности на большом периоде может занять значительное время и изменить движения тысяч документов, а откатить это штатными средствами нельзя.
Практические сценарии и типичные ошибки
Сценарий первый — контроль остатков при проведении расходного документа. Правильный подход: запрос к виртуальной таблице остатков с параметром-моментом времени текущего документа и границей «Исключая», чтобы свои же движения не мешали контролю. Ошибка — использовать ТекущаяДата(): при перепроведении задним числом контроль будет выполняться по остаткам «на сейчас», а не на позицию документа.
Сценарий второй — построение отчёта «на документ». Пользователь хочет видеть остатки с учётом конкретной накладной. Передайте в параметр момент времени документа, а не его дату: иначе при совпадающих датах результат может отличаться от ожидаемого.
Сценарий третий — обмен данными и загрузка документов. При выгрузке документов из одной базы в другую моменты времени пересчитываются, так как ссылки различаются. Если логика обмена опирается на сравнение моментов времени между базами, результат будет некорректным — сравнивайте даты в сочетании со стабильными идентификаторами обмена.
Чем момент времени отличается от похожих понятий
Сравнение понятий
Просто точка на оси времени с точностью до секунды. Не различает документы с одинаковой датой
Дата + ссылка. Однозначно упорядочивает документы, используется в остатках и последовательностях
Обёртка над моментом времени или датой с признаком «включая/исключая». Применяется как параметр запросов и итогов
Дата записи регистра. У движений документа период равен дате документа, но порядок внутри секунды задаётся моментом времени регистратора
Практический вывод: дата подходит для интерфейсных задач и отборов по периоду, момент времени — для расчётов, зависящих от позиции конкретного документа, граница — для точного управления выборками в запросах. Путать их нельзя: типы несовместимы, и платформа выдаст ошибку или неочевидный результат.
Как проверить, что всё работает правильно
Как проверить результат
Остатки учитывают движения выбранного документа и не включают более поздние
Остатки «прыгают» при перепроведении документов с той же датой
Граница стоит на последнем актуальном документе, восстановление не требуется
Граница в прошлом, отчёты за период после границы могут быть недостоверны
Срабатывает только при реальной нехватке на момент документа
Ложные срабатывания при перепроведении или пропуск реальных минусов
Для отладки в конфигураторе полезно выводить момент времени документа в сообщения или журнал регистрации при проведении. Это позволяет увидеть реальный порядок обработки документов и быстро найти причину расхождений в расчётах.
Что важно запомнить
Момент времени = дата + ссылка на документ, он однозначно задаёт позицию документа на оси времени. Используйте его в запросах к остаткам, при контроле проведения и в работе с последовательностями; для управления включением граничных записей применяйте объект «Граница». Перед массовым перепроведением делайте копию базы.
Частые вопросы
Можно ли изменить момент времени документа вручную?
Напрямую — нет, момент времени вычисляется из даты и ссылки. Изменить позицию документа можно, только изменив его дату и перепроведя. Ссылка после создания документа не меняется.
Чем отличается передача даты и момента времени в параметр виртуальной таблицы остатков?
Дата задаёт расчёт на начало секунды без привязки к документу. Момент времени привязывает расчёт к позиции конкретного документа, что важно при совпадающих датах и при контроле остатков в проведении. Для точного управления включением документа используйте объект «Граница».
Почему при перепроведении задним числом возникают ошибки по остаткам, хотя раньше всё проводилось?
Чаще всего контроль остатков выполняется на текущую дату или на дату без момента времени, а не на позицию документа. После изменения более ранних документов остатки на позицию перепроводимого документа изменились, и контроль стал срабатывать корректно по новым данным.
Что такое граница последовательности и где её посмотреть?
Это момент времени, начиная с которого документы последовательности считаются неактуальными и требуют перепроведения. В типовых конфигурациях границу можно увидеть в инструментах проведения документов или восстановления последовательностей, доступных администратору.
Можно ли сравнивать документы по ссылке, чтобы определить, какой раньше?
Нет. Порядок ссылок не связан с хронологией документов, особенно при обменах и загрузках. Для хронологического сравнения используйте метод Сравнить() у момента времени документов.
Работает ли момент времени для объектов, не являющихся документами?
Момент времени предназначен для документов, поскольку сортирует записи по ссылке на документ-регистратор. Для задач с другими объектами используются даты и порядковые номера, а механизм момента времени к ним не применяется.