В процессе разработки или эксплуатации конфигураций на платформе 1С:Предприятие разработчики часто сталкиваются со специфическим поведением платформы: при изменении или повторном проведении документа текущей датой его время автоматически подменяется на текущее системное время сеанса. Это создает неудобства, когда время документа критически важно и должно соответствовать внешнему событию (например, точному времени поступления СМС-уведомления или оплаты).
Рассмотрим подробнее причины такого поведения платформы и разберем доступные способы сохранения точного времени документа.
Автоматическая замена времени при проведении связана с базовыми механизмами платформы 1С:Предприятие. Если в свойствах объекта метаданных разрешено оперативное проведение и документ проводится текущей датой, платформа считает операцию происходящей «прямо сейчас» в реальном времени. В результате время документа автоматически обновляется на текущее системное время. Это спроектировано для правильного построения последовательностей и контроля остатков на актуальный момент времени.
Проанализируем самый простой и эффективный способ, подходящий для документов, которые регистрируют факты «задним числом» или по внешним событиям (например, выписки, оплатные документы по СМС).
Запретить.После отключения оперативного проведения платформа перестает подменять время документа при проведении текущей датой, и сохраненные часы, минуты и секунды остаются неизменными.
Если полностью запрещать оперативное проведение в метаданных нежелательно, можно перехватывать процесс записи объекта в модуле документа или в подписке на событие.
Рассмотрев событие ПередЗаписью, мы можем принудительно перевести режим проведения из оперативного в неоперативный:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
РежимПроведения = РежимПроведенияДокумента.Неоперативный;
КонецЕсли;
КонецПроцедуры
Такой подход сохраняет исходное время документа без изменения общих настроек объекта метаданных.
Разберем еще один программный вариант: перед записью документа сравним его текущую дату с датой, сохраненной в базе данных (доступной через Ссылка.Дата). Если пользователем изменился только состав реквизитов или табличная часть, а день остался прежним, вернем документу его исходное время:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЭтоНовый() И ЗначениеЗаполнено(Ссылка) Тогда
Если НачалоДня(Дата) = НачалоДня(Ссылка.Дата) Тогда
Дата = Ссылка.Дата;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Посмотрим на настройки позиционирования документа во времени. В свойствах объекта метаданных и в настройках формы доступно свойство Автовремя (перечисление РежимАвтоУстановкиВремени). Оно может принимать значения: Использовать, Не использовать, Первым, Последним, ТекущееИлиПоследним.
Если для документа установить значение Не использовать, платформа перестает автоматически смещать документ на границы суток или текущий момент при неоперативной записи.
При отключении оперативного проведения или смене логики работы со временем необходимо учитывать следующие технические особенности:
ОбработкаПроведения с проверкой остатков на дату документа.