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