Как исправить ошибку "Чек закрыт, операция не возможна" на кассах Атол при работе через веб-сервис?

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

При автоматизации розничной торговли с использованием кассового оборудования Атол, подключенного через веб-сервис (Atol Online или локальный драйвер с веб-интерфейсом), разработчики часто сталкиваются с неприятной ошибкой: "Чек закрыт, операция не возможна". Эта проблема особенно обостряется в периоды высокой нагрузки (праздники) или при попытке пробить чеки с большим количеством позиций, особенно если товары подлежат обязательной маркировке («Честный ЗНАК»).

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

Выясним причины возникновения ошибки

Ошибка «Чек закрыт» при использовании веб-сервиса Атол коварна тем, что она является следствием, а не первопричиной. Проанализируем основные факторы, которые приводят к такому состоянию системы:

  1. Лимит размера JSON-запроса. Веб-сервис Атол обменивается данными по протоколу HTTP/HTTPS, используя формат JSON. Существует жесткое ограничение на объем передаваемого пакета данных. Как правило, этот порог составляет 32 КБ (около 30 000 - 32 000 символов). При продаже маркированных товаров каждая позиция содержит код DataMatrix, который значительно «раздувает» размер запроса. Если в чеке более 100-130 позиций с маркировкой, размер JSON гарантированно превысит лимит, и запрос будет отклонен или обработан некорректно.
  2. Ограничения фискального накопителя (ФН). Физическая память ФН не безгранична. Каждый фискальный документ имеет максимальный объем в байтах. При использовании ФФД 1.2 нагрузка на ФН возрастает, так как записываются дополнительные теги для маркировки. Если документ превышает лимит ФН, касса выдает ошибку.
  3. Таймауты веб-сервиса и драйвера. Формирование длинного чека с проверкой кодов маркировки занимает много времени (иногда до 30-60 секунд). Если Таймаут записи или Request Timeout в настройках веб-сервиса установлен на стандартные 5-10 секунд, 1С разрывает соединение, не дождавшись ответа. Однако касса в это время может продолжать печатать чек. При повторной попытке отправить тот же запрос, система видит, что документ уже фискализирован (или находится в процессе), и выдает ошибку «Чек закрыт».
  4. Очередь заданий. Веб-сервис Атол работает по принципу очереди. Если длинное задание «зависло» на этапе проверки кода маркировки в системе ОФД, все последующие обращения к этому заданию будут возвращать ошибку невозможности операции, так как текущий статус документа в кассе не позволяет производить новые действия.

Решение 1: Программное разделение чека в 1С

Если бизнес-процесс предполагает продажу большого ассортимента одному физическому лицу, самым надежным решением будет принудительное разбиение одного документа на несколько чеков. Разберем, как реализовать логику контроля количества позиций.

Проанализируем пример кода, который ограничивает количество строк в одном пакете для отправки на кассу:


// Определяем максимально допустимое количество строк с маркировкой
МаксКоличествоСтрок = 80; 
ВсегоСтрок = Объект.Товары.Количество();
ТекущаяСтрока = 0;

Пока ТекущаяСтрока < ВсегоСтрок Цикл
    // Формируем массив позиций для части чека
    МассивПозиций = Новый Массив;
    Для Итератор = 1 По МаксКоличествоСтрок Цикл
        Если ТекущаяСтрока >= ВсегоСтрок Тогда
            Прервать;
        КонецЕсли;
        
        СтрокаТовара = Объект.Товары[ТекущаяСтрока];
        // Логика добавления товара в JSON-структуру...
        МассивПозиций.Добавить(СформироватьСтруктуруПозиции(СтрокаТовара));
        
        ТекущаяСтрока = ТекущаяСтрока + 1;
    КонецЦикла;
    
    // Отправляем сформированную часть чека на кассу
    Результат = ОтправитьЧекНаВебСервисАтол(МассивПозиций);
    
    Если Не Результат.Успех Тогда
        ВызватьИсключение "Ошибка при пробитии части чека: " + Результат.ОписаниеОшибки;
    КонецЕсли;
КонецЦикла;

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

Решение 2: Настройка таймаутов драйвера DTO 10

Чтобы избежать ситуации, когда 1С «отваливается» раньше, чем касса успевает ответить, необходимо увеличить параметры ожидания. Рассмотрим, где это настраивается:

  1. Откройте Тест драйвера ККТ (DTO 10).
  2. Перейдите в раздел «Свойства» -> «Параметры связи».
  3. Установите значение Таймаут чтения и Таймаут записи не менее 30 000 мс (30 секунд). Для очень длинных чеков рекомендуется 60 000 мс.
  4. Если используется Веб-сервис (развернутый как служба Windows), найдите файл конфигурации (обычно atol-service.ini или settings.json в папке сервиса) и проверьте параметры requestTimeout.

Решение 3: Проверка состояния документа перед повторной отправкой

Чтобы не получать ошибку «Чек закрыт», мы должны научить нашу систему проверять, не был ли пробит чек на самом деле, если произошел сетевой сбой. Посмотрим на алгоритм действий:

Перед каждой отправкой чека (особенно в блоке Попытка...Исключение) рекомендуется запрашивать состояние последнего фискального документа. В драйвере Атол за это отвечают методы получения статуса ККТ.


// Псевдокод проверки статуса перед пробитием
СтатусККТ = ПолучитьСтатусПоследнегоДокумента(Касса);

// Если номер последнего ФД в кассе совпадает с тем, что мы пытаемся записать,
// значит чек уже пробит, и отправлять его повторно нельзя.
Если СтатусККТ.НомерПоследнегоФД = МойРегистрируемыйНомер Тогда
    ЗафиксироватьУспехВБазе(МойДокумент);
    Возврат;
КонецЕсли;

// Если чек не найден, пробуем отправить данные
Попытка
    Результат = Касса.СформироватьЧек(ДанныеJSON);
Исключение
    // В случае ошибки связи не спешим выводить ошибку пользователю, 
    // а проверяем статус снова через паузу
    Приостановить(2); 
    // Повторная проверка статуса...
КонецПопытки;

Рекомендации по работе с маркировкой (ФФД 1.2)

Проанализируем особенности работы с кодами маркировки, которые влияют на стабильность:

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

← На главную