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

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

При работе в программе «1С:Розница» (версии 2.2 и выше) пользователи часто сталкиваются с ситуацией, когда необходимо навести порядок в справочниках, например, объединить дублирующиеся карточки номенклатуры. Стандартная обработка «Поиск и удаление дублей» находит лишние элементы, заменяет их во всех документах, но на этапе записи архивных чеков ККМ выдает ошибку: «Чек имеет статус "Архивный". Операции над этим документом запрещены!».

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

Почему 1С блокирует изменение архивных чеков?

Прежде чем мы перейдем к решению, давайте проанализируем ситуацию. Статус Архивный у документа Чек ККМ означает, что смена закрыта, и данные этого чека уже включены в сводный документ Отчет о розничных продажах (ОРП). Система блокирует изменения, чтобы избежать расхождений между детальными чеками и итоговым отчетом за день. Более того, в современных версиях программ реализован жесткий контроль в соответствии с требованиями 54-ФЗ (закон об онлайн-кассах).

Однако при технической чистке базы (удалении дублей) нам необходимо обновить ссылку на номенклатуру даже в старых документах. Рассмотрим, как это сделать правильно.

Способ 1. Использование встроенной групповой обработки (режим разработчика)

Самый простой и безопасный метод для администратора или программиста — воспользоваться типовой обработкой «Групповое изменение реквизитов» (в некоторых конфигурациях она находится в разделе Администрирование — Обслуживание — Корректировка данных). Разберем этот алгоритм по шагам:

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

Именно режим ОбменДанными.Загрузка = Истина позволяет игнорировать программные проверки в процедурах ПередЗаписью и ПриЗаписи.

Способ 2. Программный обход защиты через код

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


Если (СтатусЧекаККМПоСсылке = Перечисления.СтатусыЧековККМ.Архивный
     ИЛИ СтатусЧекаККМПоСсылке = Перечисления.СтатусыЧековККМ.Аннулированный) 
     И (НЕ ДополнительныеСвойства.Свойство("ЗагрузкаДанныхИзРабочегоМеста"))
     И Не (мЗакрытиеСмены) Тогда
     
     // Здесь система вызывает исключение и прерывает запись
     Отказ = Истина;
КонецЕсли;

Чтобы обойти это условие без изменения самой конфигурации (что крайне нежелательно), мы можем использовать свойство ОбменДанными.Загрузка. Рассмотрим пример кода, который меняет статус чека или обновляет его данные:


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

Способ 3. Использование дополнительных свойств документа

Как мы увидели в коде выше, система также проверяет наличие свойства ЗагрузкаДанныхИзРабочегоМеста. Это специфическая проверка для распределенных информационных баз (РИБ). Мы можем «обмануть» систему, добавив это свойство программно перед вызовом метода Записать(). Разберем, как это выглядит:


ОбъектЧека = СсылкаНаЧек.ПолучитьОбъект();
ОбъектЧека.ДополнительныеСвойства.Вставить("ЗагрузкаДанныхИзРабочегоМеста", Истина);
// Теперь система пропустит условие блокировки
ОбъектЧека.Записать();

Этот метод считается более «мягким», чем полная блокировка всех проверок через ОбменДанными.Загрузка, так как он имитирует штатную ситуацию поступления данных из другой базы.

Связь архивных чеков с «Отчетом о розничных продажах»

Важно помнить: если вы изменили номенклатуру в архивном чеке, это не изменит данные в уже проведенном Отчете о розничных продажах за тот день. Чтобы данные в базе были консистентными (согласованными), проанализируем следующую последовательность действий:

  1. Найдем Отчет о розничных продажах, к которому привязан корректируемый чек.
  2. Отменим проведение этого ОРП.
  3. Выполним замену номенклатуры в архивных чеках (способами, описанными выше).
  4. Перезаполним или просто заново проведем Отчет о розничных продажах.

Только в этом случае ваши складские остатки и финансовые результаты по Отчету о розничных продажах сойдутся с данными первичных чеков.

Меры предосторожности и закон об онлайн-кассах (54-ФЗ)

Проанализируем ситуацию с точки зрения фискального учета. Изменение архивного чека в базе 1С за прошлый год (например, за 2018-й, как в примере из темы форума) никак не влияет на данные, которые уже ушли в ОФД и налоговую инспекцию. Однако:

Если же ваша цель — исключительно техническое объединение дублей карточек (например, «Хлеб Бородинский» и «Хлеб Бородинский (дубль)»), то описанные выше методы программного изменения являются стандартной практикой обслуживания информационной базы.

Резюмируем: Чтобы изменить архивный чек, используйте групповую обработку в режиме «Выполнять в режиме загрузки данных» или установите в коде свойство ОбменДанными.Загрузка = Истина. Это позволит обойти жесткие проверки конфигурации и успешно выполнить очистку базы от дублей.

← На главную