Почему в 1С время документа автоматически меняется на +1 секунду к предыдущему и как это исправить

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

Многие разработчики и администраторы систем на базе «1С:Предприятие 8.3» сталкивались с загадочной ситуацией: при создании или редактировании документа пользователь вручную устанавливает дату и время (например, на начало дня 00:00:00), но после нажатия кнопки «Записать» или «Провести» время магическим образом меняется. Оно может стать 12:00:00, 23:59:59 или, что чаще всего вызывает вопросы, установиться на одну секунду позже последнего существующего документа за этот день. Проанализируем, почему это происходит, где искать «скрытую логику» и как настроить систему под свои нужды.

Причина 1: Особенности работы платформы с временем 00:00:00

Первое, что нам необходимо понять: платформа 1С исторически воспринимает время 00:00:00 не просто как полночь, а как признак того, что время документа не задано или не имеет значения. Разберем ситуацию подробнее:

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

В описанном случае автор темы столкнулся именно с этим: при попытке поставить документ «в начало дня», система автоматически сдвигала его, чтобы он не конфликтовал с другими записями.

Причина 2: Системная настройка автоматического управления временем

В современных конфигурациях, таких как Управление торговлей 11 (УТ 11), ERP или Комплексная автоматизация (КА), реализованы встроенные механизмы управления временем. Рассмотрим, где находятся эти настройки.

Перейдем в раздел НСИ и администрирование — Настройка параметров системы — Проведение документов. Там мы найдем флаг «Устанавливать время документов автоматически». Эта настройка определяет глобальное поведение системы:

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

Причина 3: Свойство метаданных «Автоматическое управление временем»

Если мы заглянем в конфигуратор, то увидим у каждого объекта типа «Документ» специфическое свойство. Рассмотрим, как оно влияет на процесс:

В ветке метаданных выберем нужный документ (например, ЗаказПокупателя) и откроем его палитру свойств. Найдем пункт «Автоматическое управление временем». Оно может принимать значения Использовать или Не использовать. Если установлено Использовать, платформа получает карт-бланш на самостоятельное изменение времени документа для оптимизации последовательностей проведения.

Причина 4: Программная логика в подписках на события

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

Логика изменения времени часто скрыта в Подписках на события (Event Subscriptions). Ищите подписки с именем вроде УстановитьВремяДокумента или ЗаполнитьЗначенияРеквизитовОбъекта. Они срабатывают при событии ПередЗаписью (BeforeWrite) на уровне объекта.

Рассмотрим пример того, как это может выглядеть в коде общего модуля:


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

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

Как решить проблему и зафиксировать время?

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

  1. Программная фиксация секунды: Вместо 00:00:00 попробуйте устанавливать 00:00:01. Часто этого достаточно, чтобы обмануть алгоритмы платформы, которые ищут именно «пустое» время.
  2. Отключение автоматики в настройках: Если бизнес-процессы позволяют, отключите автоматическое управление временем в интерфейсе «Администрирование».
  3. Изменение свойств метаданных: В конфигураторе установите свойство Автоматическое управление временем в значение Не использовать (требует снятия конфигурации с поддержки).
  4. Внедрение собственного кода: Если нужно выборочно разрешить пользователям менять время, можно добавить программную проверку в модуле объекта.

Посмотрим на пример кода, который предотвращает сдвиг времени, если оно было задано вручную:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Проверяем, не является ли время "пустым"
    Если Час(Дата) = 0 И Минута(Дата) = 0 И Секунда(Дата) = 0 Тогда
        // Здесь сработает системная магия, если не предпринять мер
    Иначе
        // Если время задано, отключаем стандартные механизмы
        // через дополнительные свойства объекта (зависит от конфигурации)
        ДополнительныеСвойства.Вставить("ПропуститьУстановкуВремени", Истина);
    КонецЕсли;
КонецПроцедуры

Подведем итоги

Автоматическое смещение времени на +1 секунду — это не «полтергейст», а защитный механизм 1С, предотвращающий коллизии в данных. Чтобы эффективно управлять этим процессом, всегда проверяйте три уровня настроек: свойства метаданных, функциональные опции в интерфейсе и код в подписках на события. Понимая эти принципы, вы сможете обеспечить корректную хронологию документов без ущерба для удобства пользователей.

← На главную