Интеграция с 1С
На данной странице приводится пример интеграции 1С с Passteam

Описание интеграции

Интеграция 1С и Passteam рассматривается на примере программного продукта 1С:Розница 2.3.1.40.
Карты лояльности представлены справочником ИнформационныеКарты. Необходимо предусмотреть нетиповые реквизиты:
  • cardId - строка, длина 24. Идентификатор карты в Passteam.
  • cardlUrl – строка, неограниченной длины. Ссылка на скачивание карты.
  • installed – булево. Статус установки карты.

Справочник информационные карты

В модуле объекта справочника ИнформационныеКарты, в событии ПередЗаписью добавляем проверку: Если ПустаяСтрока(ЭтотОбъект.cardId) Тогда … Если данное условие выполняется отправляем запрос CreateCard и после получения ответа необходимо записать cardId и cardUrl в карту лояльности 1С в соответствующие реквизиты. Если условие не выполняется, то необходимо отправить запрос UpdateCard и после получения ответа записать installed в соответствующий реквизит карты лояльности 1С.

Регистр накопления БонусныеБаллы

Для того, чтобы своевременно обновлять бонусный баланс клиента на карте, необходимо в регистре накопления БонусныеБаллы в событии ПриЗаписи вызывать функцию UpdateCard.

Примеры кода

Листинг справочника ИнформационныеКарты

