Как автоматически устанавливать время нового документа на начало дня в 1С

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

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

Программная реализация с помощью расширения

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


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() Тогда
        Дата = НачалоДня(Дата);
    КонецЕсли;
КонецПроцедуры

Рассмотрим подробнее, как работает этот фрагмент. Мы используем аннотацию &После для расширения стандартного события ПередЗаписью. Проверка ЭтоНовый() критически важна: она гарантирует, что время будет принудительно сброшено на 00:00:00 только один раз — при первоначальном создании документа.

Использование типового механизма Фиксированное время документов

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

  1. Перейдем в раздел Администрирование, затем выберем пункт Проведение документов.
  2. Найдем флаг Использовать фиксированное время документов (в некоторых версиях интерфейса может называться иначе, но смысл сохраняется).
  3. При активации этой опции система начнет автоматически распределять документы в течение дня по определенным «слоям».

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

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

Технические нюансы и подводные камни

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

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

2. Момент времени и порядок в базе. Посмотрим, как база данных хранит документы с одинаковым временем. Когда у десяти документов время совпадает до секунды, их физический порядок в реестре и при расчете итогов определяется ссылкой (GUID). Это может привести к тому, что в списке документов они будут стоять не в том порядке, в котором их вводили. Для Бухгалтерского учета это менее критично, чем для Управленческого учета с контролем остатков.

3. Оперативное проведение. Выясним причину, по которой документы на начало дня могут вести себя «странно» при проведении. Оперативное проведение возможно только для документов с текущим временем. Если вы записываете документ текущим числом, но ставите ему время 00:00:00, система автоматически переводит его в режим неоперативного проведения. Это означает, что не будут выполняться некоторые проверки остатков «на лету», и системе придется чаще обращаться к итогам прошлых периодов.

Выбор между ПередЗаписью и ОбработкойЗаполнения

Проанализируем, где правильнее разместить код с точки зрения «фэншуя» 1С-разработки. Существует два основных подхода:

  1. Событие ПередЗаписью (Силовой метод). Как мы видели выше, этот метод гарантирует, что время будет изменено вне зависимости от того, как создан документ (вручную пользователем, программно из другой обработки или через интеграцию). Однако пользователь увидит результат только после нажатия кнопки «Записать».
  2. Процедура ОбработкаЗаполнения (Мягкий метод). Если разместить код здесь, то при нажатии кнопки «Создать» пользователь сразу увидит в форме время 00:00:00.

Рассмотрим пример кода для ОбработкаЗаполнения в расширении:


&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ЭтоНовый() Тогда
        Дата = НачалоДня(ТекущаяДата());
    КонецЕсли;
КонецПроцедуры

Этот способ более дружелюбен к пользователю, но имеет минус: если документ создается программно без вызова метода Заполнить(), логика не сработает. Поэтому для надежности многие разработчики комбинируют эти методы или используют подписки на события.

Особенности работы с услугами

Выясним, почему именно для услуг так важно время 00:00:00. В 1С при проведении документа реализации происходит поиск авансов по регистру РасчетыСКонтрагентами. Если время реализации — начало дня, то любая банковская выписка, загруженная в течение дня (даже если банк поставил ей время 09:00:00), будет хронологически находиться после реализации. Следовательно, система увидит задолженность и закроет ее, не формируя проводок на счет 62.02 (Авансы полученные). Если же реализация создается текущим временем (например, в 15:00), а выписка из банка пришла утром, то без корректировки времени система неизбежно зафиксирует аванс. Похожие сложности часто возникают и в других операциях, например, когда требуется взаимозачёт аванса в документах корректировки.

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

← На главную