При программном создании и проведении документов в конфигурации «1С:Бухгалтерия предприятия 3.0» разработчики часто сталкиваются с ситуацией, когда переданное в реквизит Дата точное время игнорируется, и документу принудительно присваивается фиксированное время — например, 14:00 для реализации или 17:00 для приходного кассового ордера. Разберем причины такого поведения платформы и конфигурации, а также рассмотрим способы решения этой задачи.
Посмотрим на типовой фрагмент кода, в котором возникает проблема:
НовДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовДок.Номер = НомерДокумента;
НовДок.Дата = ДатаДокумента; // Содержит конкретное время, например 10:25:00
НовДок.УстановитьВремя(РежимАвтоВремя.Последним);
НовДок.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
НовДок.Организация = Организация;
НовДок.Контрагент = Контрагент;
// Заполнение табличной части и других реквизитов...
НовДок.Записать(РежимЗаписиДокумента.Проведение);
В результате выполнения этого кода в информационной базе создается проведенный документ, но его время оказывается равным 14:00:00. Выясним, почему это происходит.
Проанализируем две ключевые причины, которые приводят к изменению времени:
УстановитьВремя: Использование конструкции НовДок.УстановитьВремя(РежимАвтоВремя.Последним) само по себе дает платформе указание сместить время документа в конец дня или расположить его после последнего созданного документа текущей даты. Если требуется сохранить точные часы и минуты из переданной переменной ДатаДокумента, этот метод вызывать не следует.ПередЗаписью, связанная с общим модулем ФиксированноеВремяДокументов. При записи нового документа или изменении календарного дня система считывает время по умолчанию из модуля менеджера соответствующего документа (функция ВремяДокументаПоУмолчанию()) и принудительно перезаписывает часы и минуты.Для документов реализации товаров и услуг типовая функция возвращает следующие значения:
Функция ВремяДокументаПоУмолчанию() Экспорт
Возврат Новый Структура("Часы, Минуты", 14, 0);
КонецФункции
Этот механизм внедрен методологами 1С для выстраивания правильной хронологической цепочки проводок внутри одного дня: утром регистрируются поступления (07:00–08:00), днем — реализации (14:00), вечером — платежи и кассовые операции (17:00–19:00), а в конце дня (23:59:59) — регламентные закрытия.
Если в информационной базе не требуется строгая привязка документов к типовым временным интервалам, механизм можно полностью отключить в настройках программы.
После отключения данной опции подписка перестанет перезаписывать время, и документы будут сохраняться с тем временем, которое задано в реквизите Дата.
Если отключение общей настройки в базе нежелательно, обойти автоматическую подмену времени можно программно. При этом важно учитывать платформенное ограничение: вызов НовДок.Записать(РежимЗаписиДокумента.Проведение) при установленном свойстве ОбменДанными.Загрузка = Истина вызовет исключение, так как проведение в режиме загрузки запрещено платформой.
Рассмотрим правильный двухэтапный алгоритм записи и проведения документа:
ОбменДанными.Загрузка = Истина и записываем документ без проведения. В этом режиме подписки на события пропускаются, и в базу сохраняется переданное время.УстановитьВремяНовогоДокумента не станет повторно переопределять время.Посмотрим на пример реализации в коде:
// Создание и заполнение реквизитов документа
НовДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовДок.Номер = НомерДокумента;
НовДок.Дата = ДатаДокумента; // Метод НовДок.УстановитьВремя() НЕ вызываем
НовДок.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
НовДок.Организация = Организация;
НовДок.Контрагент = Контрагент;
НовДок.ДоговорКонтрагента = Договор;
НовДок.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
НовДок.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
// Заполнение табличной части
СтрокаУслуги = НовДок.Услуги.Добавить();
СтрокаУслуги.Номенклатура = НоменклатураВДокумент;
СтрокаУслуги.Количество = 1;
СтрокаУслуги.Цена = Сумма;
СтрокаУслуги.Сумма = Сумма;
СтрокаУслуги.СчетДоходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
СтрокаУслуги.СчетРасходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
СтрокаУслуги.СчетУчетаНДСПоРеализации = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.03");
СтрокаУслуги.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
СтрокаУслуги.Субконто = НоменклатурнаяГруппа;
// Этап 1: Запись в режиме обмена данными для сохранения точного времени
НовДок.ОбменДанными.Загрузка = Истина;
НовДок.Записать(РежимЗаписиДокумента.Запись);
// Этап 2: Проведение документа в обычном режиме
НовДок.ОбменДанными.Загрузка = Ложь;
НовДок.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
При использовании произвольного времени документов важно помнить о последствиях нарушения хронологической последовательности внутри дня:
Таким образом, при программной установке точного времени необходимо строго контролировать очередность проведения взаимосвязанных документов.