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

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

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

Причины блокировки архивных чеков

Прежде чем перейти к решению, выясним причину, по которой 1С накладывает такие ограничения. Основная цель — защита целостности данных. Архивные чеки ККМ являются частью закрытой кассовой смены и уже агрегированы в документе "Отчет о розничных продажах". Любое прямое изменение или удаление таких чеков может привести к расхождениям между данными чеков и данными отчетов, нарушению последовательности документов и некорректному учету розничных продаж.

Система 1С имеет строгие механизмы контроля, которые препятствуют прямому изменению статуса "Архивный" или удалению таких документов через стандартные пользовательские функции. Даже попытки изменить статус на "Отложенный" с помощью типовых инструментов, таких как "Групповое изменение реквизитов", часто заканчиваются ошибкой "Не удалось провести", что подтверждает уровень защиты данных.

Решение 1: Попытка использования стандартных средств (и почему они могут не сработать)

На первый взгляд, кажется логичным использовать встроенные в 1С механизмы для массового изменения данных. Рассмотрим эти подходы.

1.1. Групповое изменение реквизитов

Многие пользователи и специалисты в первую очередь обращаются к функционалу "Групповое изменение реквизитов". Этот инструмент доступен через раздел "Администрирование" или "НСИ и администрирование" → "Поддержка и обслуживание" → "Групповое изменение реквизитов".

  1. Перейдите в раздел Администрирование (или НСИ и администрирование).
  2. Выберите пункт Поддержка и обслуживание.
  3. Найдите и откройте Групповое изменение реквизитов.
  4. В поле Изменять выберите тип объекта Документ.ЧекККМ.
  5. Нажмите Добавить отбор и установите отбор по полю СтатусЧекаККМ со значением Архивный, чтобы выбрать только нужные чеки.
  6. В списке реквизитов, доступных для изменения, найдите СтатусЧекаККМ.
  7. Установите новое значение, например, Отложенный.
  8. Нажмите Изменить реквизиты.

Почему это может не сработать для архивных чеков: Как мы уже упоминали, при попытке изменить статус архивного чека таким способом, система, скорее всего, выдаст ошибку "Не удалось провести". Это происходит из-за внутренней бизнес-логики конфигурации, которая запрещает изменение статуса документа, уже зафиксированного в отчетах, даже если вы обладаете полными административными правами.

1.2. Групповое редактирование через "Обслуживание"

В некоторых версиях конфигурации 1С:Розница может существовать похожий функционал, например, через АдминистрированиеОбслуживаниеГрупповое редактированиеЧеки. Однако, принцип действия и ограничения будут аналогичны "Групповому изменению реквизитов". Попытка изменить статус с "Архивный" на "Отложенный" приведет к той же ошибке "Не удалось провести".

Решение 2: Использование внешних обработок с программным отключением проверок (Рекомендуемый способ)

Для решения проблемы с архивными чеками, когда стандартные средства бессильны, наиболее эффективным и часто применяемым способом является использование специализированных внешних обработок. Эти инструменты позволяют программно отключить часть проверок системы. Вы можете написать код самостоятельно или воспользоваться готовыми решениями, такими как универсальное удаление любых документов без пометки на удаление или специализированное удаление пробитых чеков ККМ (включая чеки ЕГАИС и возвраты).

2.1. Принцип работы: ОбменДанными.Загрузка = Истина

Ключевым моментом в таких обработках является использование программного флага ОбменДанными.Загрузка = Истина. Рассмотрим, как это работает:

  1. Когда переменная ОбменДанными.Загрузка установлена в значение Истина, платформа 1С временно отключает ряд стандартных проверок и бизнес-логики, которые обычно выполняются при записи объектов.
  2. Это позволяет "загружать" данные "как есть", игнорируя, например, проверки статусов, блокировки по проведенным документам и другие ограничения, наложенные конфигурацией.
  3. После выполнения необходимых действий (изменения статуса или других реквизитов), критически важно установить ОбменДанными.Загрузка = Ложь, чтобы вернуть систему к стандартному режиму работы и восстановить все проверки.

Важно: Применение этого метода требует осторожности и понимания возможных последствий. Всегда создавайте резервную копию базы данных перед использованием подобных обработок, а также тестируйте их на копии базы.

