Как вызвать сводный чек на эквайринговом терминале из 1С без закрытия смены?

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

В процессе работы торговых точек кассирам часто требуется сверить промежуточные итоги по безналичным расчетам. В фискальных регистраторах (ККТ) для этих целей предусмотрен стандартный Х-отчет, который показывает текущую выручку, но не закрывает смену. Однако на эквайринговых терминалах штатная кнопка 1С «Сверка итогов» отправляет команду полного закрытия смены (аналог Z-отчета). После этого транзакции «захлопываются», и продолжить работу в рамках той же банковской смены становится невозможно.

В этой статье мы подробно разберем, как обойти это ограничение и программно вызвать сводный чек (промежуточный отчет по картам без закрытия смены) непосредственно из конфигурации «1С:Предприятие».

Зачем нужен сводный чек и как это работает на уровне терминала

Сводный чек — это документ, который запрашивает у банка-эквайера информацию о суммах и количестве транзакций за текущую смену, но оставляет ее открытой. Это критически важно для сверки кассы в середине дня или при пересменке кассиров.

Большинство терминалов Сбербанка и других крупных банков работают на базе программного обеспечения Pilot (папка C:\sc552 на рабочем компьютере). Управление терминалом осуществляется либо через консольную утилиту loadparm.exe, либо через динамическую библиотеку (COM-объект) sbrfcom.dll.

Система Pilot поддерживает следующие основные коды команд:

  1. 7 — Сверка итогов (смена закрывается).
  2. 9 — Сводный чек (краткий отчет по типам карт без закрытия смены).
  3. 9 1 — Контрольная лента (детализированный отчет по каждой транзакции без закрытия смены).
  4. 9 2 — История закрытых смен.

Рассмотрим детально три практических варианта реализации этой функции в 1С.

Вариант 1. Прямой вызов утилиты loadparm.exe

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

Разберем по шагам, как написать процедуру вызова сводного отчета:


Процедура НапечататьСводныйЧекНаТерминале() Экспорт

    ПутьКУтилите = "C:\sc552\loadparm.exe";
    ПараметрыЗапуска = "9"; // Команда снятия сводного чека без закрытия смены
    РабочаяДиректория = "C:\sc552";

    ФайлУтилиты = Новый Файл(ПутьКУтилите);
    Если Не ФайлУтилиты.Существует() Тогда
        ВызватьИсключение "Утилита loadparm.exe не найдена по указанному пути!";
    КонецЕсли;

    // Запускаем приложение в синхронном режиме (Истина), чтобы дождаться окончания операции
    Попытка
        ЗапуститьПриложение(ПутьКУтилите + " " + ПараметрыЗапуска, РабочаяДиректория, Истина);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при запуске утилиты эквайринга: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    // Анализируем результат работы
    ПроверитьИРаспечататьРезультатФайла();

КонецПроцедуры

Важный нюанс: при вызове этой команды терминал может либо распечатать чек на собственном встроенном принтере (если он есть), либо сбросить текстовый образ чека в файл с именем p (без расширения) в своей рабочей папке. Во втором случае мы можем прочитать этот файл в 1С и отправить его на печать через обычный фискальный регистратор (ККТ):


Процедура ПроверитьИРаспечататьРезультатФайла()

    ПутьКФайлуРепорта = "C:\sc552\p";
    ФайлРепорта = Новый Файл(ПутьКФайлуРепорта);

    Если ФайлРепорта.Существует() Тогда
        ТекстОтчета = Новый ТекстовыйДокумент;
        // Файлы от терминалов Сбербанка обычно формируются в кодировке OEM (DOS)
        ТекстОтчета.Прочитать(ПутьКФайлуРепорта, КодировкаТекста.OEM);
        
        // Передаем текст в макет или отправляем построчно на принтер чеков/ККТ
        Для НомерСтроки = 1 По ТекстОтчета.КоличествоСтрок() Цикл
            ТекущаяСтрока = ТекстОтчета.ПолучитьСтроку(НомерСтроки);
            // Здесь вызывается метод печати нефискальной строки вашей ККТ
            // Например: ПолучитьОбъектДрайвераККТ().НапечататьТекст(ТекущаяСтрока);
        КонецЦикла;
        
        // Удаляем временный файл отчета после успешной печати
        Попытка
            УдалитьФайлы(ПутьКФайлуРепорта);
        Исключение
            // Логируем ошибку доступа к файлу при необходимости
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Вариант 2. Использование COM-объекта библиотеки sbrfcom.dll

