При интенсивном документообороте разработчики и администраторы баз данных 1С нередко сталкиваются с ситуацией, когда создаваемые или загружаемые документы начинают автоматически получать время конца дня — 23:59:59. Попытка выяснить, где хранится этот счетчик, часто заходит в тупик. Разберем механику работы платформы и выясним, как правильно решить эту проблему системными средствами.
Выясним причину такого поведения системы. Распространенное заблуждение заключается в том, что в базе существует специальная глобальная переменная, регистр или константа, отвечающая за инкремент секунд. На самом деле такой переменной в структуре базы данных нет.
Рассмотрим, как платформа рассчитывает время документа при записи:
РежимАвтоВремени.Последним или в свойствах формы параметр АвтоВремя имеет значение Последним (либо ТекущееИлиПоследним), платформа выполняет динамический запрос к таблицам за указанную дату. Она ищет документ с самым поздним временем за этот день.12:00:00.Важно подчеркнуть, что платформе не требуется обязательное разделение каждого документа по секундам. Точное хронологическое положение документа в регистрах и последовательностях определяется типом МоментВремени, который включает в себя дату, время и уникальную ссылку объекта Ссылка. Тысячи документов могут иметь абсолютно идентичное время (например, 12:00:00), и система отработает их корректно.
Наиболее надежное архитектурное решение, позволяющее не переписывать множество внешних обработок и форм документов, заключается в использовании подписки на событие. Перехватим запись документа на уровне конфигурации.
Разберем по шагам создание подписки:
Общие -> Подписки на события.УстановитьВремяНовогоДокументаПередЗаписью.ДокументОбъект.ПередЗаписью.Посмотрим на пример программного кода обработчика:
Процедура УстановитьВремяНовогоДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем только новые документы либо документы с критическим временем
Если Источник.ЭтоНовый() Тогда
// Получаем начало дня текущей даты документа
НачалоДняДокумента = НачалоДня(Источник.Дата);
// Если время ушло в конец суток или не заполнено, принудительно возвращаем 12:00:00
Если Источник.Дата >= (НачалоДняДокумента + 86399) Или Источник.Дата = НачалоДняДокумента Тогда
Источник.Дата = НачалоДняДокумента + 12 * 3600;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует, что даже при автоматической выгрузке или массовом программном формировании документов время всегда будет нормализовано.
Если документы создаются в рамках интеграционных механизмов, внешних обработок или обменов данными, проанализируем программный код создания объектов. При записи через код платформа не наращивает секунды самостоятельно, если разработчик не указал это явно.
Посмотрим, как правильно записывать документы программно без смещения в конец суток:
// Явно задаем дату с фиксированным временем (например, 12:00:00)
НовыйДокумент.Дата = НачалоДня(ТекущаяДата()) + 12 * 3600;
// Выполняем запись с явным отключением авторежима времени
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись, РежимАвтоВремени.НеИспользовать);
Использование параметра РежимАвтоВремени.НеИспользовать полностью исключает запрос платформы к базе на поиск последнего документа дня.
Если создание документов происходит интерактивно пользователями, проанализируем свойства форм в конфигурации.
АвтоВремя.НеИспользовать.В этом случае при интерактивном создании документа система не станет опрашивать базу на предмет самого позднего времени за день.
Если требуется срочно восстановить штатный механизм автоприращения времени для текущей даты без изменения конфигурации, выполним корректировку существующих документов:
23:59:59.12:00:00).Как только из базы данных исчезнет последний документ с границей 23:59:59, платформа снова сможет автоматически инкрементировать секунды от максимального оставшегося значения в сутках.