Почему АТОЛ 30Ф печатает количество товара всегда равным единице в 1С:Управление торговлей и как это исправить

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

При автоматизации розничной торговли часто возникает неприятная ситуация: в документе 1С указано верное дробное или целое количество товара (например, 1,400 метров пленки или 5 штук посуды), но на чековой ленте ККТ АТОЛ 30Ф упорно печатается количество 1. При этом цена пересчитывается странным образом, а реальное количество и цена за единицу оказываются «склеенными» в наименовании товара.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем поведение драйвера ККТ АТОЛ, изучим механизмы работы «1С:Управление торговлей» и найдем рабочие способы решения этой технической неполадки.

Анализ лога драйвера ККТ

Для того чтобы понять, на каком этапе происходит искажение данных — в самой программе 1С или уже внутри драйвера торгового оборудования — необходимо изучить технологический лог драйвера. Для торгового оборудования АТОЛ этот файл обычно называется FprnM1C.log и располагается в каталоге пользователя %userprofile%\AppData\Roaming\ATOL\DRIVER\.

Проанализируем фрагмент лога, отражающий момент фискализации позиции:


Driver.OpenCheck
Driver.GetStatus
RcpPixelLineLength = 384
Driver.Set_CurrentDeviceNumber 1
Driver.Set_Quantity 1
Driver.Set_Price 93,8
Driver.Set_DiscountValue 0
Driver.Set_Name Пленка п/эт 3000*0,2 Пластик-Ангарск 1,400 X 67,00
Driver.Set_Department 1
Driver.Set_TextWrap 1
Driver.Registration

Обратим внимание на ключевые строчки лога. Команда Driver.Set_Quantity 1 явно указывает на то, что сама управляющая программа 1С передает в драйвер количество, равное единице. При этом реальные показатели покупки (количество 1,400 и цена 67,00) программно склеиваются в одну строчку и передаются свойству наименования: Driver.Set_Name Пленка п/эт 3000*0,2 Пластик-Ангарск 1,400 X 67,00.

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

Почему 1С принудительно сворачивает количество в единицу?

Существует несколько базовых причин, по которым механизмы БПО (Библиотеки подключаемого оборудования) 1С прибегают к такой логике передачи позиций чека:

  1. Печать чека из платежных документов. Если кассир пробивает чек не через специализированное рабочее место (РМК) или документ ЧекККМ, а на основании документов движения денежных средств (например, ПриходныйКассовыйОрдер или ЭквайринговаяОперация), система воспринимает операцию как прием платежа (оплату). В этом случае с точки зрения законодательства передается услуга по приему оплаты в количестве 1, а детальный перечень товаров уходит в текстовое описание.
  2. Срабатывание контроля расхождения сумм (ФЛК). В настройках интеграции оборудования присутствует механизм форматно-логического контроля. Если из-за округления копеек при расчете скидок или распределении НДС сумма по строкам не сходится с итогом документа, алгоритмы 1С могут принудительно «свернуть» проблемную строку. Количество приравнивается к 1, а итоговая стоимость строки передается в качестве цены.
  3. Ограничения старых версий драйверов (DTO 8) при работе с дробными числами. При использовании устаревших драйверов 8.х и ККТ в режиме ЕНВД (принтера чеков) обработка обслуживания может умышленно преобразовывать дробное количество в единицу, чтобы избежать аппаратных ошибок округления ККТ.
  4. Параметр «Количество товара на ЧЛ» в настройках ККТ. Попытки настроить этот параметр через тест драйвера ККТ не принесут результата. Согласно официальной документации АТОЛ, параметр «Количество товара на ЧЛ» не используется и не поддерживается в младших моделях ККТ, таких как АТОЛ 30Ф (а также 1Ф, 11Ф, 20Ф и др.). Внешний вид чека полностью контролируется программным кодом 1С.

Способы решения проблемы

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

Способ 1. Переход на современный драйвер ДТО 10

Использование устаревшего драйвера ДТО 8.х часто является первопричиной сбоев обмена. Производитель АТОЛ прекратил поддержку 8-й версии драйверов. Для решения проблемы рекомендуется выполнить переход:

  1. Установите на рабочем месте актуальную версию драйвера АТОЛ ДККТ 10.х.
  2. В конфигурации 1С перейдите в меню администрирования подключаемого оборудования.
  3. Измените тип оборудования для вашей ККТ: вместо устаревшего «Фискального регистратора» добавьте устройство с типом «ККТ с передачей данных» (даже если физически касса перепрошита под ЕНВД и работает без фискального накопителя).
  4. Настройте параметры подключения через новый драйвер 10-й версии и выполните тест устройства. Современные релизы БПО в 1С корректно передают дробные значения через интерфейсы ДТО 10.

Способ 2. Изменение настроек форматно-логического контроля (ФЛК)

Если обновление драйвера не решило проблему, проверим настройки ФЛК в параметрах подключения ККТ прямо в интерфейсе 1С:

  1. Перейдите в раздел Администрирование — Подключаемое оборудование.
  2. Откройте карточку настройки вашей ККТ.
  3. Найдите опцию «Способ форматно-логического контроля» (в зависимости от релиза БПО название может немного отличаться).
  4. Измените значение с «Контролировать суммы» на «Разделять строки» или «Только передавать». Это отключит принудительное сворачивание количества в единицу при расхождении копеек округления.

Способ 3. Анализ источника печати

Проанализируем, каким документом кассир оформляет продажу. Если печать чека запускается из документа ПриходныйКассовыйОрдер, то поведение системы с передачей количества «1» является стандартным. Для корректного вывода чека со спецификацией товаров необходимо проводить продажи через Рабочее место кассира (РМК) с формированием документов ЧекККМ либо использовать документ РеализацияТоваровУслуг.

Способ 4. Корректировка кода обработки обслуживания (для разработчиков)

Если типовые настройки не помогают, разработчику необходимо прибегнуть к отладке кода. Проанализируем структуру данных на выходе функции ПараметрыОперацииФискализацииЧека. Если в структуре ПозицииЧека количество заполнено верно, но в лог драйвера все равно уходит единица, значит, подмена происходит на этапе формирования XML-пакета для ККТ или внутри самой обработки обслуживания оборудования.

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


// Пример корректировки кода подготовки позиций чека
Для Каждого СтрокаПозиции Из ПозицииЧека Цикл
    // Исходный проблемный код мог содержать проверку вида:
    // Если СтрокаПозиции.ДробноеКоличество Тогда Количество = 1; КонецЕсли;
    
    // Исправленный вариант передачи параметров в драйвер:
    ОбъектДрайвера.Quantity = СтрокаПозиции.Количество;
    ОбъектДрайвера.Price = СтрокаПозиции.Цена;
    ОбъектДрайвера.Name = СтрокаПозиции.Наименование;
КонецЦикла;

Проверьте логику работы с переменной Количество. В некоторых устаревших интеграционных библиотеках разработчики ставили жесткое ограничение: при обнаружении нецелого количества происходило округление или замена на 1 во избежание ошибок ККТ. Замена логики формирования XML-пакета на прямую передачу фактических реквизитов позиции полностью решает проблему передачи некорректного количества на печать.

← На главную