Как настроить порядок установки даты и времени в документах 1С?

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

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

Где в коде происходит первичная установка даты?

Рассмотрим стандартный жизненный цикл создания документа. Когда пользователь нажимает кнопку «Создать», управление передается на сервер. Многие начинающие разработчики пытаются найти момент установки даты в процедуре ПриОткрытии или ПередОткрытием формы, но зачастую дата там уже заполнена. Проанализируем основные события:

  1. ОбработкаЗаполнения: Это ключевое событие в модуле объекта. Именно здесь платформа инициализирует реквизиты нового документа. Если вы создаете документ программно или через форму, первым делом вызывается этот обработчик. По умолчанию платформа подставляет текущую дату (или рабочую дату в некоторых режимах), но именно здесь правильнее всего переопределять логику.
  2. ПриУстановкеНовогоНомера: В типовых конфигурациях дата может корректироваться в этом обработчике, особенно если нумерация документа зависит от периода.

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


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

Почему «Рабочая дата» из настроек не всегда работает?

Выясним причину ситуации, когда в меню Сервис — Параметры установлена одна дата, а в документе появляется другая. Здесь важно различать типы приложений:

В Обычном приложении механизм РабочаяДата интегрирован глубоко в платформу, и новые документы автоматически подхватывают это значение. Однако в Управляемом приложении (которое используется в БП 3.0, УТ 11, ERP) поведение изменилось. Современные конфигурации часто игнорируют системную настройку рабочей даты в пользу ТекущаяДатаСеанса(), чтобы избежать ошибок при работе пользователей в разных часовых поясах.

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

Работа с временем документа: РежимАвтоВремя

Проанализируем ситуацию, когда дата установлена верно, но время «прыгает» при записи документа. За это отвечает метод объекта УстановитьВремя() и системное перечисление РежимАвтоВремя. Это особенно важно для документов, которые должны записываться в конец дня или после всех существующих документов.

Рассмотрим доступные режимы:

Пример программной установки времени при создании документа:


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

Исправление ошибки «ЭтоНовый()» в управляемых формах

Часто программисты пытаются использовать проверку Если ЭтоНовый() Тогда прямо в коде модуля формы и получают ошибку. Посмотрим на причину: метод ЭтоНовый() принадлежит Объекту, а не форме. В управляемой форме мы работаем с данными через реквизит Объект.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверка на новый документ в управляемой форме
    Если Объект.Ссылка.Пустая() Тогда 
        // Здесь ваша логика для нового документа
        Объект.Дата = НачалоДня(ТекущаяДатаСеанса());
    КонецЕсли;
КонецПроцедуры

Как установить время строго на 00:00:01?

Если стоит задача, чтобы все документы определенного типа всегда имели время 00:00:01, самым надежным местом для внедрения такой логики будет обработчик ПередЗаписью в модуле объекта. Это гарантирует выполнение условия независимо от того, как создается документ: вручную через интерфейс или программно из внешней обработки.


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

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

Влияние оперативного проведения

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

Подведем итог: для управления датой документа в 1С необходимо четко понимать, в каком контексте (клиент или сервер) и в каком приложении (обычное или управляемое) выполняется код. Используйте ОбработкаЗаполнения для инициализации и УстановитьВремя() для управления позиционированием документа внутри дня.

← На главную