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

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

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

Посмотрим на типовой фрагмент кода, в котором возникает проблема:


НовДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовДок.Номер = НомерДокумента;
НовДок.Дата = ДатаДокумента; // Содержит конкретное время, например 10:25:00
НовДок.УстановитьВремя(РежимАвтоВремя.Последним);        
НовДок.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
НовДок.Организация = Организация;
НовДок.Контрагент = Контрагент;
// Заполнение табличной части и других реквизитов...
НовДок.Записать(РежимЗаписиДокумента.Проведение);

В результате выполнения этого кода в информационной базе создается проведенный документ, но его время оказывается равным 14:00:00. Выясним, почему это происходит.

Причины автоматической подмены времени

Проанализируем две ключевые причины, которые приводят к изменению времени:

  1. Вызов метода УстановитьВремя: Использование конструкции НовДок.УстановитьВремя(РежимАвтоВремя.Последним) само по себе дает платформе указание сместить время документа в конец дня или расположить его после последнего созданного документа текущей даты. Если требуется сохранить точные часы и минуты из переданной переменной ДатаДокумента, этот метод вызывать не следует.
  2. Типовой механизм фиксированного времени документов: В конфигурации «Бухгалтерия предприятия 3.0» реализована подписка на событие ПередЗаписью, связанная с общим модулем ФиксированноеВремяДокументов. При записи нового документа или изменении календарного дня система считывает время по умолчанию из модуля менеджера соответствующего документа (функция ВремяДокументаПоУмолчанию()) и принудительно перезаписывает часы и минуты.

Для документов реализации товаров и услуг типовая функция возвращает следующие значения:


Функция ВремяДокументаПоУмолчанию() Экспорт
    Возврат Новый Структура("Часы, Минуты", 14, 0);
КонецФункции

Этот механизм внедрен методологами 1С для выстраивания правильной хронологической цепочки проводок внутри одного дня: утром регистрируются поступления (07:00–08:00), днем — реализации (14:00), вечером — платежи и кассовые операции (17:00–19:00), а в конце дня (23:59:59) — регламентные закрытия.

Способ 1. Отключение автоустановки времени в пользовательском интерфейсе

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

  1. Перейдем в раздел Администрирование.
  2. Откроем пункт Проведение документов.
  3. Снимем флаг Время документов устанавливать автоматически (или переключим соответствующий режим на ручную установку времени).

После отключения данной опции подписка перестанет перезаписывать время, и документы будут сохраняться с тем временем, которое задано в реквизите Дата.

Способ 2. Программный обход через двухэтапную запись

Если отключение общей настройки в базе нежелательно, обойти автоматическую подмену времени можно программно. При этом важно учитывать платформенное ограничение: вызов НовДок.Записать(РежимЗаписиДокумента.Проведение) при установленном свойстве ОбменДанными.Загрузка = Истина вызовет исключение, так как проведение в режиме загрузки запрещено платформой.

Рассмотрим правильный двухэтапный алгоритм записи и проведения документа:

  1. Запись нового объекта в режиме загрузки данных: Включаем свойство ОбменДанными.Загрузка = Истина и записываем документ без проведения. В этом режиме подписки на события пропускаются, и в базу сохраняется переданное время.
  2. Проведение существующего объекта: Сбрасываем флаг загрузки и проводим документ. Так как объект уже записан в базе и его дата не меняется, процедура УстановитьВремяНовогоДокумента не станет повторно переопределять время.

Посмотрим на пример реализации в коде:


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

НовДок.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
НовДок.Организация = Организация;
НовДок.Контрагент = Контрагент;
НовДок.ДоговорКонтрагента = Договор;
НовДок.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
НовДок.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");

// Заполнение табличной части
СтрокаУслуги = НовДок.Услуги.Добавить();
СтрокаУслуги.Номенклатура = НоменклатураВДокумент;
СтрокаУслуги.Количество = 1;
СтрокаУслуги.Цена = Сумма;
СтрокаУслуги.Сумма = Сумма;
СтрокаУслуги.СчетДоходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
СтрокаУслуги.СчетРасходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
СтрокаУслуги.СчетУчетаНДСПоРеализации = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.03");
СтрокаУслуги.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
СтрокаУслуги.Субконто = НоменклатурнаяГруппа;

// Этап 1: Запись в режиме обмена данными для сохранения точного времени
НовДок.ОбменДанными.Загрузка = Истина;
НовДок.Записать(РежимЗаписиДокумента.Запись);

// Этап 2: Проведение документа в обычном режиме
НовДок.ОбменДанными.Загрузка = Ложь;
НовДок.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

Методологические нюансы ручной установки времени

При использовании произвольного времени документов важно помнить о последствиях нарушения хронологической последовательности внутри дня:

  1. Зачет авансов (счета 60 и 62): Если реализация по времени окажется раньше поступившей в тот же день оплаты, программа не сможет корректно зачесть аванс автоматически.
  2. Списание себестоимости ТМЦ: Если документ списания или реализации товаров окажется по времени раньше приходной накладной того же дня, при проведении могут возникнуть ошибки списания партий или отрицательные остатки.

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

← На главную