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