При автоматизации розничной торговли часто возникает неприятная ситуация: в документе 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, а детальный перечень товаров уходит в текстовое описание.Рассмотрим последовательно варианты исправления ситуации, начиная от простых пользовательских настроек и заканчивая доработкой программного кода.
Использование устаревшего драйвера ДТО 8.х часто является первопричиной сбоев обмена. Производитель АТОЛ прекратил поддержку 8-й версии драйверов. Для решения проблемы рекомендуется выполнить переход:
Если обновление драйвера не решило проблему, проверим настройки ФЛК в параметрах подключения ККТ прямо в интерфейсе 1С:
Проанализируем, каким документом кассир оформляет продажу. Если печать чека запускается из документа ПриходныйКассовыйОрдер, то поведение системы с передачей количества «1» является стандартным. Для корректного вывода чека со спецификацией товаров необходимо проводить продажи через Рабочее место кассира (РМК) с формированием документов ЧекККМ либо использовать документ РеализацияТоваровУслуг.
Если типовые настройки не помогают, разработчику необходимо прибегнуть к отладке кода. Проанализируем структуру данных на выходе функции ПараметрыОперацииФискализацииЧека. Если в структуре ПозицииЧека количество заполнено верно, но в лог драйвера все равно уходит единица, значит, подмена происходит на этапе формирования XML-пакета для ККТ или внутри самой обработки обслуживания оборудования.
Разберем пример кода, который может принудительно перезаписывать количество. Нам необходимо найти функцию, отвечающую за подготовку таблицы параметров перед вызовом методов драйвера (например, в общем модуле МенеджерОборудованияКлиент или в модуле обработки обслуживания):
// Пример корректировки кода подготовки позиций чека
Для Каждого СтрокаПозиции Из ПозицииЧека Цикл
// Исходный проблемный код мог содержать проверку вида:
// Если СтрокаПозиции.ДробноеКоличество Тогда Количество = 1; КонецЕсли;
// Исправленный вариант передачи параметров в драйвер:
ОбъектДрайвера.Quantity = СтрокаПозиции.Количество;
ОбъектДрайвера.Price = СтрокаПозиции.Цена;
ОбъектДрайвера.Name = СтрокаПозиции.Наименование;
КонецЦикла;
Проверьте логику работы с переменной Количество. В некоторых устаревших интеграционных библиотеках разработчики ставили жесткое ограничение: при обнаружении нецелого количества происходило округление или замена на 1 во избежание ошибок ККТ. Замена логики формирования XML-пакета на прямую передачу фактических реквизитов позиции полностью решает проблему передачи некорректного количества на печать.