Настройка системы для работы со Спасибо (Новый вариант)
Последнее изменение статьи 04.04.2026
СберСпасибо работает в одно прикладывание карты. Для списания бонусов гостю надо только оплатить заказ и согласиться на списание бонусов, повторно прикладывать карту не надо.
- Работает только с Чеками Намерения
- Работает только с терминалом, интегрированным с кассой r_keeper
- Новую библиотеку можно скачать на FTP
- Поддержано с версии r_keeper 7.26.04. Работа с версией ниже описана в статье Система лояльности Спасибо от Сбербанка (Старый вариант)
Подключение терминала
Прием платежей по банковским картам производится через терминал авторизации. Произведите предварительную настройку терминала:
- Установите драйвер самого терминала (его можно найти на сайте продавца или производителя)

- Получите от представителей Сбера требуемое ПО (как правило, при заключении договора представитель Сбера сразу производит установку терминала и дополнительного ПО, но также можно обратиться в отдел обслуживания по предоставленным в договоре контактам)
- Обратитесь к сотруднику Сбера для выставления настройки Возвращать промежуточный код ответа
- В корне рабочего каталога в pilot_nt.dll в файле pinpad.ini укажите COM-порт терминала (номер COM-порта можно посмотреть в диспетчере устройств)

Установка и конфигурирование Farcards и ExtSpasiboPurchase.dll
Установка сертификата для работы с ПЦ
Представителями Сбера будут выданы сертификаты, отдельные для каждой точки подключения. Их необходимо установить.
Мы разберем установку для ОС Windows 10. Пути к сертификатам и названия файлов сертификатов могут отличаться.
Установка корневых и промежуточных сертификатов:
- Перейдите к корневым и промежуточным сертификатам. Нажмите правой кнопкой мыши на сертификате и выберите Установить сертификат

- Выберите расположение хранилища, куда будет установлен сертификат

- Для каждого сертификата выберите соответствующее сертификату хранилище


- Нажмите Готово для завершения импорта сертификата.

- Дождитесь подтверждения импорта.

Готово. Повторите процесс для каждого предоставленного Сбером сертификата.
Установка личного сертификата:
- Перейдите к личным сертификатам. Нажмите правой кнопкой мыши на сертификате и выберите Установить PFX

- Выберите расположение хранилища, куда будет установлен сертификат

- Выберите файл сертификата

- Укажите пароль, предоставленный Сбером и нажмите Далее

- Хранилище сертификатов для данного сертификата выбирать не надо, система определит его автоматически

Нажмите Готово и завершите импорт.

