При работе с автоматизированным эквайрингом (особенно часто это встречается у терминалов Сбербанка) программисты и кассиры сталкиваются с неприятной ситуацией: суммы оплат по картам внезапно «пропадают» из итоговой сверки в конце рабочего дня. При этом банк подтверждает, что транзакции прошли успешно. Разберем подробно, почему это происходит, как диагностировать проблему с помощью логов и какие программные методы помогут сохранить данные.
Проанализируем ситуацию: если в 1С операция прошла, а в итоговом отчете (сверке итогов) ее нет, это означает, что на терминале уже произошло закрытие смены (сверка) до того, как пользователь нажал кнопку в программе. Рассмотрим основные причины такого поведения:
pinpad.ini или внутренних настройках аппарата (особенно если оборудование куплено на маркетплейсе) может быть активна функция автоматического закрытия при достижении определенного лимита времени или количества операций.Для начала нам нужно понять, что именно «видит» терминал. Если аппарат не печатает контрольную ленту, мы можем попытаться получить текст последнего чека или сверки программно. Рассмотрим, как это сделать, используя объект драйвера Сбербанка через COM-подключение SBRFSRV.Server. При необходимости можно использовать инструмент для управления эквайринговым терминалом Сбербанка.
Воспользуемся следующим примером кода для получения текста слип-чека последней операции или сверки:
// Создаем объект драйвера
ОбъектДрайвера = Новый COMОбъект("SBRFSRV.Server");
// Очищаем буфер данных перед запросом
ОбъектДрайвера.clear();
// Вызываем функцию NFun с кодом 7000 (запрос контрольной ленты/итогов)
// Или код 7001 для повторного формирования последнего чека
Результат = ОбъектДрайвера.NFun(7000);
// Извлекаем текст чека из параметров драйвера
СлипЧек = ОбъектДрайвера.GParamString("Cheque");
// Выводим результат для анализа
Сообщить(СлипЧек);
Проанализируем коды функций NFun, которые могут быть полезны при диагностике:
6000 — Итоги дня по картам (сводный отчет).7000 — Формирование контрольной ленты.7001 — Повтор последнего чека.Если программный вызов не дает полной картины, обратимся к файлам, которые драйвер создает в процессе работы. Обычно они располагаются в папке с компонентами эквайринга (например, C:\sc552\ или в папке профиля пользователя).
1. Файл sbkernel.txt (или аналогичные логи): Это основной лог работы ядра эквайринга. Рассмотрим, как его анализировать. Откроем файл и воспользуемся поиском по строке Command = 6000. Это команда сверки итогов. По времени записи в логе мы сможем точно определить, когда запускалась сверка — в момент закрытия Z-отчета из 1С или самопроизвольно в другое время.
2. Файл p (без расширения): Драйвер Сбербанка часто сбрасывает результат последней команды в файл с коротким именем p. Посмотрим на его содержимое обычным текстовым редактором — там часто хранится образ последнего сформированного отчета, который не дошел до печати.
3. Использование утилиты loadparm.exe: Эта сервисная утилита позволяет взаимодействовать с терминалом напрямую. Разберем полезные команды:
loadparm 9 1 — позволяет получить X-отчет (просмотр итогов без закрытия смены). Это поможет проверить суммы в течение дня.loadparm 9 2 — позволяет выбрать и просмотреть конкретные итоги из памяти терминала.После того как мы выяснили, что причиной является автоматическая сверка банка (например, ровно в полночь или в фиксированное время), нам необходимо предпринять следующие шаги:
Шаг 1: Обращение в банк. Нужно позвонить в службу технической поддержки эквайринга и попросить отключить «автосверку на хосте» или перенести ее на глубокую ночь (например, на 04:00), когда торговая точка точно не работает. Это позволит 1С быть «главным» инициатором закрытия смены.
Шаг 2: Программное сохранение чеков в 1С. Рассмотрим ситуацию, когда сверка все же прошла, а отчет не распечатался. Чтобы данные не пропадали бесследно, рекомендуется доработать механизм интеграции в 1С. Проанализируем логику: при выполнении каждой операции (оплата, отмена, сверка) необходимо сохранять текст, полученный через GParamString("Cheque"), в специальный справочник или регистр сведений в базе данных. Для решения этой задачи можно воспользоваться готовым механизмом сохранения и хранения слип-чеков эквайринга в 1С.
Пример анализа структуры метаданных для хранения данных:
Шаг 3: Обработка ошибок в коде. Часто кассиры пугаются сообщения «Нет транзакций в памяти» при закрытии смены в 1С. Это происходит, если автосверка уже отработала. Нам следует добавить в код обработки обслуживания проверку: если команда сверки возвращает ошибку «Нет данных», но лог терминала подтверждает успешную связь, не нужно блокировать закрытие смены в 1С, достаточно просто вывести информационное сообщение.
Подведем итог: самопроизвольное закрытие смены — это почти всегда результат настроек банковского сервера. С помощью анализа лога sbkernel.txt и использования команд NFun(7000) мы можем доказать факт вмешательства внешних настроек. Самым надежным способом защиты данных является логирование всех банковских ответов внутри 1С и согласование времени автосверки с техническими специалистами банка.