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