> For the complete documentation index, see [llms.txt](https://passteam.gitbook.io/passteam-api-v1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://passteam.gitbook.io/passteam-api-v1/integraciya-s-1s.md).

# Интеграция с 1С

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

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

Интеграция 1С и Passteam рассматривается на примере программного продукта 1С:Розница 2.3.1.40.

Карты лояльности представлены справочником ИнформационныеКарты. Необходимо предусмотреть нетиповые реквизиты:&#x20;

* cardId - строка, длина 24. Идентификатор карты в Passteam.&#x20;
* cardlUrl – строка, неограниченной длины. Ссылка на скачивание карты.
* installed – булево. Статус установки карты.

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

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

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

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

## Примеры кода

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

```
// Процедура - обработчик события "ПередЗаписью".
Процедура ПередЗаписью(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если ВидКарты = Перечисления.ВидыИнформационныхКарт.Штриховая Тогда
		КодКарты = "";
	КонецЕсли;
	
	Если ТипЗнч(ВладелецКарты) = Тип("СправочникСсылка.Контрагенты")
		ИЛИ ТипКарты = Перечисления.ТипыИнформационныхКарт.Регистрационная Тогда
		ДатаСледующегоОпроса = Дата("00010101");
	КонецЕсли;
	
	Попытка
		Если ПустаяСтрока(ЭтотОбъект.cardId) Тогда
			CreateCard();
		Иначе
			updateCard();
		КонецЕсли;	
	Исключение
		Сообщить("При создании карты в Passteam возникла ошибка" + ОписаниеОшибки());
	КонецПопытки;
	
КонецПроцедуры

#КонецОбласти
	
#КонецЕсли

# Область ИнтеграцияPassteam
Процедура CreateCard()
	Соединение = Новый HTTPСоединение("getpass.passteam.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); 
	
	Заголовки = Новый Соответствие; 
	Заголовки.Вставить("Authorization", "АВТОРИЗАЦИОННЫЙ ТОКЕН"); 
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded"); 
	
	Запрос = Новый HTTPЗапрос("/oapi/v1/createcard", Заголовки); 
	СтрокаЗапроса = ("templateId=[значение вашего шаблона]%1&values[%NAME%]=%2&values[%BIRTHDAY%]=%3&values[%PHONE%]=%4&values[%EMAIL%]=%5&values[BONUS%]=%6") ;  
	
	Если ЗначениеЗаполнено(ЭтотОбъект.ВладелецКарты)  Тогда
		НомерТелефона = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].НомерТелефона);
		АдресЭП = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].АдресЭП);
		
		Если ТипЗнч(ЭтотОбъект.ВладелецКарты) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
			ДатаРождения = Формат(ЭтотОбъект.ВладелецКарты.ДатаРождения,"ДФ=dd.MM.yyyy");
		Иначе
			ДатаРождения = "";
		КонецЕсли;
	Иначе
		НомерТелефона = "";
		АдресЭП = "";
		ДатаРождения = "";
	КонецЕсли;
	
	СтрокаЗапроса = СтрШаблон(СтрокаЗапроса,"ИДЕНТИФИКАТОР ШАБЛОНА",ЭтотОбъект.ВладелецКарты,ДатаРождения,НомерТелефона,АдресЭП,0); 
	Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса); 
	
	Ответ = Соединение.ОтправитьДляОбработки(Запрос); 
	
	ЧтениеJSON = Новый ЧтениеJSON; 
	СтрокаДоЧтения = СтрЗаменить(Ответ.ПолучитьТелоКакСтроку(), "%",""); 
	ЧтениеJSON.УстановитьСтроку(СтрокаДоЧтения); 
	
	Данные = ПрочитатьJSON(ЧтениеJSON, Ложь); 
	Если Данные.code = 200 Тогда
		Сообщить("Карта создана успешно!");
		ЭтотОбъект.cardId = Данные.result.cardId;
		ЭтотОбъект.CardUrl = Данные.result.cardUrl;
	ИначеЕсли Данные.code = 409 Тогда
		Сообщить("Данный номер телефона уже привязан к карте");
	ИначеЕсли Данные.code = 500 И Данные.message	 = "Provided field (PHONE) is unique and must be set." Тогда
		Сообщить("Для создания карты необходимо указать номер мобильного телефона");
	КонецЕсли;
	
КонецПроцедуры

Процедура UpdateCard() Экспорт
	Соединение = Новый HTTPСоединение("getpass.passteam.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); 
	Заголовки = Новый Соответствие; 
	Заголовки.Вставить("Authorization", "АВТОРИЗАЦИОННЫЙ ТОКЕН"); 
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded"); 
	
	Запрос = Новый HTTPЗапрос("/oapi/v1/updatecard", Заголовки); 
	
	СтрокаЗапроса = ("cardId=%1&values[%NAME%]=%2&values[%BIRTHDAY%]=%3&values[%PHONE%]=%4&values[%EMAIL%]=%5&values[%BONUS%]=%6") ; 
	Если ЗначениеЗаполнено(ЭтотОбъект.ВладелецКарты)  Тогда
		НомерТелефона = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].НомерТелефона);
		АдресЭП = ?(ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация.Количество()=0,"",ЭтотОбъект.ВладелецКарты.КонтактнаяИнформация[0].АдресЭП);
		
		Если ТипЗнч(ЭтотОбъект.ВладелецКарты) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
			ДатаРождения = Формат(ЭтотОбъект.ВладелецКарты.ДатаРождения,"ДФ=dd.MM.yyyy");
		Иначе
			ДатаРождения = "";
		КонецЕсли;
	Иначе
		НомерТелефона = "";
		АдресЭП = "";
		ДатаРождения = "";
	КонецЕсли;
	
	ЗапросБаллов = Новый Запрос;
	ЗапросБаллов.Текст = 
		"ВЫБРАТЬ
		|	БонусныеБаллыОстатки.НачисленоОстаток КАК НачисленоОстаток
		|ИЗ
		|	РегистрНакопления.БонусныеБаллы.Остатки(&ТекущаяДата, ДисконтнаяКарта = &ДисконтнаяКарта) КАК БонусныеБаллыОстатки";

	ЗапросБаллов.УстановитьПараметр("ДисконтнаяКарта", ЭтотОбъект.Ссылка);
	ЗапросБаллов.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

	РезультатЗапроса = ЗапросБаллов.Выполнить().Выгрузить();
	Если РезультатЗапроса.Количество() = 0 Тогда
		Баллы = 0;
	Иначе Баллы = РезультатЗапроса[0].НачисленоОстаток;
	КонецЕсли;
	
	СтрокаЗапроса = СтрШаблон(СтрокаЗапроса,ЭтотОбъект.cardId,ЭтотОбъект.ВладелецКарты,ДатаРождения,НомерТелефона,АдресЭП,Баллы); 
	Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса); 
	
	Ответ = Соединение.ОтправитьДляОбработки(Запрос); 
	
	ЧтениеJSON = Новый ЧтениеJSON; 
	СтрокаДоЧтения = СтрЗаменить(Ответ.ПолучитьТелоКакСтроку(), "%",""); 
	ЧтениеJSON.УстановитьСтроку(СтрокаДоЧтения); 
	
	Данные = ПрочитатьJSON(ЧтениеJSON, Ложь); 
	
	Если Данные.code = 200 Тогда
		Сообщить("Карта успешно обновлена!");
		ЭтотОбъект.installed = Данные.result.card.installed;
	ИначеЕсли Данные.code = 409 Тогда
		Сообщить("Данный номер телефона уже привязан к карте");
	ИначеЕсли Данные.code = 500 И	Данные.message	 = "Provided field (PHONE) is unique and must be set." Тогда
		Сообщить("Для создания карты необходимо указать номер мобильного телефона");
	КонецЕсли;
	
КонецПроцедуры
#КонецОбласти
```

{% hint style="info" %}
В АВТОРИЗАЦИОННЫЙ ТОКЕН и ИДЕНТИФИКАТОР ШАБЛОНА необходимо подставить соответствующие значения. Если вы не знаете, где их взять, уточните эту информацию у менеджера Passteam
{% endhint %}

{% hint style="info" %}
В строке&#x20;

```
СтрокаЗапроса = ("templateId=%1&values[%NAME%]=%2&values[%BIRTHDAY%]
```

NAME и BIRTHDAY - названия переменных в шаблоне. Они могут быть другими, чтобы узнать какие у вас переменные - зайдите в "Настройки" -> "Переменные".
{% endhint %}

{% hint style="danger" %}
В некоторых случаях могут возникать проблемы с передачей спецсимволов при отправке http запроса.

В таких случаях необходимо передавать символы как\
**\[** как **%5B**\
**%** как **%25**\
**]** как **%5D**\
То есть как в чистом http запросе.\
Например, строка запроса после всех подстановок будет выглядеть так:

**cardId=5bea7e305abcfd6b708b4573\&values%5B%25BALANCE%25%5D=7500\&values%5B%25\_CODE%25%5D=3006880536055\&values%5B%25NUMBERCARD%25%5D=3006880536055\&values%5B%25DISCOUNT%25%5D=5**
{% endhint %}

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

```
Процедура ПриЗаписи(Отказ, Замещение)
	Попытка
		Для каждого эл Из ЭтотОбъект Цикл
			нОбъект = Эл.ДисконтнаяКарта.ПолучитьОбъект();
			нОбъект.UpdateCard();
		КонецЦикла;
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры
```

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

![Схема интеграции 1С с Passteam](https://2119044128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LhuBpLaTNd_EXPl4sQp%2F-LyEyPUv10cwATY9Lb2T%2F-LyJVnSs8jwrISb2V257%2F1%D0%A1%20passteam.png?alt=media\&token=63633075-3940-4162-b1f7-b64a16e3f034)
