При обновлении кассового оборудования и переходе с драйверов торгового оборудования АТОЛ 8-й версии (ДТО 8) на современную ветку ДТО 10 разработчики конфигураций на платформе 1С:Предприятие 7.7 часто сталкиваются с ситуацией, когда данные покупателя перестают попадать в чек. В частности, перестает передаваться реквизит тег 1008 (адрес электронной почты или номер телефона покупателя), из-за чего ОФД не может доставить электронный чек клиенту.
Рассмотрим, в чем кроется принципиальная разница в логике работы драйверов ДТО 8 и ДТО 10, как правильно выстроить последовательность команд при фискализации, и разберем сопутствующие тонкости платформы 1С 7.7.
Проанализируем архитектурные отличия библиотек. В старых версиях ДТО 8 драйвер прощал разработчикам вольности в порядке вызова свойств и методов: присвоение значения тегу 1008 могло производиться практически в любой момент до закрытия документа — в начале чека, между регистрацией позиций или непосредственно перед командой закрытия.
В ДТО 10 взаимодействие с ККТ строго регламентировано конечным автоматом состояний драйвера:
openReceipt().Посмотрим на пример правильной последовательности команд при прямой работе с COM-объектом драйвера AddIn.Fptr10. Обратим внимание, что в платформе 1С 7.7 отсутствует встроенный тип данных Булево, поэтому числовые константы 1 и 0 используются вместо Истина и Ложь.
Разберем по шагам типовой алгоритм:
// Инициализация объекта драйвера ККТ
Драйвер = СоздатьОбъект("AddIn.Fptr10");
// Подключение к устройству
Драйвер.open();
// 1. Указываем тип чека и базовые параметры
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_RECEIPT_TYPE, Драйвер.LIBFPTR_RT_SELL);
// 2. ПЕРЕД открытием чека передаем тег 1008 (e-mail или телефон)
ЭлПочта = СокрЛП(КлиентЭлПочта);
Если ПустаяСтрока(ЭлПочта) = 0 Тогда
// Записываем адрес покупателя в параметры
Драйвер.setParam(1008, ЭлПочта);
// Если нужно полностью подавить печать бумажного чека:
// Драйвер.setParam(Драйвер.LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, 1);
КонецЕсли;
// 3. Открываем фискальный чек
Драйвер.openReceipt();
// 4. Регистрация позиций (товаров/услуг)
// ... вызовы registration() ...
// 5. Оплата и закрытие чека
// ... вызовы payment() и closeReceipt() ...
Если код вызова скорректирован, но чек по-прежнему не уходит клиенту, выясним причину, проверив следующие моменты:
+79990000000). Некорректный формат приводит к отбрасыванию реквизита.LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY определяет, печатать ли бумажный чек. Если он не передан или равен 0, касса напечатает обычный чек на ленте, но тег 1008 всё равно зафиксируется в ФН и передастся в ОФД. Если же касса должна работать исключительно в электронном режиме (экономия бумаги), этот параметр выставляется в 1 до вызова openReceipt().processJson(). При передаче документа единым JSON-пакетом данные клиента указываются в блоке clientInfo (поле emailOrPhone), что полностью исключает ошибки последовательности вызова отдельных низкоуровневых методов драйвера.