В процессе работы торговых точек кассирам часто требуется сверить промежуточные итоги по безналичным расчетам. В фискальных регистраторах (ККТ) для этих целей предусмотрен стандартный Х-отчет, который показывает текущую выручку, но не закрывает смену. Однако на эквайринговых терминалах штатная кнопка 1С «Сверка итогов» отправляет команду полного закрытия смены (аналог Z-отчета). После этого транзакции «захлопываются», и продолжить работу в рамках той же банковской смены становится невозможно.
В этой статье мы подробно разберем, как обойти это ограничение и программно вызвать сводный чек (промежуточный отчет по картам без закрытия смены) непосредственно из конфигурации «1С:Предприятие».
Сводный чек — это документ, который запрашивает у банка-эквайера информацию о суммах и количестве транзакций за текущую смену, но оставляет ее открытой. Это критически важно для сверки кассы в середине дня или при пересменке кассиров.
Большинство терминалов Сбербанка и других крупных банков работают на базе программного обеспечения Pilot (папка C:\sc552 на рабочем компьютере). Управление терминалом осуществляется либо через консольную утилиту loadparm.exe, либо через динамическую библиотеку (COM-объект) sbrfcom.dll.
Система Pilot поддерживает следующие основные коды команд:
Рассмотрим детально три практических варианта реализации этой функции в 1С.
Если терминал подключен к компьютеру локально и настроен на файловый обмен через каталог по умолчанию (например, C:\sc552), самым простым и надежным способом является прямой запуск консольного приложения с нужным параметром.
Разберем по шагам, как написать процедуру вызова сводного отчета:
Процедура НапечататьСводныйЧекНаТерминале() Экспорт
ПутьКУтилите = "C:\sc552\loadparm.exe";
ПараметрыЗапуска = "9"; // Команда снятия сводного чека без закрытия смены
РабочаяДиректория = "C:\sc552";
ФайлУтилиты = Новый Файл(ПутьКУтилите);
Если Не ФайлУтилиты.Существует() Тогда
ВызватьИсключение "Утилита loadparm.exe не найдена по указанному пути!";
КонецЕсли;
// Запускаем приложение в синхронном режиме (Истина), чтобы дождаться окончания операции
Попытка
ЗапуститьПриложение(ПутьКУтилите + " " + ПараметрыЗапуска, РабочаяДиректория, Истина);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при запуске утилиты эквайринга: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Анализируем результат работы
ПроверитьИРаспечататьРезультатФайла();
КонецПроцедуры
Важный нюанс: при вызове этой команды терминал может либо распечатать чек на собственном встроенном принтере (если он есть), либо сбросить текстовый образ чека в файл с именем p (без расширения) в своей рабочей папке. Во втором случае мы можем прочитать этот файл в 1С и отправить его на печать через обычный фискальный регистратор (ККТ):
Процедура ПроверитьИРаспечататьРезультатФайла()
ПутьКФайлуРепорта = "C:\sc552\p";
ФайлРепорта = Новый Файл(ПутьКФайлуРепорта);
Если ФайлРепорта.Существует() Тогда
ТекстОтчета = Новый ТекстовыйДокумент;
// Файлы от терминалов Сбербанка обычно формируются в кодировке OEM (DOS)
ТекстОтчета.Прочитать(ПутьКФайлуРепорта, КодировкаТекста.OEM);
// Передаем текст в макет или отправляем построчно на принтер чеков/ККТ
Для НомерСтроки = 1 По ТекстОтчета.КоличествоСтрок() Цикл
ТекущаяСтрока = ТекстОтчета.ПолучитьСтроку(НомерСтроки);
// Здесь вызывается метод печати нефискальной строки вашей ККТ
// Например: ПолучитьОбъектДрайвераККТ().НапечататьТекст(ТекущаяСтрока);
КонецЦикла;
// Удаляем временный файл отчета после успешной печати
Попытка
УдалитьФайлы(ПутьКФайлуРепорта);
Исключение
// Логируем ошибку доступа к файлу при необходимости
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Если в вашей системе драйвер эквайринга Сбербанка зарегистрирован в Windows как COM-компонент, мы можем обращаться к его функциям напрямую через объект Sberbank.SberBNS. Этот метод быстрее, так как не требует запуска сторонних процессов операционной системы.
Проанализируем пример кода для работы через COM-соединение:
Процедура ПечатьСводногоОтчетаЧерезCOM() Экспорт
Попытка
// Инициализируем COM-объект драйвера
ДрайверТерминала = Новый COMОбъект("Sberbank.SberBNS");
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Не удалось подключить библиотеку sbrfcom.dll. " +
"Убедитесь, что она зарегистрирована в системе через regsvr32."
);
Возврат;
КонецПопытки;
// Вызываем метод NFun с кодом команды 9 (Сводный чек)
// Метод возвращает 0 при успешном выполнении
РезультатКоманды = ДрайверТерминала.NFun(9);
Если РезультатКоманды <> 0 Тогда
ПоказатьПредупреждение(, "Терминал вернул ошибку выполнения операции. Код ошибки: " + Строка(РезультатКоманды));
Иначе
ПоказатьОповещениеПользователя("Успешно", , "Запрос сводного чека выполнен.", КартинкаОсобоеСобытие);
КонецЕсли;
КонецПроцедуры
Для вывода детальной контрольной ленты (списка всех транзакций) вы можете аналогичным образом вызвать метод NFun(91).
В современных конфигурациях 1С (таких как «1С:Розница 3.0», «1С:УНФ», «1С:УТ 11») все терминалы подключаются через стандартизированные драйверы БПО. В интерфейсе драйверов предусмотрен универсальный метод для выполнения нетиповых команд: ВыполнитьДополнительнуюОперацию.
Чтобы не изменять конфигурацию базы данных и сохранить ее на поддержке, правильнее всего создать расширение конфигурации или внешнюю обработку, которая будет добавлять кнопку в форму РМК (Рабочего места кассира).
Разберем логику вызова операции через БПО:
&НаКлиенте
Процедура ВыполнитьСводныйОтчетБПО(ИдентификаторУстройства)
// Подготавливаем параметры для выполнения операции на терминале
ПараметрыОперации = Новый Массив;
ПараметрыОперации.Добавить("9"); // Код команды для Сбербанка (Сводный чек)
ВыходныеПараметры = Новый Массив;
// Вызываем метод БПО для работы с оборудованием
Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(
ИдентификаторУстройства,
"ExecuteAdditionalOperation",
ПараметрыОперации,
ВыходныеПараметры
);
Если НЕ Результат Тогда
// Ошибка выполнения команды на терминале
ТекстОшибки = "";
МенеджерОборудованияКлиент.ПолучитьОшибку(ТекстОшибки);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось снять отчет: " + ТекстОшибки);
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает корректную работу с терминалами различных производителей (не только Сбербанка, но и INPAS, UCS и др.), так как БПО транслирует универсальный вызов в соответствующий низкоуровневый протокол конкретного драйвера устройства.