Настройка Farcards
Для работы Спасибо необходим установленный Farcards. Он может быть установлен на отдельном компьютере или на том же, что и кассовый сервер.
Подробную инструкцию по установке FarCards можно найти в статье установка и настройка системы ПДС
- Скачайте актуальную версию ExtSpasiboPurchase по ссылке https://files-rkcloud.ucs.ru/d/65231391cff842d49a1a/?p=/rk7/other/Spasibo&mode=list
- Распакуйте сборку и скорректируйте содержимое в соответствии с настройками своего ПК:
FARCARDS.ini
[FarServer] Type = 1 DLL = .\ExtSpasiboPurchase.dll Log = 10 XMLCP=1251 [LinkDLL] 1 = pds_netk [pds_netk] NetServerName = Spasibo ininame=netk.ini DebugMessages=1D- Также скопируйте в этот каталог файл с сертификатом .pfx, предоставленный Сбером.
Настройка конфигурационного файла appsettings.json
Перед настройкой необходимо знать:
- PartnerId — идентификатор ТСП (юр.лица) в ПЦ
- TerminalId — внешний идентификатор терминала
- ServicePointExtId — внешний идентификатор торговой точки
- NetworkId — идентификатор Сети в ПЦ
- URL — URL сервера.
Настройка appsettings.json:
appsettings.json
{
"Spasibo": {
"Url": "URL сервера",
//Идентификатор ТСП (юр.лица) в ПЦ, осуществляющего продажу
"PartnerId": "Идентификатор ТСП (юр.лица) в ПЦ",
"Terminal": "Внешний идентификатор терминала",
"ServicePointExtId": "Внешний идентификатор торговой точки",
//Идентификатор Сети в ПЦ.
"Network": "Идентификатор Сети в ПЦ",
"CertPassword": "Пароль сертификата",
"CertFile": "Имя файла с сертификатом .pfx",
// Общий таймаут каждой операции FarCards лояльности СПАСИБО в мс
"OperationTimeout": 30000,
//Период выгрузки очередей, с
"QueueFlushPeriod": 60,
//Cписок кодов ошибок HTTP status code, по которым должна выполняться перепосылка запросов в RESTful-сервисы
"RestRetryErrors": [ "500", "503", "504", "422 PURCHASE_STATUS_NOT_VALID" ],
// необязательное переназначение терминалов на код станции. Если не удалось найти соответствие, то берется из параметра Terminal
"Terminals": {
"TerminalName1: [ 8, 9 ],
"TerminalName2": [ 10, 11 ]
},
// необязательное переназначение . Если не удалось найти соответствие, то берется из параметра ServicePointExtId
"ServicePoints": {
"ServicePoint1": [ 199990111],
"ServicePoint2": [ 199990112]
}
},
"Config": {
//код валюты "Спасибо"
"SpasiboPayCode": 126,
//Международный ISO-код валюты чека (810 - Российский рубль)
"Currency": "810",
//Если задан, то использовать код документа, отличный от по-умолчанию 101
"PrintDocumentCode": 101
}
}
Настройки в менеджерской r_keeper
Добавление устройства "Spasibo from Sberbank"
В конфигурацию кассового сервера добавьте устройство Spasibo from Sberbank со следующими настройками:
где PDS Server Name — имя, которое назначили NetServerName, настраивая FARCARDS.ini:
Настройка интерфейса
В справочнике Интерфейсы проверьте, что устройство Spasibo from Sberbank выбрано для предустановленного интерфейса СберСпасибо.
Создание MCR-алгоритма
Создайте и настройте MCR-алгоритм:
- В качестве Объекта назначьте предустановленный интерфейс СберСпасибо (код 129)

