В конфигурации 1С:Розница 2.3 (и во многих других торговых решениях на платформе 1С) существует специфический механизм обработки розничных продаж. Пока кассовая смена открыта, каждый пробитый документ ЧекККМ создает оперативные движения по регистру накопления ТоварыНаСкладах. Это позволяет видеть актуальные остатки в режиме реального времени. Однако, как только смена закрывается и формируется ОтчетОРозничныхПродажах (ОРП), система архивирует чеки. При этом движения документов ЧекККМ по регистрам остатков удаляются, а вместо них создается одно общее движение от документа ОтчетОРозничныхПродажах.
Проблема заключается в том, что ОтчетОРозничныхПродажах обычно записывается временем закрытия смены (например, 21:00:00). Если нам нужно узнать, сколько товара было на полке в 11:48 утра того же дня, стандартный отчет по остаткам покажет состояние на начало дня, так как движения ОРП еще «не наступили», а движения чеков уже «стерты». Проанализируем, как обойти это ограничение и получить корректные данные, особенно в контексте сверки с ЕГАИС.
Рассмотрим ситуацию пошагово. Предположим, на 8:00 утра у нас было 100 единиц товара. С 8:00 до 12:00 было продано 20 единиц через ЧекККМ. Если мы сформируем отчет на 11:00, система увидит движение чеков и покажет остаток 80. Но после выполнения операции «Закрытие смены» в 20:00, движения этих чеков удаляются. Теперь при формировании отчета на 11:00 система видит только начальный остаток (100) и не видит никаких расходов до самого момента записи ОРП в 20:00. Это создает серьезные трудности при проверке алкогольной продукции, так как запросы остатков в ЕГАИС приходят в произвольное время, и их нужно сопоставлять с точными данными учетной системы на ту же секунду.
Прежде чем приступать к написанию сложных запросов, проверим штатные возможности программы. В последних версиях 1С:Розница 2.3 разработчики предусмотрели возможность сохранения движений. Выясним, как это работает:
Если этот флаг установлен, то при закрытии смены документы ЧекККМ не очищают свои движения в регистре ТоварыНаСкладах. В этом случае ОтчетОРозничныхПродажах формируется без движений по этому регистру (чтобы избежать двойного списания), но сохраняет движения по другим регистрам (например, по выручке). Это позволяет строить стандартные отчеты на любую секунду дня без потери точности. Важно помнить: включение этой опции приведет к более быстрому росту объема базы данных.
Если настройки не позволяют сохранять движения или нам нужно получить данные за прошлые периоды, когда чеки уже заархивированы, необходимо использовать комбинированный запрос. Разберем алгоритм, который поможет вычислить «виртуальный» остаток на момент НужноеВремя.
Для расчета нам потребуется объединить три источника данных:
НужноеВремя.ЧекККМ, которые были пробиты в этот интервал.Проанализируем пример логики запроса на языке 1С:
// 1. Получаем остатки на начало дня
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток КАК НачальныйОстаток
ПОМЕСТИТЬ ВТ_НачалоДня
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&НачалоДня, Склад = &Склад) КАК Остатки;
// 2. Получаем обороты по обычным документам (не чекам)
ВЫБРАТЬ
Обороты.Номенклатура,
Обороты.КоличествоПриход КАК Приход,
Обороты.КоличествоРасход КАК Расход
ПОМЕСТИТЬ ВТ_ОборотыДокументов
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоДня, &НужноеВремя, , Склад = &Склад И Регистратор ССЫЛКА Документ.ОтчетОРозничныхПродажах = ЛОЖЬ) КАК Обороты;
// 3. Собираем данные из архивированных чеков (из ТЧ, так как движений нет)
ВЫБРАТЬ
ЧекТовары.Номенклатура,
СУММА(ЧекТовары.Количество) КАК ПроданоПоЧекам
ПОМЕСТИТЬ ВТ_ПродажиЧеков
ИЗ
Документ.ЧекККМ.Товары КАК ЧекТовары
ГДЕ
ЧекТовары.Ссылка.Дата МЕЖДУ &НачалоДня И &НужноеВремя
И ЧекТовары.Ссылка.Склад = &Склад
И ЧекТовары.Ссылка.Проведен = ИСТИНА
И ЧекТовары.Ссылка.СтатусЧекККМ В (ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Пробит), ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Архивированный))
СГРУППИРОВАТЬ ПО
ЧекТовары.Номенклатура;
После подготовки этих временных таблиц нам остается только сложить НачальныйОстаток с Приходом, вычесть Расход по документам и вычесть ПроданоПоЧекам. Именно этот результат будет являться истинным остатком на 11:48.
Когда мы сравниваем остатки 1С с документом ОстаткиЕГАИС, важно учитывать «время фиксации». В документе ЕГАИС есть реквизит ДатаЗапроса. Посмотрим на нюансы сверки:
Поскольку проблема носит системный характер для 1С:Розница, рекомендуется создать внешнюю обработку или отчет. Выделим основные шаги реализации такого инструмента:
Во-первых, определим входящие параметры: Склад, Организация и Момент времени (Дата и Время). Во-вторых, программно проверим, закрыта ли смена на указанную дату. Если смена еще открыта — используем стандартный метод Остатки() регистра ТоварыНаСкладах. Если смена уже закрыта (есть проведенный ОРП) — применяем алгоритм сбора данных из табличных частей чеков.
Важный момент по сериям: Если в вашей базе ведется серийный учет алкоголя, обратите внимание на регистр ДвиженияСерийТоваров. Часто движения по этому регистру сохраняются даже после архивации чеков (зависит от настроек и версии). Проверьте этот регистр — возможно, в нем сохранилась нужная вам хронология списания конкретных акцизных марок или серий, что значительно упростит задачу восстановления истории.
Подведем итог: штатное поведение 1С:Розница при закрытии смены действительно «портит» историческую точность остатков. Но, используя программный доступ к данным документов ЧекККМ и объединяя их с остатками на начало дня, мы можем восстановить картину движений с точностью до секунды, что необходимо для качественного ведения учета алкогольной продукции.