Почему время новых документов достигает 23:59:59 и как его сбросить в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При интенсивном документообороте разработчики и администраторы баз данных 1С нередко сталкиваются с ситуацией, когда создаваемые или загружаемые документы начинают автоматически получать время конца дня — 23:59:59. Попытка выяснить, где хранится этот счетчик, часто заходит в тупик. Разберем механику работы платформы и выясним, как правильно решить эту проблему системными средствами.

Как устроен механизм автоматического времени в платформе 1С

Выясним причину такого поведения системы. Распространенное заблуждение заключается в том, что в базе существует специальная глобальная переменная, регистр или константа, отвечающая за инкремент секунд. На самом деле такой переменной в структуре базы данных нет.

Рассмотрим, как платформа рассчитывает время документа при записи:

  1. Анализ существующих записей. Если для документа включен режим автоматического времени РежимАвтоВремени.Последним или в свойствах формы параметр АвтоВремя имеет значение Последним (либо ТекущееИлиПоследним), платформа выполняет динамический запрос к таблицам за указанную дату. Она ищет документ с самым поздним временем за этот день.
  2. Инкремент времени. Обнаружив последний документ, платформа добавляет к его значению одну секунду.
  3. Базовая точка отсчета. Если документы создаются неоперативно (прошлым или будущим числом относительно текущего сеанса) или время документа изначально не заполнено, система начинает отсчет с середины дня — ровно с 12:00:00.
  4. Переполнение суток. В интервале от 12:00:00 до 23:59:59 содержится ровно 43 200 секунд. Если за одни сутки создается более сорока тысяч документов (или если хотя бы один документ был записан на 23:59:59 вручную либо регламентной процедурой), механизм поиска максимального времени упирается в границу суток. Платформа не может назначить время следующего дня, поэтому все последующие документы получают время 23:59:59.

Важно подчеркнуть, что платформе не требуется обязательное разделение каждого документа по секундам. Точное хронологическое положение документа в регистрах и последовательностях определяется типом МоментВремени, который включает в себя дату, время и уникальную ссылку объекта Ссылка. Тысячи документов могут иметь абсолютно идентичное время (например, 12:00:00), и система отработает их корректно.

Способ 1. Централизованный контроль через подписку на событие

Наиболее надежное архитектурное решение, позволяющее не переписывать множество внешних обработок и форм документов, заключается в использовании подписки на событие. Перехватим запись документа на уровне конфигурации.

Разберем по шагам создание подписки:

  1. Откроем конфигуратор и перейдем в ветку Общие -> Подписки на события.
  2. Создадим новую подписку, укажем понятное имя, например, УстановитьВремяНовогоДокументаПередЗаписью.
  3. В качестве источника выберем необходимые документы или общий тип ДокументОбъект.
  4. В качестве события выберем ПередЗаписью.
  5. Создадим или выберем общий серверный модуль и разместим в нем процедуру обработки.

Посмотрим на пример программного кода обработчика:


Процедура УстановитьВремяНовогоДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

    // Проверяем только новые документы либо документы с критическим временем
    Если Источник.ЭтоНовый() Тогда
        
        // Получаем начало дня текущей даты документа
        НачалоДняДокумента = НачалоДня(Источник.Дата);
        
        // Если время ушло в конец суток или не заполнено, принудительно возвращаем 12:00:00
        Если Источник.Дата >= (НачалоДняДокумента + 86399) Или Источник.Дата = НачалоДняДокумента Тогда
            Источник.Дата = НачалоДняДокумента + 12 * 3600;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Такой подход гарантирует, что даже при автоматической выгрузке или массовом программном формировании документов время всегда будет нормализовано.

Способ 2. Корректировка времени в алгоритмах загрузки и коде

Если документы создаются в рамках интеграционных механизмов, внешних обработок или обменов данными, проанализируем программный код создания объектов. При записи через код платформа не наращивает секунды самостоятельно, если разработчик не указал это явно.

Посмотрим, как правильно записывать документы программно без смещения в конец суток:


// Явно задаем дату с фиксированным временем (например, 12:00:00)
НовыйДокумент.Дата = НачалоДня(ТекущаяДата()) + 12 * 3600;

// Выполняем запись с явным отключением авторежима времени
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись, РежимАвтоВремени.НеИспользовать);

Использование параметра РежимАвтоВремени.НеИспользовать полностью исключает запрос платформы к базе на поиск последнего документа дня.

Способ 3. Отключение автоматического времени в формах документов

Если создание документов происходит интерактивно пользователями, проанализируем свойства форм в конфигурации.

  1. Откроем форму документа в конфигураторе.
  2. Перейдем в свойства расширения формы документа.
  3. Найдем реквизит АвтоВремя.
  4. Изменим его значение на НеИспользовать.

В этом случае при интерактивном создании документа система не станет опрашивать базу на предмет самого позднего времени за день.

Способ 4. Разовый сброс максимального времени за конкретную дату

Если требуется срочно восстановить штатный механизм автоприращения времени для текущей даты без изменения конфигурации, выполним корректировку существующих документов:

  1. Воспользуемся универсальной обработкой группового изменения реквизитов.
  2. Сделаем отбор документов за проблемную дату со временем 23:59:59.
  3. Сместим время этих документов на фиксированное значение (например, на середину дня 12:00:00).

Как только из базы данных исчезнет последний документ с границей 23:59:59, платформа снова сможет автоматически инкрементировать секунды от максимального оставшегося значения в сутках.

← На главную