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