2.2. Пошаговая инструкция по созданию и использованию внешней обработки

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

  1. Создание внешней обработки:

    Откройте конфигуратор (обычно через меню "Конфигурация" → "Открыть конфигурацию"). Перейдите в меню "Файл" → "Новый" → "Внешняя обработка". Сохраните пустую обработку на диске, например, "УдалениеАрхивныхЧеков.epf".

  2. Разработка формы и кода обработки:

    Добавьте на форму обработки кнопку, при нажатии на которую будет выполняться код. В модуле объекта или модуле формы обработки разместите следующий код:

    
    // Этот код размещается в модуле формы или модуле объекта обработки
    // (если используется вариант "Модуль объекта" для команды, то ее нужно вынести в команду)
    
    &НаСервере
    Функция ИзменитьСтатусИПометитьЧек(СсылкаНаЧек)
        Попытка
            // Получаем объект документа по ссылке
            ОбъектЧек = СсылкаНаЧек.ПолучитьОбъект();
    
            // Проверяем, является ли чек архивным
            Если ОбъектЧек.СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Архивный Тогда
                Сообщить("Обрабатываем чек " + СсылкаНаЧек + " со статусом 'Архивный'...");
    
                // *** КРИТИЧЕСКИ ВАЖНО: Отключаем проверки платформы ***
                ОбменДанными.Загрузка = Истина;
    
                // Меняем статус чека на "Отложенный" или на пустой (неопределенный)
                // Вы можете выбрать любой статус, который не блокирует удаление
                // Для Розницы чаще всего подходит "Отложенный", но иногда
                // проще установить неопределенное значение, если позволяет структура
                // конфигурации (например, СтатусЧекаККМ = Неопределено).
                // В данном примере мы меняем на "Отложенный".
                ОбъектЧек.СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Отложенный;
                        
                // Записываем измененный объект
                ОбъектЧек.Записать();
    
                // *** Важно: Возвращаем проверки платформы в обычный режим ***
                ОбменДанными.Загрузка = Ложь;
    
                Сообщить("Статус чека " + СсылкаНаЧек + " успешно изменен на 'Отложенный'.");
    
                // Теперь, когда статус изменен, мы можем пометить документ на удаление
                // Это делается после изменения статуса, чтобы обойти проверки.
                ОбъектЧек.УстановитьПометкуУдаления(Истина);
                Сообщить("Чек " + СсылкаНаЧек + " помечен на удаление.");
                        
                Возврат Истина;
            ИначеЕсли ОбъектЧек.ПометкаУдаления Тогда
                Сообщить("Чек " + СсылкаНаЧек + " уже помечен на удаление. Пропускаем.");
                Возврат Истина;
            Иначе
                // Если чек не архивный, но не помечен на удаление, все равно помечаем его
                Сообщить("Чек " + СсылкаНаЧек + " имеет статус '" + ОбъектЧек.СтатусЧекаККМ + "'. Помечаем на удаление.");
                ОбъектЧек.УстановитьПометкуУдаления(Истина);
                Сообщить("Чек " + СсылкаНаЧек + " помечен на удаление.");
                Возврат Истина;
            КонецЕсли;
        Исключение
            Сообщить("Ошибка при обработке чека " + СсылкаНаЧек + ": " + ОписаниеОшибки());
            // В случае ошибки также крайне важно вернуть ОбменДанными.Загрузка в Ложь!
            ОбменДанными.Загрузка = Ложь;
            Возврат Ложь;
        КонецПопытки;
    КонецФункции
    
    &НаКлиенте
    Процедура УдалитьВыбранныеЧеки(Команда)
        // Перед началом работы всегда предупреждаем о резервном копировании
        Если Вопрос("Перед выполнением этой операции КРАЙНЕ РЕКОМЕНДУЕТСЯ сделать полную резервную копию базы данных. Продолжить?", РежимДиалогаВопрос.ДаНет, 0) = КодВозвратаДиалога.Нет Тогда
            Возврат;
        КонецЕсли;
    
        Сообщить("Начинаем поиск и обработку архивных чеков...");
    
        // Создаем запрос для получения всех архивных чеков, которые не помечены на удаление
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    ЧекККМ.Ссылка
            |ИЗ
            |    Документ.ЧекККМ КАК ЧекККМ
            |ГДЕ
            |    ЧекККМ.СтатусЧекаККМ = &СтатусАрхивный
            |    И НЕ ЧекККМ.ПометкаУдаления"; // Исключаем уже помеченные на удаление
    
        Запрос.УстановитьПараметр("СтатусАрхивный", Перечисления.СтатусыЧековККМ.Архивный);
    
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            // Вызываем серверную функцию для изменения статуса и пометки
            ИзменитьСтатусИПометитьЧек(Выборка.Ссылка);
        КонецЦикла;
    
        Сообщить("Обработка чеков завершена. Теперь необходимо выполнить 'Удаление помеченных объектов'.");
        Сообщить("Перейдите в Администрирование -> Поддержка и обслуживание -> Удаление помеченных объектов.");
    КонецПроцедуры
    
  3. Запуск обработки в режиме предприятия:

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

  4. Выполнение удаления помеченных объектов:

    После того как обработка отработает и пометит все необходимые чеки на удаление, вам нужно будет выполнить стандартную процедуру удаления помеченных объектов. Для этого перейдите в АдминистрированиеПоддержка и обслуживаниеУдаление помеченных объектов. Вы можете выбрать режим "Выборочное удаление", чтобы убедиться, что удаляются только нужные вам чеки. Если объектов слишком много и стандартный механизм работает медленно, можно использовать фоновое удаление документов с контролем ссылочной целостности — удобнее через универсальный поиск и безопасное удаление данных и документов.

2.3. Важные замечания при использовании обработки

Автоматическое удаление чеков

В контексте удаления чеков часто возникает вопрос об автоматической очистке устаревших данных.

3.1. Удаление непробитых чеков ККМ

В 1С:Рознице предусмотрен функционал для автоматического удаления непробитых чеков (тех, которые были созданы, но не пробиты через ККМ) при закрытии кассовой смены. Эту опцию можно найти в настройках программы:

  1. Перейдите в раздел Настройки.
  2. Выберите пункт Еще больше возможностей.
  3. Откройте вкладку Продажи.
  4. В разделе Розничные продажи установите галочку напротив "Удалять непробитые чеки ККМ".

Это полезно для поддержания порядка в базе, но не относится к архивным чекам, которые уже прошли стадию пробития и закрытия смены.

3.2. Автоматическое удаление архивных чеков

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

Заключение

Удаление архивных чеков ККМ в 1С:Розница 8.3 — задача, требующая обхода стандартных механизмов защиты данных. Хотя типовые средства, такие как "Групповое изменение реквизитов", могут быть неэффективны для архивных чеков, использование внешних обработок с программным отключением проверок (через ОбменДанными.Загрузка = Истина) предоставляет надежное решение — для этих целей подойдёт групповая обработка документов для проведения и изменения статусов.

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

← На главную