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