Если в вашей системе драйвер эквайринга Сбербанка зарегистрирован в Windows как COM-компонент, мы можем обращаться к его функциям напрямую через объект Sberbank.SberBNS. Этот метод быстрее, так как не требует запуска сторонних процессов операционной системы.

Проанализируем пример кода для работы через COM-соединение:


Процедура ПечатьСводногоОтчетаЧерезCOM() Экспорт

    Попытка
        // Инициализируем COM-объект драйвера
        ДрайверТерминала = Новый COMОбъект("Sberbank.SberBNS");
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            "Не удалось подключить библиотеку sbrfcom.dll. " +
            "Убедитесь, что она зарегистрирована в системе через regsvr32."
        );
        Возврат;
    КонецПопытки;

    // Вызываем метод NFun с кодом команды 9 (Сводный чек)
    // Метод возвращает 0 при успешном выполнении
    РезультатКоманды = ДрайверТерминала.NFun(9);

    Если РезультатКоманды <> 0 Тогда
        ПоказатьПредупреждение(, "Терминал вернул ошибку выполнения операции. Код ошибки: " + Строка(РезультатКоманды));
    Иначе
        ПоказатьОповещениеПользователя("Успешно", , "Запрос сводного чека выполнен.", КартинкаОсобоеСобытие);
    КонецЕсли;

КонецПроцедуры

Для вывода детальной контрольной ленты (списка всех транзакций) вы можете аналогичным образом вызвать метод NFun(91).

Вариант 3. Реализация через БПО (Библиотеку подключаемого оборудования)

В современных конфигурациях 1С (таких как «1С:Розница 3.0», «1С:УНФ», «1С:УТ 11») все терминалы подключаются через стандартизированные драйверы БПО. В интерфейсе драйверов предусмотрен универсальный метод для выполнения нетиповых команд: ВыполнитьДополнительнуюОперацию.

Чтобы не изменять конфигурацию базы данных и сохранить ее на поддержке, правильнее всего создать расширение конфигурации или внешнюю обработку, которая будет добавлять кнопку в форму РМК (Рабочего места кассира).

Разберем логику вызова операции через БПО:


&НаКлиенте
Процедура ВыполнитьСводныйОтчетБПО(ИдентификаторУстройства)

    // Подготавливаем параметры для выполнения операции на терминале
    ПараметрыОперации = Новый Массив;
    ПараметрыОперации.Добавить("9"); // Код команды для Сбербанка (Сводный чек)
    
    ВыходныеПараметры = Новый Массив;
    
    // Вызываем метод БПО для работы с оборудованием
    Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(
        ИдентификаторУстройства, 
        "ExecuteAdditionalOperation", 
        ПараметрыОперации, 
        ВыходныеПараметры
    );
    
    Если НЕ Результат Тогда
        // Ошибка выполнения команды на терминале
        ТекстОшибки = "";
        МенеджерОборудованияКлиент.ПолучитьОшибку(ТекстОшибки);
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось снять отчет: " + ТекстОшибки);
    КонецЕсли;

КонецПроцедуры

Такой подход обеспечивает корректную работу с терминалами различных производителей (не только Сбербанка, но и INPAS, UCS и др.), так как БПО транслирует универсальный вызов в соответствующий низкоуровневый протокол конкретного драйвера устройства.

← На главную