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