Как установить свою дату и время в документе 1С и избежать их сброса при проведении

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

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

Разбираемся в причинах: Оперативное и неоперативное проведение

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

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

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

Способ 1. Настройка свойств документа в Конфигураторе

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

  1. Откроем Конфигуратор и найдем нужный вид документа.
  2. Перейдем на закладку Проведение. Проверим свойство Оперативное проведение. Оно должно иметь значение Разрешить. Если стоит Запретить, неоперативное проведение (вашим временем) будет невозможно.
  3. Теперь перейдем к форме документа. В свойствах самой формы (вкладка «Использование») найдем параметр ИспользоватьРежимПроведения.
    • Если установлено Автоматически, система сама решит, какой режим выбрать (чаще всего оперативный для текущей даты).
    • Если установить Запрашивать, то при проведении документа текущей датой система выдаст диалоговое окно с вопросом: «Провести оперативно?» или «Провести неоперативно?». Выбор второго варианта сохранит ваше время.

Способ 2. Программное управление временем при записи

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

Проанализируем пример правильного программного проведения:


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

// Важный момент: указываем режим записи и режим проведения
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

В этом случае платформа не будет пытаться подменить время в объекте НовыйДокумент, так как мы явно указали неоперативный режим.

Также полезно использовать метод УстановитьВремя(). Он позволяет задать время документа в соответствии со спецификой автоматической расстановки документов в течение дня:


// РежимАвтоВремени.НеИспользовать — сохранит время, установленное в свойстве Дата
// РежимАвтоВремени.ВКонецДня — поставит документ в самую последнюю секунду дня
НовыйДокумент.УстановитьВремя(РежимАвтоВремени.НеИспользовать);
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Способ 3. Проверка логики в модуле документа

Часто в самописных конфигурациях разработчики добавляют код, который принудительно перезаписывает дату. Если вы изменили настройки в Конфигураторе, но время все равно сбрасывается, посмотрим на модуль объекта документа. Найдем процедуру ПередЗаписью.

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


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // ОШИБКА: Этот код всегда будет ставить текущую дату, игнорируя ввод пользователя
    // Дата = ТекущаяДата(); 
    
    // ПРАВИЛЬНО: Делать проверку
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение И РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
        // Только здесь можно обоснованно менять время
    КонецЕсли;
КонецПроцедуры

Способ 4. Исправление времени в режиме «1С:Предприятие»

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

Важные последствия изменения времени

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

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

← На главную