1
// Процедура - обработчик события "ПередЗаписью".
2
Процедура ПередЗаписью(Отказ)
3
4
Если ОбменДанными.Загрузка Тогда
5
Возврат;
6
КонецЕсли;
7
8
Если ВидКарты = Перечисления.ВидыИнформационныхКарт.Штриховая Тогда
9
КодКарты = "";
10
КонецЕсли;
11
12
Если ТипЗнч(ВладелецКарты) = Тип("СправочникСсылка.Контрагенты")
13
ИЛИ ТипКарты = Перечисления.ТипыИнформационныхКарт.Регистрационная Тогда
14
ДатаСледующегоОпроса = Дата("00010101");
15
КонецЕсли;
16
17
Попытка
18
Если ПустаяСтрока(ЭтотОбъект.cardId) Тогда
19
CreateCard();
20
Иначе
21
updateCard();
22
КонецЕсли;
23
Исключение
24
Сообщить("При создании карты в Passteam возникла ошибка" + ОписаниеОшибки());
25
КонецПопытки;
26
27
КонецПроцедуры
28
29
#КонецОбласти
30
31
#КонецЕсли
32
33
# Область ИнтеграцияPassteam
34
Процедура CreateCard()
35
Соединение = Новый HTTPСоединение("getpass.passteam.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
36
37
Заголовки = Новый Соответствие;
38
Заголовки.Вставить("Authorization", "АВТОРИЗАЦИОННЫЙ ТОКЕН");
39
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
40
41
Запрос = Новый HTTPЗапрос("/oapi/v1/createcard", Заголовки);
42
СтрокаЗапроса = ("templateId=%1&values[%%CLIENT_NAME%%]=%2&values[%%BIRTHDAY%%]=%3&values[%%PHONE%%]=%4&values[%%EMAIL%%]=%5&values[%%BONUS%%]=%6") ;
43
44
Если ЗначениеЗаполнено(ЭтотОбъект.ВладелецКарты) Тогда
45
НомерТелефона = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].НомерТелефона);
46
АдресЭП = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].АдресЭП);
47
48
Если ТипЗнч(ЭтотОбъект.ВладелецКарты) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
49
ДатаРождения = Формат(ЭтотОбъект.ВладелецКарты.ДатаРождения,"ДФ=dd.MM.yyyy");
50
Иначе
51
ДатаРождения = "";
52
КонецЕсли;
53
Иначе
54
НомерТелефона = "";
55
АдресЭП = "";
56
ДатаРождения = "";
57
КонецЕсли;
58
59
СтрокаЗапроса = СтрШаблон(СтрокаЗапроса,"ИДЕНТИФИКАТОР ШАБЛОНА",ЭтотОбъект.ВладелецКарты,ДатаРождения,НомерТелефона,АдресЭП,0);
60
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
61
62
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
63
64
ЧтениеJSON = Новый ЧтениеJSON;
65
СтрокаДоЧтения = СтрЗаменить(Ответ.ПолучитьТелоКакСтроку(), "%","");
66
ЧтениеJSON.УстановитьСтроку(СтрокаДоЧтения);
67
68
Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
69
Если Данные.code = 200 Тогда
70
Сообщить("Карта создана успешно!");
71
ЭтотОбъект.cardId = Данные.result.cardId;
72
ЭтотОбъект.CardUrl = Данные.result.cardUrl;
73
ИначеЕсли Данные.code = 409 Тогда
74
Сообщить("Данный номер телефона уже привязан к карте");
75
ИначеЕсли Данные.code = 500 И Данные.message = "Provided field (PHONE) is unique and must be set." Тогда
76
Сообщить("Для создания карты необходимо указать номер мобильного телефона");
77
КонецЕсли;
78
79
КонецПроцедуры
80
81
Процедура UpdateCard() Экспорт
82
Соединение = Новый HTTPСоединение("getpass.passteam.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
83
Заголовки = Новый Соответствие;
84
Заголовки.Вставить("Authorization", "АВТОРИЗАЦИОННЫЙ ТОКЕН");
85
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
86
87
Запрос = Новый HTTPЗапрос("/oapi/v1/updatecard", Заголовки);
88
89
СтрокаЗапроса = ("cardId=%1&values[%%CLIENT_NAME%%]=%2&values[%%BIRTHDAY%%]=%3&values[%%PHONE%%]=%4&values[%%EMAIL%%]=%5&values[%%BONUS%%]=%6") ;
90
Если ЗначениеЗаполнено(ЭтотОбъект.ВладелецКарты) Тогда
91
НомерТелефона = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].НомерТелефона);
92
АдресЭП = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].АдресЭП);
93
94
Если ТипЗнч(ЭтотОбъект.ВладелецКарты) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
95
ДатаРождения = Формат(ЭтотОбъект.ВладелецКарты.ДатаРождения,"ДФ=dd.MM.yyyy");
96
Иначе
97
ДатаРождения = "";
98
КонецЕсли;
99
Иначе
100
НомерТелефона = "";
101
АдресЭП = "";
102
ДатаРождения = "";
103
КонецЕсли;
104
105
ЗапросБаллов = Новый Запрос;
106
ЗапросБаллов.Текст =
107
"ВЫБРАТЬ
108
| БонусныеБаллыОстатки.НачисленоОстаток КАК НачисленоОстаток
109
|ИЗ
110
| РегистрНакопления.БонусныеБаллы.Остатки(&ТекущаяДата, ДисконтнаяКарта = &ДисконтнаяКарта) КАК БонусныеБаллыОстатки";
111
112
ЗапросБаллов.УстановитьПараметр("ДисконтнаяКарта", ЭтотОбъект.Ссылка);
113
ЗапросБаллов.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
114
115
РезультатЗапроса = ЗапросБаллов.Выполнить().Выгрузить();
116
Если РезультатЗапроса.Количество() = 0 Тогда
117
Баллы = 0;
118
Иначе Баллы = РезультатЗапроса[0].НачисленоОстаток;
119
КонецЕсли;
120
121
СтрокаЗапроса = СтрШаблон(СтрокаЗапроса,ЭтотОбъект.cardId,ЭтотОбъект.ВладелецКарты,ДатаРождения,НомерТелефона,АдресЭП,Баллы);
122
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса);
123
124
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
125
126
ЧтениеJSON = Новый ЧтениеJSON;
127
СтрокаДоЧтения = СтрЗаменить(Ответ.ПолучитьТелоКакСтроку(), "%","");
128
ЧтениеJSON.УстановитьСтроку(СтрокаДоЧтения);
129
130
Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
131
132
Если Данные.code = 200 Тогда
133
Сообщить("Карта успешно обновлена!");
134
ЭтотОбъект.installed = Данные.result.card.installed;
135
ИначеЕсли Данные.code = 409 Тогда
136
Сообщить("Данный номер телефона уже привязан к карте");
137
ИначеЕсли Данные.code = 500 И Данные.message = "Provided field (PHONE) is unique and must be set." Тогда
138
Сообщить("Для создания карты необходимо указать номер мобильного телефона");
139
КонецЕсли;
140
141
КонецПроцедуры
142
#КонецОбласти
Copied!
В АВТОРИЗАЦИОННЫЙ ТОКЕН и ИДЕНТИФИКАТОР ШАБЛОНА необходимо подставить соответствующие значения. Если вы не знаете, где их взять, уточните эту информацию у менеджера Passteam
В строке
1
СтрокаЗапроса = ("templateId=%1&values[%%CLIENT_NAME%%]=%2&values[%%BIRTHDAY%%]
Copied!
CLIENT_NAME и BIRTHDAY - названия переменных в шаблоне. Они могут быть другими, чтобы узнать какие у вас переменные - обратитесь к менеджеру Passteam.

Листинг регистра накопления БонусныеБаллы

1
Процедура ПриЗаписи(Отказ, Замещение)
2
Попытка
3
Для каждого эл Из ЭтотОбъект Цикл
4
нОбъект = Эл.ДисконтнаяКарта.ПолучитьОбъект();
5
нОбъект.UpdateCard();
6
КонецЦикла;
7
Исключение
8
Сообщить(ОписаниеОшибки());
9
КонецПопытки;
10
КонецПроцедуры
Copied!

Схема интеграции

Схема интеграции 1С с Passteam
Last modified 1yr ago