Почему в 1С:Бухгалтерии время документа меняется на 13:00:00 при записи и как это исправить

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

При разработке или автоматизации в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) многие специалисты сталкиваются с особенностью: при программном создании документа, например, Отчет производства за смену, система упорно меняет установленное время на 13:00:00. Это происходит даже в том случае, если в коде явно прописано использование метода УстановитьВремя или прямое присвоение значения реквизиту Дата. В этой статье мы подробно разберем, почему так происходит, как работает этот механизм и какими способами можно добиться нужного результата.

Разберем причину: Методология автоматического распределения времени

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

  1. 00:00:00 — Поступление товаров и услуг (сначала оприходуем товар).
  2. 12:00:00 — Реализация товаров и услуг (продаем то, что получили утром).
  3. 13:00:00 — Производственные операции и складские перемещения (включая Отчет производства за смену).
  4. 23:59:59 — Регламентные операции, закрытие месяца и начисление налогов.

Именно поэтому документ Отчет производства за смену по умолчанию получает время 13:00:00. За выполнение этой логики отвечает общий модуль (обычно это ОбщегоНазначенияБП), процедура которого вызывается в обработчике события ПередЗаписью на уровне модуля объекта или подписки на события.

Способ 1: Глобальное отключение через настройки программы

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

  1. Перейдем в раздел Администрирование.
  2. Выберем пункт Настройки программы — Проведение документов.
  3. Найдем флаг «Время документов устанавливать автоматически».
  4. Снимем этот флаг.

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

Способ 2: Программный обход через режим загрузки данных

Часто перед программистом стоит задача записать документ с конкретным временем, не меняя глобальные настройки всей системы. Как мы выяснили из обсуждения, стандартные методы типа УстановитьВремя(РежимАвтоВремя.НеИспользовать) могут игнорироваться типовыми обработчиками БП 3.0 в событии ПередЗаписью.

Эффективным решением является использование свойства ОбменДанными.Загрузка. Рассмотрим пример кода:


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

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

Способ 3: Использование расширения для выборочного изменения логики

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

Посмотрим на алгоритм реализации в расширении:

  1. Создадим расширение и добавим в него общий модуль, отвечающий за установку времени (например, ОбщегоНазначенияБП).
  2. Найдем процедуру ЗаполнитьВремяДокумента (название может незначительно отличаться в разных версиях БП).
  3. Используем аннотацию &Вместо или &Перед, чтобы добавить условие:

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

Почему обычный код не срабатывает?

Проанализируем попытку автора вопроса использовать следующий код:


Док.Дата = НачалоДня(ТекДата) + 8*60*60 - НомерТекДок;
Док.УстановитьВремя(РежимАвтоВремя.НеИспользовать);
Док.Записать(РежимЗаписиДокумента.Запись);

В обычных конфигурациях (например, на базе БСП без специфических бухгалтерских надстроек) этот код сработал бы корректно. Однако в 1С:Бухгалтерия 3.0 в модуле объекта встроен вызов переопределяемых процедур, которые срабатывают после вашего кода, но до момента физической записи в базу данных. Таким образом, система «видит» вашу установленную дату, но считает её «неправильной» согласно своей внутренней методологии и перезаписывает её значением 13:00:00.

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

Выясним, какой метод выбрать в зависимости от вашей задачи:

Понимание механизмов автоматизации 1С позволяет не тратить время на борьбу с платформой, а использовать её возможности для построения правильного и непротиворечивого учета.

← На главную