4.3.5. Интеграция с СофтБаланс: Трактиръ Front Office
1. На форме справочника “Рабочие места” добавить страницу “Система лояльности”


2. Добавить на страницу два элемента :
флажок


3. И поле ввода :


4. У поля ввода назначает обработку :

Процедура СЛНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокВидов = Новый СписокЗначений;
СписокВидов.Добавить("АО");
тоВыбратьИзСпискаТО(СписокВидов, ЭтаФорма, Элемент, МестоРеализации.ИнформационнаяБаза);
КонецПроцедуры
5. А также в процедуре “ЗаполнитьДеревоСтраниц” добавить фрагмент :
ПодСтраница = Страница.Строки.Добавить();
ПодСтраница.Имя = "СистемаЛояльности"; ПодСтраница.Заголовок = НСтр("de='Loyalty';en='Loyalty';ru='Система лояльности'");
ПодСтраница.Картинка = БиблиотекаКартинок.СправочникЭлемент;
6. В обработке “Главная форма”, модуль объекта, Функция ПолучитьМассивПодключаемогоТО(ТаблицаОшибок)
Добавить :
Если глПараметрыРМ.СЛЕсть Тогда
ДобавитьСтрокуТзТо(ТЗ, глПараметрыРМ.СЛ);
КонецЕсли;
7. Общий модуль “ИнтерфейсРМ” , Функция ИдентификацияПоКарте, после фрагмента :
Если Лев(КодДоступа,14) = "Идентификатор_" Тогда
КодПоиска = Сред(КодДоступа,15);
добавляем :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Результат = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("НайтиКартуВСистемеЛояльности", Новый Структура ("НомерКарты,СчитаноРидером",КодПоиска,Истина));
КодПоиска = Результат.НомерКарты;
КонецЕсли;
Данный фрагмент уточняет считанную карту в системе лояльности, если находит. то освежает данные клиента в справочнике клиентов.
8. В этой же функции после фргамента :
КартаДоступа = ПроверитьИдентификаторПоШаблонам(КодПоиска, Текст1, Текст2);
КонецЕсли;
КонецЕсли;
Иначе
КодПоиска = КодДоступа;
добавляем :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Результат = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("НайтиБКартуВСистемеЛояльности", Новый Структура ("НомерКарты,СчитаноРидером",КодПоиска,Ложь));
КодПоиска = Результат.НомерКарты;
КонецЕсли;
Данный фрагмент аналогично уточняет считанную карту в системе лояльности, если находит. то освежает данные клиента в справочнике клиентов. При этом указывается, что карта введена ручным способом.
9. Документ “Возврат”, Модуль документа, Процедура “Обработка проведения” :
фргамент :
Движение = Движения.НакопленияКлиентов.ДобавитьПриход();
Движение.Период = Дата;
Движение.Клиент = Клиент;
Движение.КлиентОперации = Клиент;
// Документы.Бронь.ПустаяСсылка() = остатки по Личному счету
Движение.Основание = Документы.Бронь.ПустаяСсылка();
Движение.СуммаБезнал = 0;
Движение.СуммаБонусов = Сумма;
заменяем на :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Если глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("ВернутьБонусыПриВозврате", Новый Структура ("Дата,Клиент,Сумма,Смена,Чек",Дата,Клиент,Сумма,Число(Смена.Номер),Число(Номер))).Ошибка Тогда
Отказ = Истина;
КонецЕсли;
Иначе
Движение = Движения.НакопленияКлиентов.ДобавитьПриход();
Движение.Период = Дата;
Движение.Клиент = Клиент;
Движение.КлиентОперации = Клиент;
// Документы.Бронь.ПустаяСсылка() = остатки по Личному счету
Движение.Основание = Документы.Бронь.ПустаяСсылка();
Движение.СуммаБезнал = 0;
Движение.СуммаБонусов = Сумма;
КонецЕсли;
10. В обработке “ВводКлиента”, модуле формы в процедуре “ПередОткрытием” вместо фрагмента :
НакопленияКлиента = НакопленияКлиента(Клиент.Ссылка, , Истина);
заменяем на фргамент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
НакопленияКлиента = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("БонусовНаКарте", Новый Структура ("Клиент",Клиент.Ссылка));
Иначе
НакопленияКлиента = НакопленияКлиента(Клиент.Ссылка, , Истина);
КонецЕсли;
11. Обработка “ВозвратПоЗаказу”, модуль формы, процедура “ОформитьВозврат”, после фргамента :
Если ФлагОК Тогда
ЗафиксироватьТранзакцию();
ИнтерфейсРМ.ЗаписьСобытия(Справочники.События.ОплатаВозврат, Док.Ссылка, Док.Номер, Док.Сумма, Док.Причина);
Оповестить("ВыходИзЗаказа", Док.Ссылка); // чтобы сразу спозиционироваться в журнале закрытых
добавить фрагмент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Результат = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("ЗаписатьВозвратНаСервер", Новый Структура ("Заказ",Док.Ссылка));
КонецЕсли;
12. Обработка “ГлавнаяФОрма”, модуль объекта, процедура “ОбработкаВнешнегоСобытия”, после фргамента :
Если ТипЗнч(_Знач) = Тип("Строка") Тогда
Если НЕ ЗначениеЗаполнено(глПользователь) Тогда
// если система заблокирована, то возможна только авторизация сотрудника
ТипПривязки = Новый ОписаниеТипов("СправочникСсылка.Сотрудники");
Иначе
добавляем фрагмент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Результат = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("НайтиБКартуВСистемеЛояльности", Новый Структура ("НомерКарты",_Знач));
_Знач = Результат.НомерКарты;
КонецЕсли;
13. Обработка “ОплатаЗаказа”,МодульОбъекта, Процедура ПолучитьНакопленияКлиента,в смом верху вставить :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
ТекНакопленияКлиента = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("МаксимальноВозможнаяСуммаОплаты", Новый Структура ("Клиент,СуммаЧека",Заказ.Клиент,Заказ.ИтоговаяСумма)).СтруктураКлиента;
Возврат ТекНакопленияКлиента;
КонецЕсли;
14. Тот же модуль, Процедура ОпределитьДопустимуюСумму(ВыбВариант, ЕстьОграничениеСуммы, Текст2, ПредоплатаПоБрони)
меняем аналогично такой же фрагмент.
15. Тот же модуль, процедура “ЗаписатьОплату”, после фрагмента
// Добавить таблицу товаров в протокол
ДокПротокол.Товары.Очистить();
ПротоколВариантыОплаты.Очистить();
Для Каждого СтрокаЗаказа Из ТаблицаЗаказа Цикл
ДобавитьТоварВПротокол(ДокПротокол, СтрокаЗаказа, ПротоколВариантыОплаты);
КонецЦикла;
добавляем фргамент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Если глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("ОплатитьБонусами", Новый Структура ("ДокПротокол",ДокПротокол)).Ошибка Тогда
Возврат;
КонецЕсли;
КонецЕсли;
16. В этом же модуле, в этой же процедуре, после фргамента :
// Добавить в протокол варианты оплаты
Для Каждого СтрокаПротоколВариантыОплаты Из ПротоколВариантыОплаты Цикл
ДокПротоколСтрока = ДокПротокол.Протокол.Добавить();
ДокПротоколСтрока.ВариантОплаты = СтрокаПротоколВариантыОплаты.ВариантОплаты;
ДокПротоколСтрока.Сумма = СтрокаПротоколВариантыОплаты.Сумма;
ДокПротоколСтрока.СуммаФакт = ДокПротоколСтрока.Сумма;
КонецЦикла;
ДокПротокол.ИтогСуммаФакт = ДокПротокол.Протокол.Итог("СуммаФакт");
добавить фргамент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Если глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("ОплатитьБонусами", Новый Структура ("ДокПротокол",ДокПротокол)).Ошибка Тогда
Возврат;
КонецЕсли;
КонецЕсли;
17. В этом же модуле, в этойже процедуре, чуть ниже, после фргамента :
Если НЕ ИнтерфейсРМ.ПопыткаДействияСОбъектом( ДокПротокол, "Объект.Записать(РежимЗаписиДокумента.Проведение)", ФоновыйРежим, Истина) Тогда
//ОтменитьТранзакцию();
Возврат;
КонецЕсли;
ГруппыОплаты.Протокол = ДокПротокол.Ссылка;
КонецЦикла;
КонецЕсли;
Если СуммаПредоплаты=0 Тогда
Добавить фрагмент :
Если ЗаказДопИнф.Статус <> Перечисления.СтатусыЗаказа.Закрыт Тогда
Если глТорговоеОборудование.Свойство("Bonica") Тогда
Результат = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("ЗаписатьЧекНаСервер", Новый Структура ("Заказ",ЗаказДопИнф.Заказ));
КонецЕсли;
КонецЕсли;
18. Тот же модуль, Функция МаксимальнаяСуммаВариантаОплаты(ВыбВариант, РумбаПроверить = Истина), вместо фргамента :
НакопленияКлиента = ПолучитьНакопленияКлиента();
меняем на фрагмент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
НакопленияКлиента = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("БонусовНаКарте", Новый Структура ("Клиент",Заказ.Клиент));
Иначе
НакопленияКлиента = ПолучитьНакопленияКлиента();
КонецЕсли;
18. тот же модуль Функция ПолучитьНакопленияКлиента()
Если ПараметрыСеанса.ОнлайнБонусы.Используется Тогда
// В фоновом режиме накопления надо брать из глТрактиръМобайл.ДопУправление.
Если ФоновыйРежим И глТрактиръМобайл.ДопУправление <> Неопределено Тогда
СтандартнаяОбработка = Истина;
глТрактиръМобайл.ДопУправление.ОпределитьНакопленияКлиента(ТекНакопленияКлиента, СтандартнаяОбработка);
Иначе
ТекНакопленияКлиентаВнешние = НакопленияКлиента(Заказ.Клиент);
ТекНакопленияКлиента.СуммаБезнал = ТекНакопленияКлиентаВнешние.СуммаБезнал + ТекНакопленияКлиентаВнешние.ГлубинаКредита;
ТекНакопленияКлиента.СуммаБонусов = ТекНакопленияКлиентаВнешние.СуммаБонусов;
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.ОнлайнБонусы.Используется Тогда
// В фоновом режиме накопления надо брать из глТрактиръМобайл.ДопУправление.
Если ФоновыйРежим И глТрактиръМобайл.ДопУправление <> Неопределено Тогда
СтандартнаяОбработка = Истина;
глТрактиръМобайл.ДопУправление.ОпределитьНакопленияКлиента(ТекНакопленияКлиента, СтандартнаяОбработка);
Иначе
ТекНакопленияКлиентаВнешние = НакопленияКлиента(Заказ.Клиент);
ТекНакопленияКлиента.СуммаБезнал = ТекНакопленияКлиентаВнешние.СуммаБезнал + ТекНакопленияКлиентаВнешние.ГлубинаКредита;
ТекНакопленияКлиента.СуммаБонусов = ТекНакопленияКлиентаВнешние.СуммаБонусов;
КонецЕсли;
КонецЕсли;
заменить на
Если глТорговоеОборудование.Свойство("Bonica") Тогда
ТекНакопленияКлиента.СуммаБонусов = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("БонусовНаКарте", Новый Структура ("Клиент",Заказ.Клиент)).СуммаБонусов;
Иначе
Если Константы.ВнешняяСистемаБонусов.Получить() Тогда
// В фоновом режиме накопления надо брать из глТрактиръМобайл.ДопУправление.
Если ФоновыйРежим И глТрактиръМобайл.ДопУправление <> Неопределено Тогда
СтандартнаяОбработка = Истина;
глТрактиръМобайл.ДопУправление.ОпределитьНакопленияКлиента(ТекНакопленияКлиента, СтандартнаяОбработка);
Иначе
ТекНакопленияКлиентаВнешние = НакопленияКлиента(Заказ.Клиент);
ТекНакопленияКлиента.СуммаБезнал = ТекНакопленияКлиентаВнешние.СуммаБезнал + ТекНакопленияКлиентаВнешние.ГлубинаКредита;
ТекНакопленияКлиента.СуммаБонусов = ТекНакопленияКлиентаВнешние.СуммаБонусов;
КонецЕсли;
КонецЕсли;
КонецЕсли;
19. Обработка “ПечатьЗаказа”, модуль объекта, Процедура ДобавитьИнформациюПоКлиенту(ТаблицаЗадания, Клиент), вместо фрагмента :
НакопленияКлиента = НакопленияКлиента(Клиент, , Истина);
заменяем на фрагмент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
НакопленияКлиента = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("БонусовНаКарте", Новый Структура ("Клиент",Клиент));
Иначе
НакопленияКлиента = НакопленияКлиента(Клиент, , Истина);
КонецЕсли;
20. Обработка “ПечатьЧека”, модуль объекта, Процедура ДобавитьИнформациюПоКлиенту(ТаблицаЗадания, Клиент), вместо фрагмента :
НакопленияКлиента = НакопленияКлиента(Клиент, , Истина);
заменяем на фрагмент :
Если глТорговоеОборудование.Свойство("Bonica") Тогда
НакопленияКлиента = глПараметрыРМ.СЛ.ПолучитьОбъект().ВыполнитьДействие("БонусовНаКарте", Новый Структура ("Клиент",Клиент));
Иначе
НакопленияКлиента = НакопленияКлиента(Клиент, , Истина);
КонецЕсли;
20. Модуль “ОбщегоНазначения” Функция НакопленияКлиента после фрагмента
СтруктураКлиента.СуммаБонусов = ТаблицаОстатков.ИТОГ("СуммаБонусов");
СтруктураКлиента.СуммаБонусов = Обработки.Обслуживание_СЛ_Dominat.Создать().БонусовНаКарте(СсылкаКлиент,СтруктураКлиента.СуммаБонусов);
21. В справочнике ТорговоеОборудование, Макет “СписокТО”, добавить фрагмент, описывающий систему лояльности.
22. Включить обработку обслуживания в конфигурацию.