Почему КонецДня в 1С выдает время 20:00:00 вместо 23:59:59?

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

В процессе разработки или автоматизации в среде 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда стандартные функции ведут себя неожиданным образом. Типичный пример: при программном создании документа «Бухгалтерская операция» мы явно указываем время конца дня, но после записи обнаруживаем, что документ «сел» на 20:00:00. Давайте вместе разберем, почему это происходит, и проанализируем механизмы платформы и типовых конфигураций, которые могут влиять на результат.

Суть проблемы и программный контекст

Рассмотрим стандартный фрагмент кода, который должен устанавливать дату документа на последнюю секунду текущих суток:


ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокОперация.Дата = КонецДня(Объект.Дата);
// Ожидаем время 23:59:59
ДокОперация.Записать();

Функция КонецДня() является встроенной функцией платформы и всегда возвращает значение времени 23:59:59 для переданной даты. Если после выполнения метода Записать() вы видите в журнале документов или в карточке время 20:00:00, это означает, что в процесс вмешались механизмы конфигурации, переопределяющие стандартное поведение.

Причина №1: Константы и настройки автоматической установки времени

Проанализируем наиболее вероятную причину, которая подтвердилась в практике многих разработчиков. В современных типовых решениях (таких как 1С:Бухгалтерия 3.0, ERP 2, УТ 11) реализован функционал управления временем записываемых документов. Это сделано для того, чтобы документы разного типа выстраивались в логическую цепочку внутри одного дня.

Выясним причину через настройки системы:

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

Причина №2: Влияние Библиотеки стандартных подсистем (БСП)

В конфигурациях на базе БСП существует специальный механизм «Автоматическая установка времени документа». Рассмотрим подробнее, как он работает. Система может использовать подписки на события, такие как ПриУстановкеНовогоНомера или ПередЗаписью.

В момент вызова метода Записать() срабатывает программная логика, которая определяет: «Этот документ является регламентным или бухгалтерским, значит, он должен располагаться в конце дня, но до начала выполнения закрытия месяца». Часто для таких целей резервируется интервал с 20:00 до 21:00. Проанализируем типичный код в модуле менеджера или общем модуле, который может это делать:


Процедура УстановитьВремяДокумента(ДокументОбъект) Экспорт
    // Если время не задано или задано как конец дня, 
    // устанавливаем фиксированное значение из настроек
    Если Час(ДокументОбъект.Дата) = 23 Тогда
        ДокументОбъект.Дата = Дата(День(ДокументОбъект.Дата), Месяц(ДокументОбъект.Дата), Год(ДокументОбъект.Дата), 20, 0, 0);
    КонецЕсли;
КонецПроцедуры

Причина №3: Часовые пояса и хранение данных в UTC

Разберем ситуацию со стороны платформенного хранения данных. Платформа 1С:Предприятие хранит все значения типа Дата в базе данных в формате UTC (Universal Time Coordinated). При отображении времени пользователю система конвертирует его в локальное время сервера или клиента.

Посмотрим на пример: если ваш сервер приложений настроен на часовой пояс UTC+4 (например, Самара), а вы программно записываете 23:59:59 без учета смещения, либо если в информационной базе установлена настройка УстановитьЧасовойПоясИнформационнойБазы, то при расхождении часовых поясов клиента и сервера время может «сдвинуться» визуально. Однако разница ровно в 4 часа (с 23:59 до 20:00) часто указывает именно на программное замещение или разницу в часовых поясах (например, Москва и Азорские острова).

Причина №4: Подписки на события и метод ПриЗаписи

Если вы работаете в «нетленке» (самописной конфигурации), необходимо проверить наличие подписок на события. Подписка на событие ПередЗаписью для объекта ДокументОбъект.ОперацияБух может содержать логику, которая принудительно выравнивает время.

Рассмотрим по шагам, как найти виновника через отладчик:

  1. Установите точку останова в вашем коде на строке ДокОперация.Записать();.
  2. Нажмите F11 (шаг внутрь), чтобы зайти в модуль объекта документа.
  3. Проверьте процедуры ПередЗаписью и ПриЗаписи.
  4. Если там чисто, проверьте в дереве метаданных узел Общие -> Подписки на события. Ищите те, где в качестве источника указан ваш тип документа или ДокументОбъект в целом, а событие — ПередЗаписью.

Причина №5: Оперативное проведение и последовательность документов

Хотя для «Бухгалтерской операции» оперативное проведение обычно не используется, стоит помнить, что для других документов свойство ОперативноеПроведение в положении Разрешить заставляет систему игнорировать время, указанное программистом, если оно превышает текущее время сервера. Система «прижимает» документ к текущему моменту или к специальной отметке на временной шкале, чтобы не нарушать последовательность записей в регистрах.

Рекомендации по решению

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

1. Отключение автоматической настройки:

Найдите в интерфейсе программы константу, фиксирующую время, и очистите её или измените значение на 23:59:59, если бизнес-логика это позволяет.

2. Использование дополнительных параметров:

В некоторых случаях можно передать в объект признак того, что время менять не нужно, используя свойство ДополнительныеСвойства:


ДокОперация.ДополнительныеСвойства.Вставить("ЭтоРучнаяКорректировкаВремени", Истина);
ДокОперация.Записать();

Затем в подписке на событие добавьте проверку этого свойства, чтобы стандартный механизм проигнорировал изменение даты.

3. Корректировка после записи:

Это «грубый» метод, но иногда единственный рабочий: записать документ, а затем отдельной транзакцией или в обход стандартных обработок (если возможно) обновить время. Однако правильнее будет найти и настроить штатный механизм конфигурации.

Проанализировав вышеперечисленные факторы, мы видим, что КонецДня() работает корректно, а замена времени на 20:00:00 — это результат работы прикладной логики конфигурации, направленной на упорядочивание документов в учетной системе.

← На главную