- В качестве Скрипта укажите:
function MCR1001331(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean; begin Result := (pos('SBRF:', Parameter) = 1) and (length(Parameter) > 6); if Result then begin delete(Parameter, 1, 5); if Parameter[1] = 'H' then delete(Parameter, 1, 1); end; end;JSON
Настройка драйвера терминала авторизации
- Path to pilot_nt — путь до каталога с ПО Сбербанка (пусть установки терминала)
- Log level — при наличии проблем с работой можно выводить полный лог для локализации, но при нормальной работе рекомендуется указывать только ошибки
- RemindLoyalty — установите значение WithPayPass
- Остальные параметры настраиваем, как указано на рисунке:

В качестве модуля у принтера укажите Sberbank Pilot POS terminal driver (XML) #1.
В свойствах кассы Терминалу авторизации назначьте принтер устройства банковского терминала.
В свойствах валюты для оплаты банковской картой поставьте флаг Использовать терминал и укажите назначение терминала авторизации.
Создание валюты для оплаты бонусами СберСпасибо
Для оплаты бонусами СберСпасибо надо создать отдельную валюту, в свойстве Интерфейс которой указать предустановленный интерфейс СберСпасибо (код 129)
Добавление скрипта в формы
Использовать списание бонусов можно как в быстром чеке (в форме Редактирование заказа (быстрый чек)), так и в заказе с обслуживанием (в форме Редактирование заказа).
- Выберите предустановленную форму, где предполагается использовать функционал. Создайте её копию и переименуйте, для удобства дальнейшей работы.

- Откройте редактирование формы. Выделите компонент CheckView и добавьте скрипт событию для OnOrderVerify:
1
2ifAVerifyType = vtAfterPay thenCheckLoyaltyOnAuthorization;
- Затем поднимитесь в самое начало скриптера и вставьте следующий список процедур и функций:здесь:
const minordersum = 250; const SpasiboCurrencyCode = 126; const RESERVE_VALUE = 1.0; function ExtractPartFromExtTransactionInfo(ExtTransactionInfo:String; PartName:String):String; var i:Integer; s:string; begin i:=pos(PartName,ExtTransactionInfo); if i>1 then begin i:=pos('/'+PartName,ExtTransactionInfo); if i>0 then i:=i+1; end; if i=0 then s:='' else begin s:=copy(ExtTransactionInfo,i+length(PartName),65535); i:=pos('/',s); if i>0 then SetLength(s,i-1); end; Result:=s; end; procedure PerformLoyalyMCR(PayLine: TPayLine); var i: integer; CardCode: string; FirstNumbers:String; LastNumbers:String; BankName:String; begin CardCode := ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'PdsCard='); i:=pos(';',CardCode); if i > 0 then begin LastNumbers:=copy(CardCode,i+1,255); SetLength(CardCode, i-1); end else LastNumbers:=''; FirstNumbers:=PayLine.CardNum; i:=pos('*',PayLine.CardNum); if i>0 then SetLength(FirstNumbers, i-1); BankName:=ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'BANK:'); // Slide a spasibo card // gui.ShowMessage('PerformMcrAlgorithSilent '+BankName+':'+CardCode+';'+LastNumbers); RK7.PerformMcrAlgorithSilent(BankName+':'+CardCode+';'+LastNumbers, 1); end; function PartialSpasiboPay(PayLine: TPayLine; MCRPay: TMCRPay; prepaid: double; toPay: double): boolean; var sourceValue: double; peio: TPayExtraInfoObj; Editor: TNumEditor; CurrCode: integer; payItem: TCheckItem; payBankItem: TPayLine; k: integer; begin Result := False; if RK7.PerformMcrAlgorithSilent('SBRF:#SPEND'+floattostr(toPay)+'#'+McrPay.CardNum, 1) = 2 then begin k := GUI.MessageDlgEx('При списании бонусов Спасибо произошла ошибка', mtInformation, mbYes + mbCancel, 'Оплатить всю сумму банковской картой;Отмена оплаты'); if k <> ID_YES then begin RKCheck.DeleteCheckItem(PayLine); RKCheck.ChangePaymentIntentCorrection(PayLine.PrintCheckItem); RKCheck.CurrentOrder.Recalc(); Result := True; end; exit; end; Editor := TNumEditor(GUI.FindComponentByName('Editor')); peio := payLine.GetExtraInfoObj(); sourceValue := payLine.OriginalSum; CurrCode := PayLine.RefItem.Code; RKCheck.DeleteCheckItem(PayLine); RKCheck.ChangePaymentIntentCorrection(PayLine.PrintCheckItem); RKCheck.CurrentOrder.Recalc(); Editor.Text := FloatToStr(toPay); payItem := RKCheck.CreateCheckItem(rkrefCurrencies, IntToStr(McrPay.Code), McrPay.CardNum); if payItem = nil then exit; TPayLine(payItem).ProcessOneStepIntentReceipt(); Editor.Text := ''; payBankItem := RKCheck.CreatePayLine(CurrCode, sourceValue - toPay, peio); payBankItem.ProcessOneStepIntentReceipt(); rk7.postoperation(rkoBalanceReceipt,0); Result := True; end; function SpasiboOnAuthorize(PayLine: TPayLine):Boolean; var i, k: integer; CardCode: string; it: TCheckItem; McrPay: TMcrPay; prepaid: double; SpasiboExists: boolean; BankName:String; toPay: double; newValStr: string; begin //Exit; //Uncomment me to disable auto write-off SB SPASIBO Result:=False; prepaid := 0; SpasiboExists := False; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if (it.Code = trunc(SpasiboCurrencyCode)) and (it.State <> disDeleted) and (PayLine.seat=TPayLine(it).seat) then SpasiboExists := True; if (it<>PayLine) and (it.State <> disClosed) and (it.State <> disDeleted) and (PayLine.seat=TPayLine(it).seat) then prepaid := prepaid + TPayLine(it).OriginalSum; end; end; if PayLine = Nil then Exit; BankName:=ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'BANK:'); //отладка gui.showmessage('BankName: '+BankName+' paid='+floattostr(prepaid)+' OriginalSum='+floattostr(PayLine.OriginalSum)+' SpasiboExists='+inttostr(ord(SpasiboExists))); if SpasiboExists or (BankName<>'SBRF') then Exit; if PayLine.OriginalSum < minordersum then begin //gui.showmessage('Сумма оплаты меньше минимальной'); Exit; end; if prepaid>0 then begin //gui.showmessage('Оплата спасибо разрешена только если весь заказ оплачен банковской картой'); exit; end; // Spasibo card code: between "PdsCard=" and "/" CardCode := ExtractPartFromExtTransactionInfo(PayLine.ExtTransactionInfo, 'PdsCard='); if copy(CardCode,1,1)='H' then CardCode := Copy(CardCode, 2, 255); // Slide a spasibo card PerformLoyalyMCR(PayLine); for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.Count - 1 do begin McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Items[i]); // Checking mcr-payment for spasibo card //отладка gui.showmessage('McrPays.CardNum= '+McrPay.CardNum+' McrPay.Amount='+FloatToStr(McrPay.Amount)); if (McrPay.CardNum = CardCode) and (McrPay.Amount >= minordersum - RESERVE_VALUE) then begin toPay := PayLine.OriginalSum - RESERVE_VALUE; if toPay > McrPay.Amount then toPay := McrPay.Amount; k := GUI.MessageDlgEx('Оплата ' +FloatToStr(PayLine.OriginalSum)+ '. Для списания доступно ' + FloatToStr(toPay)+' бонусов' , mtInformation, mbYes + mbCancel, 'Списать '+FloatToStr(toPay)+';Не списывать'); if k = ID_YES then Result := PartialSpasiboPay(PayLine, McrPay, prepaid, toPay); Exit; end; end; // Mcr-pay not found, Result=False end; procedure CheckLoyaltyOnAuthorization; var i:integer; it: TCheckItem; PayLine: TPayLine; begin PayLine := Nil; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if (it.state <> disDeleted) and SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if TPayLine(it).TransactionStatus = tsAuthorizing then PayLine := TPayLine(it) end; end; if PayLine = Nil then Exit; if SpasiboOnAuthorize(PayLine) then exit; RK7.PerformOperation(rkoReAuhorizePay, 0); end;JSON- minordersum = 250 — минимальная сумма заказа, при которой можно использовать оплату баллами Спасибо
- SpasiboCurrencyCode =126 — код валюты для работы с программой Спасибо.
- Модифицированную форму назначьте используемой схеме форм.
Настройка передачи дополнительных атрибутов блюд
Настройка передачи дополнительных атрибутов блюд настраивается по согласованию со Сбером.
По доп.атрибутам ПЦ Сбера сможет понять, что в отношении блюд требуется специфическая обработка (запрет начисления или списания бонусов, повышенное начисление бонусов и т.д.).
По умолчанию настроена передача следующих дополнительных атрибутов:
- genSpasiboBonus — Спасибо: начисление бонусов. Возможные значения:
- noBonus — запрет начисления бонусов
- extraBonus — повышенное начисление бонусов
- genSpasiboSpend — Спасибо: списание бонусов. Возможные значения:
- stopSpend — запрет списания бонусов.
Чтобы включить передачу, активируйте предустановленные элементы:
- В справочнике Перечисляемые свойства в группе Предустановленные/СберСпасибо активируйте значения атрибутов
- В справочнике Расширенные свойства в группе Свойства для справочников/СберСпасибо активируйте сами атрибуты.
При необходимости можно настроить передачу иных атрибутов. Для этого:
- В справочнике Перечисляемые свойства в группе СберСпасибо создайте новый перечисляемый тип

