Как правильно удалять или архивировать чеки ККМ в 1С:Розница с сохранением списания остатков?

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

При автоматизации розничной торговли часто возникает задача очистки базы данных от большого объема первичных кассовых документов (чеков ККМ) за день, чтобы не перегружать систему и не хранить избыточную детализацию на кассовом узле. При этом ключевым требованием является сохранение актуальных складских остатков: товары, проданные покупателям, должны оставаться корректно списанными со склада.

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

Типовой механизм закрытия смены и архивации чеков

Проанализируем базовую архитектуру учета розничных продаж. В конфигурациях линейки «Розница» и «Управление торговлей» изначально заложен двухэтапный механизм отражения продаж:

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

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

Технические риски и последствия прямого удаления документов

Если попытаться принудительно удалить чеки программным методом ДокументОбъект.Удалить() в обход штатной процедуры формирования сводного отчета, система столкнется со следующими критическими проблемами:

  1. Восстановление остатков: если чек был проведен, прямое удаление с очисткой движений вернет списанный товар обратно в свободный остаток. Если же попытаться удалить документ без отмены проведения, в регистрах накопления останутся записи с «битыми ссылками» (объект не найден), что приведет к невозможности пересчета итогов и ошибкам при восстановлении последовательности.
  2. След в журнале регистрации: факт создания, проведения и удаления документа фиксируется платформой. Простое удаление объекта не стирает системные события в журнале регистрации.
  3. Фрагментация таблиц и падение скорости: постоянная запись сотен строк с последующим удалением вызывает сильную фрагментацию индексов как в файловых базах, так и на серверах СУБД. Без регулярного сжатия и реиндексации база быстро деградирует по скорости отклика РМК.
  4. Разрыв синхронизации в распределенных базах (РИБ): прямое удаление объектов без фиксации изменений через ПланыОбмена.ЗарегистрироватьИзменения приводит к фатальным ошибкам при обмене данными между магазином и центральным офисом.
  5. Невозможность оформления возвратов: удаление чека продажи лишает систему возможности проверить факт и параметры первоначальной покупки (цену, скидки, номер фискального чека) при обращении покупателя за возвратом товара.

Программная реализация регламентного закрытия смены

Рассмотрим пример кода для регламентного или автоматического закрытия кассовой смены, сбора данных и последующей очистки оперативных документов:


// Пример регламентной процедуры закрытия смен по кассе ККМ
ПараметрыСмены = Новый Структура;
ПараметрыСмены.Вставить("КассаККМ", ТекущаяКасса);

// Формируем и проводим сводный документ "Отчет о розничных продажах"
ДокументОРП = Документы.ОтчетОРозничныхПродажах.СоздатьДокумент();
ДокументОРП.Дата = ТекущаяДата();
ДокументОРП.КассаККМ = ТекущаяКасса;
ДокументОРП.ЗаполнитьПоЧекамСмены(ТекущаяКасса);

Попытка
    ДокументОРП.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ЗаписьЖурналаРегистрации("ЗакрытиеСмены", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    Возврат;
КонецПопытки;

// После успешного проведения ОРП архивируем или удаляем чеки текущей смены
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Чек.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.ЧекККМ КАК Чек
    |ГДЕ
    |   Чек.КассаККМ = &КассаККМ
    |   И Чек.СтатусЧекаККМ = ЗНАЧЕНИЕ(Перечисление.СтатусыЧековККМ.Пробитый)";

Запрос.УстановитьПараметр("КассаККМ", ТекущаяКасса);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ЧекОбъект = Выборка.Ссылка.ПолучитьОбъект();
    // Очищаем движения чека, так как они перешли в ОРП
    ЧекОбъект.Движения.Очистить();
    ЧекОбъект.СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Архивный;
    ЧекОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Альтернативные способы защиты и скрытия коммерческих данных

Если потребность в скрытии чеков вызвана соображениями конфиденциальности данных на рабочих местах кассиров, удаление документов из базы — некорректный и опасный путь. Проанализируем правильные инженерные решения для этой задачи:

  1. Настройка прав на уровне записей (RLS): с помощью профилей групп доступа кассирам и операторам РМК ограничивается видимость закрытых смен, отчетов о валовой прибыли и архивных чеков. Пользователь видит только открытую смену текущего дня, а база сохраняет ссылочную целостность.
  2. Разделение на Front-office и Back-office: кассовый узел выносится в автономное облегченное рабочее место (специализированный фронт-терминал), которое хранит только номенклатуру и текущие чеки. По завершении смены агрегированная выгрузка отправляется в центральную учетную систему (бэк-офис), а локальный журнал фронта безопасно очищается.
  3. Учет фискальной памяти: важно помнить, что любые манипуляции внутри базы 1С не влияют на фискальный накопитель (ФН) и фискальную память подключенного кассового аппарата. Вся информация о пробитых фискальных чеках и Z-отчетах сохраняется аппаратно и передается оператору фискальных данных.
← На главную