При интеграции эквайринговых терминалов Сбербанка (например, Pax SP30, IPP320 и других) с конфигурациями 1С на обычных формах (таких как 1С:Управление торговлей 10.3, 1С:Розница 1.0) специалисты часто сталкиваются со следующей проблемой: оплата по карте проходит успешно, деньги со счета клиента списываются, однако фискальный регистратор не печатает слип-чек. При отладке выясняется, что компонент драйвера Сбербанка SBRFCOM.dll возвращает пустое значение в параметре текста чека или свойство Количество строк слип-чека (или аналогичное в зависимости от версии обработки) устанавливается равным 0.
В этой статье мы подробно разберем, почему возникает данная техническая неполадка, как устроена схема взаимодействия 1С с банковским ПО и какие шаги необходимо предпринять для восстановления корректной печати чеков.
Проанализируем стандартную схему работы. Когда кассир инициирует оплату картой, 1С обращается к зарегистрированной в операционной системе COM-библиотеке SBRFCOM.dll. Данная библиотека связывается со служебным ПО Сбербанка (обычно расположенным в каталоге C:\sc552 или C:\sbrf) и отправляет команду на пин-пад. После успешного проведения транзакции терминал возвращает ответ драйверу, а драйвер, в свою очередь, должен передать массив строк слип-чека обратно в 1С для последующего вывода на фискальный регистратор. Для детального изучения принципов взаимодействия и доступных функций компоненты можно использовать описание методов и функций внешней компоненты SBRFCOM.DLL.
Рассмотрим фрагмент типичного кода в обработке обслуживания эквайринга, где происходит обработка результата операции:
// Получаем объект драйвера платежной системы
ОбъектДрайвера = ПолучитьОбъектДрайвера();
// Вызываем метод проведения оплаты
РезультатОплаты = ОбъектДрайвера.ОплатитьПлатежнойКартой(Сумма, НомерКарты);
Если РезультатОплаты Тогда
// Проверяем количество строк слип-чека, возвращенное драйвером
КоличествоСтрок = ОбъектДрайвера.КоличествоСтрокСлипЧека;
Если КоличествоСтрок = 0 Тогда
// Сюда мы попадаем, если драйвер вернул нулевую длину
ЗаписатьВЛог("Внимание: Драйвер вернул 0 строк для слип-чека.");
Иначе
// Печатаем строки слип-чека на фискальном регистраторе
Для НомерСтроки = 1 По КоличествоСтрок Цикл
СтрокаЧека = ОбъектДрайвера.ПолучитьСтрокуСлипЧека(НомерСтроки);
ФискальныйРегистратор.НапечататьНефискальнуюСтроку(СтрокаЧека);
КонецЦикла;
EndIf;
КонецЕсли;
Если свойство КоличествоСтрокСлипЧека возвращает 0 (или метод GetLine возвращает пустые строки), фискальный регистратор просто не получает команду на печать. Проблема кроется в том, что по умолчанию во многих конфигурациях терминалов вывод слип-чека заблокирован на уровне настроек самого банковского ПО, либо драйвер ожидает печать чека непосредственно встроенным принтером самого терминала (если это автономный терминал с чековой лентой).
В 99% случаев данная проблема не связана с ошибками в коде 1С. Количество слип-чеков и режим их передачи в ККТ жестко задаются в параметрах терминала на сервере Сбербанка и загружаются в устройство при инициализации. Вам необходимо связаться с технической поддержкой банка (или инженером, обслуживающим вашу точку) и поставить им следующую задачу:
"Необходимо изменить параметры работы терминала в базе Сбербанка для печати двух копий слип-чеков на фискальном регистраторе (ККТ), подключенном к хосту (компьютеру), а не на самом терминале."
После того как инженер изменит настройки на стороне хоста Сбера, выполните на терминале операцию сверки итогов или загрузки параметров (команда LoadParm.exe) для применения изменений.
Если вы имеете доступ к папке с банковским ПО (обычно это C:\sc552), мы можем самостоятельно проверить и изменить некоторые критически важные параметры в файле конфигурации pinpad.ini. Разберем по шагам назначение этих параметров:
pinpad.ini с помощью текстового редактора (например, Блокнот) от имени администратора.PrinterFile. Этот параметр указывает драйверу записывать образ чека во внешний текстовый файл.
PrinterFile=p
p (без расширения) в той же рабочей папке.PrinterEnd. Он отвечает за символ окончания печати и отрезки чека.
PrinterEnd=01 или PrinterEnd=010D0A.pinpad.ini.Если Сбербанк упорно отказывается возвращать массив строк через COM-интерфейс (что часто бывает с новыми версиями библиотек), но при этом успешно создает файл чека благодаря параметру PrinterFile=p, мы можем доработать код в 1С для чтения чека напрямую из этого файла. Этот способ является крайне надежным и гарантирует результат.
Рассмотрим, как реализовать этот алгоритм в коде 1С:
// Задаем путь к файлу чека, настроенному в pinpad.ini
ПутьКРабочейПапке = "C:\sc552\";
ИмяФайлаЧека = ПутьКРабочейПапке + "p";
ФайлНаДиске = Новый Файл(ИмяФайлаЧека);
Если ФайлНаДиске.Существует() Тогда
// Создаем текстовый документ для чтения чека
ТекстовыйДок = Новый ТекстовыйДокумент;
// Сбербанк обычно выгружает текст в кодировке OEM (DOS)
ТекстовыйДок.Прочитать(ИмяФайлаЧека, КодировкаТекста.OEM);
КоличествоСтрок = ТекстовыйДок.КоличествоСтрок();
Если КоличествоСтрок > 0 Тогда
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = ТекстовыйДок.ПолучитьСтроку(НомерСтроки);
// Отправляем строку на фискальный регистратор
ФискальныйРегистратор.НапечататьНефискальнуюСтроку(ТекущаяСтрока);
КонецЦикла;
// Отрезаем ленту
ФискальныйРегистратор.ОтрезатьДокумент();
КонецЕсли;
// Обязательно удаляем временный файл чека, чтобы избежать наложения при следующих оплатах
Попытка
УдалитьФайлы(ИмяФайлаЧека);
Исключение
ЗаписатьВЛог("Не удалось удалить временный файл слип-чека: " + ОписаниеОшибки());
КонецПопытки;
Иначе
ЗаписатьВЛог("Файл слип-чека не обнаружен по пути: " + ИмяФайлаЧека);
КонецЕсли;
Обратите внимание на версию регистрируемой библиотеки SBRFCOM.dll. Существуют две основные разновидности этой компоненты:
ОплатитьПлатежнойКартой принимает 3 параметра.Если в вашей конфигурации 1С обработка обслуживания ожидает новую версию библиотеки с 7 параметрами, а в системе зарегистрирована старая (или наоборот), то вызовы методов будут завершаться ошибками или возвращать пустые (нулевые) результаты. Убедитесь, что библиотека зарегистрирована правильно в операционной системе через утилиту regsvr32:
Выполните в командной строке (cmd) от имени администратора следующие команды для перерегистрации библиотек:
regsvr32 /u "C:\sc552\SBRFCOM.dll" (снятие старой регистрации)regsvr32 "C:\sc552\SBRFCOM.dll" (регистрация актуальной версии)regsvr32 "C:\sc552\sbrf.dll"Также помните о разрядности платформы 1С. Если вы используете 32-разрядный клиент 1С (что стандартно для обычных форм), библиотеки Сбербанка также должны быть 32-разрядными.
Если у вас есть доступ к сервисной утилите TlvEdit (которая часто поставляется инженерам Сбербанка для настройки шаблонов чеков), проверьте внутреннюю конфигурацию терминала:
PrinterEnd в файле pinpad.ini.Если вы устали бороться со сбоями COM-соединения и регистрацией библиотек SBRFCOM.dll в Windows, рассмотрите возможность перехода на работу через консольную утилиту sb_pilot.exe. Это современный стандарт интеграции Сбербанка, поддерживаемый БПО (Библиотекой подключаемого оборудования 1С):
sb_pilot.exe с параметрами операции (тип операции, сумма).e, p) в своей папке.Для перехода на этот метод достаточно обновить обработку обслуживания эквайринга в 1С на ту, которая поддерживает работу через драйвер "СБ РФ: Эквайринговые терминалы" нового образца. Для этой задачи подойдёт обработка обслуживания эквайринговых терминалов Сбербанка на новом драйвере для УТ 10.x.