- Создайте значения нового перечисляемого типа. Значения будут являться значениями нового атрибута

- В справочнике Расширенные свойства в группе СберСпасибо создайте новое расширенное свойство.
- задайте системное имя (системное имя расширенного свойства с приставкой gen будет передаваться в качестве названия атрибута)
- укажите тип свойства Value list
- укажите ранее созданный перечисляемый тип

- В списке типов нового расширенного свойства укажите типы объектов, к которым оно будет добавлено (это могут быть как элементы меню, так и другие объекты, такие, как категория заказа)

- Далее в справочнике Интерфейсы в свойствах предустановленного интерфейса "СберСпасибо" укажите новые расширенные свойства или в параметре XML атрибуты чека (для общих в рамках чека объектов, таких, как категория заказа) или в параметре XML атрибуты блюд (для блюд)

В данном примере добавлена строка 11264.genSpasiboOrderCategory.AltName:- genSpasiboOrderCategory — это системное имя расширенного свойства с приставкой gen. Это значение будет передаваться в ПЦ Сбера в качестве названия атрибута
- 11264 — это идентификатор типа объекта. Его можно узнать при привязке расширенного свойства к объекта

- Задайте значения нового расширенного свойства для элементов

Готово. Если всё сделано правильно, то указанные значения доп. атрибутов будут передаваться в ПЦ при продаже. При этом действует следующая логика:
- Если значение расширенного свойства передается с привязкой к блюду — значение передается с конкретным блюдом
- Если значение расширенного свойства передается с привязкой к общему в рамках чека элементу (например, к категории заказа) — то оно передается со всеми блюдами, включенными в данный заказ.
Работа на кассовой станции
При настройке Формы в скрипте задаётся минимальная сумма заказа, при которой возможна оплата бонусами — minordersum. Поэтому возможны два сценария работы на кассе: когда минимальная сумма не достигнута, и когда достигнута.
Оплата при сумме заказа меньше minordersum
Если при расчете заказа его стоимость меньше указанной в скрипте, то процесс расчета аналогичен классической оплате по банковской карте. Списание бонусов предложено не будет.
Оплата при сумме заказа больше minordersum
Если при расчете заказа его стоимость больше указанной в скрипте, то после выбора для оплаты банковской карты и печати чека намерения, на этапе подтверждения оплаты выйдет сообщение с предложением списать бонусы СберСпасибо.
При выборе варианта Списать, спишется максимальное количество доступных для списания бонусов.
При выборе варианта Не списывать пройдет оплата полной суммы заказа банковской картой без списания бонусов.
После выбора одного из вариантов, заказ закроется.
Ошибка при списании бонусов
Возможна ситуация, когда при попытке списания бонусов, происходит ошибка. В этом случае выводится сообщение:
При выборе варианта Оплатить всю сумму банковской картой полная сумма заказа будет оплачена баковской картой. Бонусы СберСпасибо в этом случае не списываются.
При выборе варианта Отмена оплаты произойдет возврат в режим редактирования заказа, после чего можно попробовать повторно оплатить заказ со списанием бонусов.
Ограничения списания бонусов
Бонусы СберСпасибо не получится списать, если:
- Заказ оплачивается более, чем одной валютой. Например, банковской картой и наличными
- В заказе используется другая система лояльности
- Есть проблемы, связанные с доступностью сервера СберСпасибо.