telegram max +7 (999) 881-15-11 zakirovdamir@vk.com

Статьи

Идентификация пользователей Telegram в 1С

Самая частая потребность при разработке бота — сопоставление пользователя Telegram с пользователем или контрагентом в 1С.

Какие способы предлагаются?

Идентификация по пользователю и паролю 1С

Создайте параметр ОжидаетсяВводПользователя (Булево). Отправьте приглашение к вводу:

ПараметрыМетода = Новый Структура;
ПараметрыМетода.Вставить("Сообщение",
	"Введите имя пользователя из 1С,
	|потом дефис и пароль, например:
	Иван Васильевич - 12345");
ОтправитьСообщение(Бот, ПараметрыМетода, Вход);

УстановитьПараметр(Вход.Пользователь, "ОжидаетсяВводПользователя", Истина);

Обработка ответа (сразу сбрасывайте параметр ожидания):

УстановитьПараметр(Вход.Пользователь, "ОжидаетсяВводПользователя", Ложь);

ИдентификацияОсуществлена = Ложь;
ВведеннаяСтрока = Вход.Текст;
СимволДефис = Найти(ВведеннаяСтрока, "-");

Если СимволДефис > 0 Тогда
	СтрокаПользователь = СокрЛП(Лев(ВведеннаяСтрока, СимволДефис - 1));
	ПользовательСсылка = ПользователиИнформационнойБазы.НайтиПоИмени(СтрокаПользователь);

	Если ПользовательСсылка <> Неопределено Тогда
		СтрокаПароль = СокрЛП(Сред(ВведеннаяСтрока, СимволДефис + 1));
		Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
		Хеш.Добавить(СтрокаПароль);
		Base64СтрокаПароль = Base64Строка(Хеш.ХешСумма);

		ВРегСтрокаПароль = ВРег(СтрокаПароль);
		Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
		Хеш.Добавить(ВРегСтрокаПароль);
		ВРегBase64СтрокаПароль = Base64Строка(Хеш.ХешСумма);

		Если ЗначениеЗаполнено(СтрокаПароль) Тогда
			СохраняемоеЗначениеПароля = Base64СтрокаПароль + "," + ВРегBase64СтрокаПароль;
		Иначе
			СохраняемоеЗначениеПароля = "";
		КонецЕсли;

		Если ПользовательСсылка.СохраняемоеЗначениеПароля = СохраняемоеЗначениеПароля Тогда
			ИдентификацияОсуществлена = Истина;
			УстановитьПараметр(Вход.Пользователь, "Пользователь", ПользовательСсылка);

			ПараметрыМетода = Новый Структура;
			ПараметрыМетода.Вставить("Сообщение", "Сопоставление успешно произведено");
			ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
		КонецЕсли;
	КонецЕсли;
КонецЕсли;

Если ИдентификацияОсуществлена = Ложь Тогда
	ПараметрыМетода = Новый Структура;
	ПараметрыМетода.Вставить("Сообщение", "Не удалось провести сопоставление — неверная пара пользователь/пароль");
	ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
КонецЕсли;

Идентификация по номеру телефона

  1. Создайте стандартную клавиатуру с включённым флагом «Запросить контакт»
  2. Отправьте её пользователю через параметр метода Клавиатура
  3. Отловите контакт сервисом и сопоставьте с контактной информацией 1С

В типовых конфигурациях номера хранятся в ТЧ КонтактнаяИнформация (без знака «+»).

НомерТелефона1С = Сред(Вход.Сообщение.Contact.phone_number, 2);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	КИ.Ссылка КАК Ссылка,
|	КИ.Ссылка.Представление КАК Наименование
|ИЗ
|	Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КИ
|ГДЕ
|	КИ.НомерТелефона = &НомерТелефона";

Запрос.УстановитьПараметр("НомерТелефона", НомерТелефона1С);
Результат = Запрос.Выполнить();

Если Результат.Пустой Тогда
	ПараметрыМетода = Новый Структура;
	ПараметрыМетода.Вставить("Сообщение", "Ваш номер телефона в базе не найден, сопоставление не произведено");
	ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
Иначе
	Выборка = Результат.Выбрать();
	Выборка.Следующий();
	УстановитьПараметр(Вход.Пользователь, "ФизЛицо", Выборка.Ссылка);

	ПараметрыМетода = Новый Структура;
	ПараметрыМетода.Вставить("Сообщение", "Сопоставление произведено успешно: " + Выборка.Наименование);
	ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
КонецЕсли;

Идентификация по пригласительной ссылке

Ссылка вида t.me/your_bot?start=b0c35266-… сразу позволяет идентифицировать пользователя.

ФизЛицоСсылка = Справочники.ФизическиеЛица.НайтиПоНаименованию("Петя Иванов");
УникальныйИдентификатор = Строка(ФизЛицоСсылка.УникальныйИдентификатор());
ТекстПриглашения = СтрШаблон(
	"Уважаемый(ая) %1, для запуска бота перейдите по персональной ссылке: t.me/%2?start=%3",
	ФизЛицоСсылка.Наименование,
	ИмяБота,
	УникальныйИдентификатор);
УникальныйИдентификатор = Сред(Вход.Текст, 8);
Если ЗначениеЗаполнено(УникальныйИдентификатор) Тогда
	ФизЛицоСсылка = Справочники.ФизическиеЛица.ПолучитьСсылку(
		Новый УникальныйИдентификатор(УникальныйИдентификатор));
	Если ЗначениеЗаполнено(ФизЛицоСсылка.Наименование) Тогда
		УстановитьПараметр(Вход.Пользователь, "ФизЛицо", ФизЛицоСсылка);
		ПараметрыМетода = Новый Структура;
		ПараметрыМетода.Вставить("Сообщение", "Сопоставление произведено, здравствуйте, " + ФизЛицоСсылка);
		ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
	Иначе
		ПараметрыМетода = Новый Структура;
		ПараметрыМетода.Вставить("Сообщение", "Произвести сопоставление не удалось — недействительная ссылка");
		ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
	КонецЕсли;
КонецЕсли;

Идентификация по команде

Например, команда /invite:

ФизЛицоСсылка = Справочники.ФизическиеЛица.НайтиПоНаименованию("Петя Иванов");
УникальныйИдентификатор = Строка(ФизЛицоСсылка.УникальныйИдентификатор());
ТекстДляПользователя = СтрШаблон(
	"Уважаемый(ая) %1, для Вашей идентификации введите в диалог с ботом команду /invite %2",
	ФизЛицоСсылка.Наименование,
	УникальныйИдентификатор);
УникальныйИдентификатор = Сред(Вход.Текст, 9);
Если ЗначениеЗаполнено(УникальныйИдентификатор) Тогда
	ФизЛицоСсылка = Справочники.ФизическиеЛица.ПолучитьСсылку(
		Новый УникальныйИдентификатор(УникальныйИдентификатор));
	Если ЗначениеЗаполнено(ФизЛицоСсылка.Наименование) Тогда
		УстановитьПараметр(Вход.Пользователь, "ФизЛицо", ФизЛицоСсылка);
		ПараметрыМетода = Новый Структура;
		ПараметрыМетода.Вставить("Сообщение", "Сопоставление произведено, здравствуйте, " + ФизЛицоСсылка);
		ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
	Иначе
		ПараметрыМетода = Новый Структура;
		ПараметрыМетода.Вставить("Сообщение", "Произвести сопоставление не удалось — недействительная ссылка");
		ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
	КонецЕсли;
КонецЕсли;

Запрет доступа неидентифицированным

Обработка на событии «Перед выполнением»:

Если Лев(Вход.Текст, 6) = "/start" Тогда
	// старт — ничего не делаем
ИначеЕсли Вход.Сообщение.Свойство("Contact") Тогда
	Обработка = Справочники.ТелеграмОбработки.НайтиПоНаименованию("Сопоставление");
	Справочники.ТелеграмОбработки.ВыполнитьОбработку(Обработка, Бот, Вход);
ИначеЕсли НЕ ЗначениеЗаполнено(Вход.ПараметрыПользователя.ФизЛицо) Тогда
	ПараметрыМетода = Новый Структура;
	ПараметрыМетода.Вставить("Сообщение", "Пользователь не сопоставлен");
	ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
	Вход.ПрерватьВыполнение = Истина;
КонецЕсли;