Что делать, если чек пробит на кассовом аппарате, но не провелся в 1С:Розница?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем её глубокие технические и аппаратные причины, а также предложим несколько надежных вариантов решения — от настройки параметров торгового оборудования до доработки программного кода 1С.

Выясняем причину: почему происходит рассинхронизация ККТ и 1С?

Для того чтобы понять логику возникновения этой ошибки, рассмотрим пошагово, как именно программный комплекс взаимодействует с фискальным регистратором в момент оплаты:

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

Если на последнем, пятом шаге происходит сбой (микросекундный обрыв связи, зависание СУБД, блокировка таблиц базы данных из-за фонового процесса), транзакция записи в 1С аварийно откатывается. В итоге физическая продажа на кассе уже совершена и зафиксирована в ФН, а в учетной системе документ остается «висеть» непроведенным.

Проанализируем основные факторы, вызывающие этот сбой:

Рассмотрим детально, как решить эту проблему на всех уровнях информационной системы.

Шаг 1. Настройка таймаутов и драйвера фискального регистратора

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

  1. Запустите тест драйвера ККТ (например, «Тест драйвера ФР» от Штрих-М) от имени администратора.
  2. Перейдите в свойства подключения оборудования.
  3. Найдите параметр Таймаут (Timeout). По умолчанию там может стоять значение 100-150 мс.
  4. Увеличьте это значение. Для слабых компьютеров на базе процессоров Intel Atom рекомендуется устанавливать таймаут вплоть до 7000 мс. Для современных производительных ПК оптимальным решением будет значение в 1000–2000 мс.
  5. В настройках торгового оборудования внутри самой 1С также обязательно укажите аналогичный увеличенный таймаут.

Кроме того, регулярно обновляйте драйвер ККТ. В старых версиях драйверов (например, Штрих-М серии 4.9) наблюдались внутренние ошибки работы памяти, из-за которых драйвер периодически возвращал пустые значения номера смены и номера чека в обработку обслуживания 1С.

Шаг 2. Разрешение конфликтов блокировок при автообмене РИБ

Если вы используете распределенные информационные базы (РИБ) с файловой СУБД, параллельные процессы записи при обмене гарантированно будут вызывать конфликты транзакций с РМК. Чтобы устранить эту проблему, применим комплекс мер:

  1. Изменение расписания обменов: Откажитесь от слишком частых автообменов (например, каждые 5 минут). Настройте интервал синхронизации в пределах 15–30 минут либо привяжите запуск обмена к технологическим перерывам кассиров.
  2. Настройка параметров синхронизации: В настройках узла РИБ установите параметр «Количество элементов в транзакции» равным 1. Это снизит время удержания блокировки таблиц базы данных при загрузке изменений.
  3. Альтернативный метод обмена: Рекомендуется отказаться от запуска регламентного задания обмена непосредственно в сеансе кассира. Вместо этого можно настроить внешнюю утилиту обмена (например, через скрипт VBS/Powershell или COM-соединение), запускаемую во внешнем потоке операционной системы.
  4. Переход на клиент-серверный режим (SQL): Это наиболее надежное системное решение. Использование бесплатной СУБД PostgreSQL полностью снимает проблему монопольных блокировок таблиц файловой базы данных 1Cv8.1CD, так как клиент-серверная архитектура блокирует только конкретные строки данных, позволяя кассиру беспрепятственно пробивать чеки параллельно с любыми фоновыми загрузками.

Шаг 3. Программная доработка РМК (внедрение «заплатки» безопасности)

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

Рассмотрим, как реализовать этот алгоритм. В конфигурации «1С:Розница» (ред. 2.0 / 2.2) откроем модуль управляемой формы РМК и найдем процедуру создания и проведения чеков (например, метод СоздатьЧеки или ПробитьЧекВыполнитьЗавершение).

Найдем фрагмент кода, отвечающий за выполнение печати фискального чека:

Отказ = НЕ ПробитьЧекВыполнить(ОбъектЧекККМ, Ответ);

Модифицируем этот участок кода, добавив интерактивный диалог с пользователем в случае возникновения ошибки:


