Почему в 1С:Розница Отчет о розничных продажах создается со временем 23:59:59 и как это исправить?

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

В процессе эксплуатации конфигурации 1С:Розница 2.2 (или 2.3) многие технические специалисты сталкиваются с загадочным поведением системы: при закрытии кассовой смены документ ОтчетОРозничныхПродажах внезапно записывается со временем 23:59:59. Это происходит не всегда, а лишь в некоторых магазинах или в определенные дни. На первый взгляд, это кажется "полтергейстом" или ошибкой в программном коде, но на самом деле за этим стоит четкая логика платформы 1С:Предприятие. В этой статье мы подробно разберем, почему так происходит и как сделать так, чтобы автоматическая выемка денежных средств не "ломалась" из-за этой особенности.

Разберем причину: почему устанавливается время конца дня?

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

Ключевая причина заключается в контроле остатков. Рассмотрим ситуацию подробнее:

  1. Если документ проводится оперативно (в реальном времени) и в системе достаточно остатков товара, 1С записывает его текущим моментом времени (временем компьютера).
  2. Если же при проведении возникают ошибки (например, обнаружена нехватка товара на складе, не заполнены характеристики или серии), документ не может быть проведен оперативно.
  3. В случаях, когда срабатывает неоперативное проведение или система пытается записать документ "задним числом" относительно последней записи в базе данных, платформа автоматически смещает время документа в конец дня (23:59:59), чтобы обеспечить хронологическую последовательность.

Таким образом, время 23:59:59 — это индикатор того, что при закрытии смены что-то пошло не так: либо не хватило остатков, либо возникла коллизия в распределенной информационной базе (РИБ).

Влияние на автоматическую выемку денежных средств

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

Особенно часто это проявляется при использовании настройки "Полная выемка при закрытии смены". Если отчет не проведен, остаток в кассе ККМ считается некорректно, и документ выемки просто не создается.

Пошаговое решение проблемы через расширение

Для решения этой проблемы мы разработаем расширение, которое позволит формировать выемку независимо от того, удалось ли системе провести отчет оперативно. Наша задача — перехватить момент обработки документов ККМ на сервере и принудительно установить корректную дату, а также инициировать выемку.

Рассмотрим алгоритм реализации:

1. Создаем новое расширение в базе данных.

2. Находим обработку ЗакрытиеКассовойСмены и заимствуем её в расширение.

3. В модуле формы обработки находим процедуру ОбработатьДокументыККМСервер.

4. Применяем аннотацию &После для встраивания нашего кода.

Посмотрим на пример программного кода, который решает задачу:


&НаСервере
&После("ОбработатьДокументыККМСервер")
Процедура Расш1_ОбработатьДокументыККМСервер(Отказ, СсылкаНаОтчет, НужноДополнительноеПредупреждение)
    
    // Проверяем, что отчет был создан
    Если НЕ СсылкаНаОтчет = Неопределено Тогда
        
        // Получаем объект документа для редактирования
        ОбъектОтчет = СсылкаНаОтчет.ПолучитьОбъект();
        
        // Принудительно устанавливаем текущее время вместо 23:59:59
        ОбъектОтчет.Дата = ТекущаяДата();
        
        Попытка
            // Записываем документ. Даже если он не проведется по остаткам,
            // время будет актуальным, что позволит корректно отработать выемке.
            ОбъектОтчет.Записать(РежимЗаписиДокумента.Запись);
            
            // Если в вашей версии конфигурации сумма выемки берется из реквизита отчета:
            СуммаФактическойВыемки = ОбъектОтчет.СуммаОплатыНаличные;
            
            // Здесь можно добавить логику программного создания документа "Выемка", 
            // если типовой механизм пропустил этот шаг.
        Исключение
            ЗаписьЖурналаРегистрации("ОшибкаРасширения.ЗакрытиеСмены", 
                УровеньЖурналаРегистрации.Ошибка, , , 
                ОписаниеОшибки());
        КонецПопытки;
        
    КонецЕсли;

КонецПроцедуры

Почему это работает?

Проанализируем ситуацию: изменяя ОбъектОтчет.Дата на ТекущаяДата(), мы принудительно "вытаскиваем" документ из конца дня. Даже если проведение не удалось из-за отсутствия товара, сам объект документа теперь имеет корректную временную метку. Это позволяет последующим процедурам в коде 1С (которые отвечают за выемку) увидеть актуальные движения по кассе и сформировать необходимые кассовые ордера.

Важный момент: Использование ТекущаяДата() гарантирует, что документ встанет в хронологии именно в тот момент, когда кассир фактически закрыл смену, а не в фиктивное время конца суток.

Дополнительные рекомендации для стабильной работы РИБ

Если вы работаете в распределенной информационной базе (РИБ), обратите внимание на следующие нюансы:

  1. Синхронизация времени: Убедитесь, что время на всех кассовых компьютерах и на сервере синхронизировано с точностью до секунды. Если локальное время кассы "убегает" вперед, сервер может расценить это как попытку записи документа в будущее и принудительно выставить 23:59:59.
  2. Контроль отрицательных остатков: Проверьте настройку Разрешить продажи с отрицательными остатками в настройках магазина. Если она выключена, любые пересорты будут приводить к тому, что отчет о продажах не будет проводиться, вызывая описанную проблему со временем.
  3. Часовые пояса: Если магазины находятся в разных часовых поясах, убедитесь, что в свойствах пользователей или магазинов корректно настроены смещения времени.

Используя предложенное решение с расширением, вы обеспечите стабильную работу блока денежных средств и избавитесь от необходимости вручную корректировать время в документах ОтчетОРозничныхПродажах. Помните, что корректная хронология документов — залог правильного формирования управленческой и бухгалтерской отчетности в 1С.

← На главную