В розничной торговле на базе конфигурации «1С:Управление торговлей 10.3» (на платформе 1С:Предприятие 8) нередко возникают форс-мажорные ситуации. Поломка кассового аппарата, сбои электросети или некорректные действия персонала могут привести к потере учетных данных. Типичный сценарий: касса ломается, продавцы продолжают проводить документы ЧекККМ в программе без пробития на фискальном регистраторе, а затем удаляют их, полагая, что раз товар списан, документы больше не нужны. В результате физически удаленные документы очищают движения по регистрам накопления, и проданный товар массово возвращается на остатки склада.
В этой статье мы подробно разберем, как выйти из такой ситуации, если актуальной резервной копии базы данных (бэкапа) не оказалось под рукой. Мы проанализируем технические каналы поиска утерянной информации и рассмотрим, как правильно настроить программу 1С, чтобы документы ЧекККМ не удалялись безвозвратно после закрытия кассовой смены.
Для начала разберем логику работы конфигурации «Управление торговлей 10.3». Документ ЧекККМ предназначен для оперативного отражения розничной продажи в течение кассовой смены. При проведении он делает движения по регистрам накопления (например, Товары на складах или Товары в рознице), временно списывая товары со склада.
При выполнении процедуры «Закрытие кассовой смены» система совершает следующие действия:
ОтчетОРозничныхПродажах, который осуществляет итоговое списание товаров и фиксирует выручку.ЧекККМ или помечает их на удаление (в зависимости от настроек программы), так как их движения заменяются сводным отчетом.Если же кассиры вручную пометили чеки на удаление и воспользовались обработкой УдалениеПомеченныхОбъектов до закрытия смены, то движения документов по регистрам остатков полностью очищаются. Товар снова «виртуально» возвращается на склад, хотя физически он уже продан покупателям. Без резервной копии базы восстановить эти документы стандартным интерактивным способом в интерфейсе 1С невозможно. Однако опускать руки не стоит — разберем системные методы извлечения утерянной информации.
Если ваша информационная база работает в файловом режиме (файл базы данных 1Cv8.1CD расположен на локальном компьютере или на сетевом диске), мы можем воспользоваться стандартной службой операционной системы — Volume Shadow Copy Service (VSS).
Проанализируем этот процесс по шагам:
Если ваша база работает под управлением СУБД (Microsoft SQL Server или PostgreSQL), то отсутствие бэкапов в формате .dt или резервных копий SQL не означает полную потерю данных. Если для базы данных SQL Server установлена модель восстановления Full (Полная), то абсолютно все операции по модификации и удалению данных записываются в лог транзакций (файл с расширением .ldf).
Для извлечения удаленных строк из табличной части чеков выполним следующие действия:
ЧекККМ соответствует таблица с префиксом _Document (например, _Document150), а его табличной части «Товары» — таблица _Document150_VT1234. Идентификаторы таблиц для вашей конфигурации можно предварительно узнать из служебной таблицы _Metadata.DELETE в табличной части товаров чека ККМ. Утилита покажет удаленные строки, включая идентификаторы номенклатуры (UUID), количество и цену.Даже если плата на кассовом аппарате (например, Атол 22Ф) сгорела, кассиры продолжали работать на компьютере. При попытке проведения или печати чеков программа 1С передает данные на локальный компьютер, где установлен драйвер торгового оборудования. Драйвер Атол детально логирует все входящие запросы.
Рассмотрим, как найти эти данные в лог-файлах драйвера:
fptr10.log и располагается по пути:
C:\Users\[ИмяПользователя]\AppData\Roaming\Atol\fptr10\fptr10.log или в папке установки драйвера.
<registerPosition name="Товар А" price="150.00" quantity="2.000" .../>
Списание товаров в 1С.Журнал регистрации 1С по умолчанию не сохраняет внутреннее содержимое табличных частей документов (состав проданных товаров), однако он фиксирует сам факт удаления и базовые реквизиты объекта.
Проанализируем, какую пользу мы можем извлечь из Журнала регистрации:
Документ.ЧекККМ.Чтобы избежать подобных инцидентов в будущем и иметь возможность оформлять возвраты товаров от покупателей «не день в день» (по истечении кассовой смены), необходимо настроить программу так, чтобы чеки ККМ не удалялись безвозвратно. Способ реализации зависит от релиза вашей конфигурации «Управление торговлей 10.3».
В современных релизах УТ 10.3 разработчики добавили штатный механизм архивации. Настроим его по шагам:
Как это работает: Теперь при выполнении обработки ЗакрытиеКассовойСмены документы ЧекККМ не будут удаляться физически или помечаться на удаление. Программа автоматически снимет их с проведения (очистит движения, чтобы они не задваивали остатки с документом ОтчетОРозничныхПродажах) и присвоит им статус «Архивный». Такие документы останутся в базе данных, и вы в любой момент сможете открыть их, посмотреть состав продаж или оформить документ возврата на их основании.
Если ваша конфигурация сильно кастомизирована и обновить ее до версии 10.3.43.2 нет возможности, встроенного флажка архивации в справочнике касс не будет. В этом случае у вас есть два пути:
Вариант А. Оформление возвратов вручную.
Возвраты прошлых смен оформляются стандартным документом ВозвратТоваровОтПокупателя. Поскольку чека-основания в базе больше нет, документ создается вручную с видом операции «Продажа, комиссия». В качестве контрагента указывается предопределенный элемент «Розничный покупатель».
Вариант Б. Доработка алгоритма закрытия смены (для программистов).
Если требуется автоматизировать процесс сохранения чеков, необходимо изменить код удаления в конфигураторе. Проанализируем пример кода, который можно внедрить в обработку ЗакрытиеКассовойСмены (или выполнить через расширение конфигурации, если платформа позволяет использовать расширения в режиме совместимости):
// В обработке "ЗакрытиеКассовойСмены" найдем процедуру удаления чеков
Процедура УдалитьЧекиККМ(МассивЧеков) Экспорт
Для Каждого ТекущийЧек Из МассивЧеков Цикл
СсылкаНаЧек = ТекущийЧек.Ссылка;
ДокументОбъект = СсылкаНаЧек.ПолучитьОбъект();
// Вместо непосредственного удаления ДокументОбъект.Удалить()
// мы переводим документ в статус архивного и распроводим его
Попытка
ДокументОбъект.Проведен = Ложь;
// Если в вашем релизе есть реквизит СтатусЧекаККМ, установим его в "Архивный"
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СтатусЧекаККМ", Метаданные.Документы.ЧекККМ) Тогда
ДокументОбъект.СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Архивный;
КонецЕсли;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Исключение
ЗаписьЖурналаРегистрации("Ошибка архивации чека",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось архивировать чек: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Данная модификация полностью исключит физическое удаление документов из базы данных и позволит сохранить сквозную аналитику розничных продаж для последующего контроля и удобного оформления возвратов.
Описанный инцидент с удалением чеков произошел в первую очередь из-за некорректно настроенных прав доступа пользователей. По умолчанию в 1С кассирам никогда не должно предоставляться право на интерактивное удаление или даже пометку удаления документов.
Проанализируем необходимые настройки ограничений:
ИнтерфейсКассира или Продавец) откройте права на документ ЧекККМ.Реализация этих несложных правил разграничения прав и своевременная настройка архивации чеков ККМ полностью защитят вашу базу данных от фатальных ошибок персонала и сберегут время при учете розничных продаж.