Многие разработчики и администраторы систем на базе «1С:Предприятие 8.3» сталкивались с загадочной ситуацией: при создании или редактировании документа пользователь вручную устанавливает дату и время (например, на начало дня 00:00:00), но после нажатия кнопки «Записать» или «Провести» время магическим образом меняется. Оно может стать 12:00:00, 23:59:59 или, что чаще всего вызывает вопросы, установиться на одну секунду позже последнего существующего документа за этот день. Проанализируем, почему это происходит, где искать «скрытую логику» и как настроить систему под свои нужды.
Первое, что нам необходимо понять: платформа 1С исторически воспринимает время 00:00:00 не просто как полночь, а как признак того, что время документа не задано или не имеет значения. Разберем ситуацию подробнее:
12:00:00.В описанном случае автор темы столкнулся именно с этим: при попытке поставить документ «в начало дня», система автоматически сдвигала его, чтобы он не конфликтовал с другими записями.
В современных конфигурациях, таких как Управление торговлей 11 (УТ 11), ERP или Комплексная автоматизация (КА), реализованы встроенные механизмы управления временем. Рассмотрим, где находятся эти настройки.
Перейдем в раздел НСИ и администрирование — Настройка параметров системы — Проведение документов. Там мы найдем флаг «Устанавливать время документов автоматически». Эта настройка определяет глобальное поведение системы:
Проанализируем ситуацию: если в вашей базе включена эта опция, то любые попытки ручного изменения времени могут игнорироваться системой в момент записи, так как программные механизмы «перетирают» введенные данные своими значениями.
Если мы заглянем в конфигуратор, то увидим у каждого объекта типа «Документ» специфическое свойство. Рассмотрим, как оно влияет на процесс:
В ветке метаданных выберем нужный документ (например, ЗаказПокупателя) и откроем его палитру свойств. Найдем пункт «Автоматическое управление временем». Оно может принимать значения Использовать или Не использовать. Если установлено Использовать, платформа получает карт-бланш на самостоятельное изменение времени документа для оптимизации последовательностей проведения.
Часто разработчики не могут найти код, меняющий дату, потому что смотрят только в модуль формы документа. Однако в типовых решениях основная логика вынесена на уровень сервера. Проанализируем, почему замер производительности и точки останова в форме могут не помочь:
Логика изменения времени часто скрыта в Подписках на события (Event Subscriptions). Ищите подписки с именем вроде УстановитьВремяДокумента или ЗаполнитьЗначенияРеквизитовОбъекта. Они срабатывают при событии ПередЗаписью (BeforeWrite) на уровне объекта.
Рассмотрим пример того, как это может выглядеть в коде общего модуля:
Процедура УстановитьВремяДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Если это новый документ или время было обнулено
Если Источник.Дата = НачалоДня(Источник.Дата) Тогда
// Вызываем типовую функцию распределения времени
РаботаСДиалогами.УстановитьВремяОбъекта(Источник);
КонецЕсли;
КонецПроцедуры
Поскольку этот код выполняется на сервере после того, как управление ушло из формы, точка останова в процедуре ПередЗаписью модуля формы сработает до того, как время изменится, и вы не увидите подвоха.
Если вам крайне важно, чтобы документ записывался именно с тем временем, которое указал пользователь, рассмотрим следующие шаги:
00:00:00 попробуйте устанавливать 00:00:01. Часто этого достаточно, чтобы обмануть алгоритмы платформы, которые ищут именно «пустое» время.Автоматическое управление временем в значение Не использовать (требует снятия конфигурации с поддержки).Посмотрим на пример кода, который предотвращает сдвиг времени, если оно было задано вручную:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, не является ли время "пустым"
Если Час(Дата) = 0 И Минута(Дата) = 0 И Секунда(Дата) = 0 Тогда
// Здесь сработает системная магия, если не предпринять мер
Иначе
// Если время задано, отключаем стандартные механизмы
// через дополнительные свойства объекта (зависит от конфигурации)
ДополнительныеСвойства.Вставить("ПропуститьУстановкуВремени", Истина);
КонецЕсли;
КонецПроцедуры
Автоматическое смещение времени на +1 секунду — это не «полтергейст», а защитный механизм 1С, предотвращающий коллизии в данных. Чтобы эффективно управлять этим процессом, всегда проверяйте три уровня настроек: свойства метаданных, функциональные опции в интерфейсе и код в подписках на события. Понимая эти принципы, вы сможете обеспечить корректную хронологию документов без ущерба для удобства пользователей.