Отказ = НЕ ПробитьЧекВыполнить(ОбъектЧекККМ, Ответ);

Если Отказ Тогда
    ТекстВопроса = "ВНИМАНИЕ!!! Возникла ошибка при пробитии чека на ККМ! 
                   |Пожалуйста, проверьте бумажную ленту устройства. 
                   |Вышел ли фискальный чек полностью и напечатана ли сумма?";
                   
    КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 0, КодВозвратаДиалога.Нет, "Проверка состояния ККТ");
    
    Если КодВозврата = КодВозвратаДиалога.Да Тогда
        // Кассир подтвердил, что чек физически напечатан. 
        // Принудительно сбрасываем признак ошибки ("Отказ"), позволяя 1С провести документ.
        Отказ = Ложь;
        
        // Попытаемся программно получить актуальные реквизиты из ФР, чтобы заполнить документ
        Попытка
            НомерЧекаККМ = "";
            НомерСменыККМ = "";
            // Здесь вызываются стандартные методы интеграционной библиотеки для чтения параметров ККТ
            ПолучитьПараметрыПоследнейОперацииККМ(НомерЧекаККМ, НомерСменыККМ);
            ОбъектЧекККМ.НомерЧекаККМ = НомерЧекаККМ;
            ОбъектЧекККМ.НомерСменыККМ = НомерСменыККМ;
        Исключение
            // Если прочитать реквизиты не удалось, запишем хотя бы пустые, чтобы провести документ
            ЗаписьЖурналаРегистрации("ККМ", УровеньЖурналаРегистрации.Предупреждение, , , 
                "Не удалось прочитать номера чека/смены с ККТ: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Данная доработка полностью исключает ситуации, когда кассиры, испугавшись ошибки на экране, нажимают «Оплатить» повторно, из-за чего по фискальному накопителю ККТ регистрируются две продажи, а в 1С проводится только один документ.

Шаг 4. Устранение неполадок с электропитанием торгового оборудования

Если сбои происходят хаотично и в логах драйвера регистрируется ошибка FFFFFFFFh (нет связи с устройством) или наблюдается кратковременное «зависание» кассового бокса на этапе оплаты картой, обратим внимание на аппаратное подключение периферии:

  1. Энергосбережение портов Windows: Откройте Диспетчер устройств Windows. Найдите раздел «Контроллеры USB». Для каждого «Корневого USB-концентратора» перейдите в Свойства, откройте вкладку «Управление электропитанием» и снимите флажок «Разрешить отключение этого устройства для экономии энергии».
  2. Подключение эквайрингового терминала: Интегрированные банковские пин-пады (особенно от Сбербанка), подключенные исключительно по USB, могут потреблять пиковый ток выше стандартных 500 мА. Это приводит к перезагрузке USB-контроллера материнской платы, отчего «отваливается» и стоящий на том же контроллере фискальный регистратор. Переведите пин-пад на физический COM-порт (RS-232) с использованием внешнего блока питания.

Как исправить уже возникшие «зависшие» чеки?

Если смена уже закрылась, а в базе остались непроведенные чеки с пустым статусом, которые привели к расхождению с Z-отчетом, необходимо выполнить ручную коррекцию данных.

Вариант А. Смена еще не закрыта

В этом случае мы можем восстановить соответствие данных программным путем:

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

Вариант Б. Смена уже закрыта, отчет о розничных продажах сформирован

Если смена закрыта, документ Чек ККМ изменить стандартным образом уже нельзя. Действуем по следующей схеме:

  1. Откройте созданный за эту смену документ Отчет о розничных продажах.
  2. Перейдите на вкладку «Товары» и вручную добавьте туда позиции номенклатуры из зависшего чека. Это спишет товары со склада и скорректирует себестоимость.
  3. Перейдите на вкладку «Оплата» (или «Оплата платежными картами», если покупка была совершена по безналичному расчету) и добавьте сумму зависшего чека, чтобы выровнять кассу предприятия с фактическим поступлением денежных средств на расчетный счет или в сейф.
  4. Проведите документ Отчет о розничных продажах.

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

← На главную