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