Почему терминал эквайринга сам закрывает смену и как это исправить в 1С

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

При работе с автоматизированным эквайрингом (особенно часто это встречается у терминалов Сбербанка) программисты и кассиры сталкиваются с неприятной ситуацией: суммы оплат по картам внезапно «пропадают» из итоговой сверки в конце рабочего дня. При этом банк подтверждает, что транзакции прошли успешно. Разберем подробно, почему это происходит, как диагностировать проблему с помощью логов и какие программные методы помогут сохранить данные.

Выясняем причину: почему суммы исчезают из сверки

Проанализируем ситуацию: если в 1С операция прошла, а в итоговом отчете (сверке итогов) ее нет, это означает, что на терминале уже произошло закрытие смены (сверка) до того, как пользователь нажал кнопку в программе. Рассмотрим основные причины такого поведения:

  1. Автосверка на стороне банка (Host-initiated Reconciliation): Это самая частая причина. Банковский хост настроен на принудительное закрытие смены в определенное время (например, в 21:00). Если магазин работает до 22:00, то операции после девяти вечера попадут в следующую смену, а операции до этого времени уже будут «сброшены».
  2. Настройки самого терминала: В параметрах pinpad.ini или внутренних настройках аппарата (особенно если оборудование куплено на маркетплейсе) может быть активна функция автоматического закрытия при достижении определенного лимита времени или количества операций.
  3. Человеческий фактор: Продавец мог запустить сверку вручную непосредственно на терминале (через меню аппарата), минуя интерфейс 1С, например, если закончилась бумага или произошел сбой печати.

Диагностика с помощью драйвера и программного кода

Для начала нам нужно понять, что именно «видит» терминал. Если аппарат не печатает контрольную ленту, мы можем попытаться получить текст последнего чека или сверки программно. Рассмотрим, как это сделать, используя объект драйвера Сбербанка через COM-подключение SBRFSRV.Server. При необходимости можно использовать инструмент для управления эквайринговым терминалом Сбербанка.

Воспользуемся следующим примером кода для получения текста слип-чека последней операции или сверки:


// Создаем объект драйвера
ОбъектДрайвера = Новый COMОбъект("SBRFSRV.Server");

// Очищаем буфер данных перед запросом
ОбъектДрайвера.clear(); 

// Вызываем функцию NFun с кодом 7000 (запрос контрольной ленты/итогов)
// Или код 7001 для повторного формирования последнего чека
Результат = ОбъектДрайвера.NFun(7000);

// Извлекаем текст чека из параметров драйвера
СлипЧек = ОбъектДрайвера.GParamString("Cheque");

// Выводим результат для анализа
Сообщить(СлипЧек);

Проанализируем коды функций NFun, которые могут быть полезны при диагностике:

Анализ системных логов и временных файлов

Если программный вызов не дает полной картины, обратимся к файлам, которые драйвер создает в процессе работы. Обычно они располагаются в папке с компонентами эквайринга (например, C:\sc552\ или в папке профиля пользователя).

1. Файл sbkernel.txt (или аналогичные логи): Это основной лог работы ядра эквайринга. Рассмотрим, как его анализировать. Откроем файл и воспользуемся поиском по строке Command = 6000. Это команда сверки итогов. По времени записи в логе мы сможем точно определить, когда запускалась сверка — в момент закрытия Z-отчета из 1С или самопроизвольно в другое время.

2. Файл p (без расширения): Драйвер Сбербанка часто сбрасывает результат последней команды в файл с коротким именем p. Посмотрим на его содержимое обычным текстовым редактором — там часто хранится образ последнего сформированного отчета, который не дошел до печати.

3. Использование утилиты loadparm.exe: Эта сервисная утилита позволяет взаимодействовать с терминалом напрямую. Разберем полезные команды:

Решение проблемы и рекомендации по доработке 1С

После того как мы выяснили, что причиной является автоматическая сверка банка (например, ровно в полночь или в фиксированное время), нам необходимо предпринять следующие шаги:

Шаг 1: Обращение в банк. Нужно позвонить в службу технической поддержки эквайринга и попросить отключить «автосверку на хосте» или перенести ее на глубокую ночь (например, на 04:00), когда торговая точка точно не работает. Это позволит 1С быть «главным» инициатором закрытия смены.

Шаг 2: Программное сохранение чеков в 1С. Рассмотрим ситуацию, когда сверка все же прошла, а отчет не распечатался. Чтобы данные не пропадали бесследно, рекомендуется доработать механизм интеграции в 1С. Проанализируем логику: при выполнении каждой операции (оплата, отмена, сверка) необходимо сохранять текст, полученный через GParamString("Cheque"), в специальный справочник или регистр сведений в базе данных. Для решения этой задачи можно воспользоваться готовым механизмом сохранения и хранения слип-чеков эквайринга в 1С.

Пример анализа структуры метаданных для хранения данных:

Шаг 3: Обработка ошибок в коде. Часто кассиры пугаются сообщения «Нет транзакций в памяти» при закрытии смены в 1С. Это происходит, если автосверка уже отработала. Нам следует добавить в код обработки обслуживания проверку: если команда сверки возвращает ошибку «Нет данных», но лог терминала подтверждает успешную связь, не нужно блокировать закрытие смены в 1С, достаточно просто вывести информационное сообщение.

Заключение

Подведем итог: самопроизвольное закрытие смены — это почти всегда результат настроек банковского сервера. С помощью анализа лога sbkernel.txt и использования команд NFun(7000) мы можем доказать факт вмешательства внешних настроек. Самым надежным способом защиты данных является логирование всех банковских ответов внутри 1С и согласование времени автосверки с техническими специалистами банка.

← На главную