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