Идентификация пользователей Telegram в 1С
Самая частая потребность при разработке бота — сопоставление пользователя Telegram с пользователем или контрагентом в 1С.
Какие способы предлагаются?
- Пользователь / пароль 1С — пользователь бота одновременно пользователь 1С
- Номер телефона — пользователь отправляет номер Telegram; тот же номер есть в справочниках 1С
- Пригласительная ссылка — в 1С генерируется ссылка, связанная с объектом, и передаётся пользователю
- Команда — вариант пригласительной ссылки через команду вроде
/invite
Идентификация по пользователю и паролю 1С
Создайте параметр ОжидаетсяВводПользователя (Булево). Отправьте приглашение к вводу:
ПараметрыМетода = Новый Структура;
ПараметрыМетода.Вставить("Сообщение",
"Введите имя пользователя из 1С,
|потом дефис и пароль, например:
Иван Васильевич - 12345");
ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
УстановитьПараметр(Вход.Пользователь, "ОжидаетсяВводПользователя", Истина);
Обработка ответа (сразу сбрасывайте параметр ожидания):
УстановитьПараметр(Вход.Пользователь, "ОжидаетсяВводПользователя", Ложь);
ИдентификацияОсуществлена = Ложь;
ВведеннаяСтрока = Вход.Текст;
СимволДефис = Найти(ВведеннаяСтрока, "-");
Если СимволДефис > 0 Тогда
СтрокаПользователь = СокрЛП(Лев(ВведеннаяСтрока, СимволДефис - 1));
ПользовательСсылка = ПользователиИнформационнойБазы.НайтиПоИмени(СтрокаПользователь);
Если ПользовательСсылка <> Неопределено Тогда
СтрокаПароль = СокрЛП(Сред(ВведеннаяСтрока, СимволДефис + 1));
Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
Хеш.Добавить(СтрокаПароль);
Base64СтрокаПароль = Base64Строка(Хеш.ХешСумма);
ВРегСтрокаПароль = ВРег(СтрокаПароль);
Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
Хеш.Добавить(ВРегСтрокаПароль);
ВРегBase64СтрокаПароль = Base64Строка(Хеш.ХешСумма);
Если ЗначениеЗаполнено(СтрокаПароль) Тогда
СохраняемоеЗначениеПароля = Base64СтрокаПароль + "," + ВРегBase64СтрокаПароль;
Иначе
СохраняемоеЗначениеПароля = "";
КонецЕсли;
Если ПользовательСсылка.СохраняемоеЗначениеПароля = СохраняемоеЗначениеПароля Тогда
ИдентификацияОсуществлена = Истина;
УстановитьПараметр(Вход.Пользователь, "Пользователь", ПользовательСсылка);
ПараметрыМетода = Новый Структура;
ПараметрыМетода.Вставить("Сообщение", "Сопоставление успешно произведено");
ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ИдентификацияОсуществлена = Ложь Тогда
ПараметрыМетода = Новый Структура;
ПараметрыМетода.Вставить("Сообщение", "Не удалось провести сопоставление — неверная пара пользователь/пароль");
ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
КонецЕсли;
Идентификация по номеру телефона
- Создайте стандартную клавиатуру с включённым флагом «Запросить контакт»
- Отправьте её пользователю через параметр метода
Клавиатура - Отловите контакт сервисом и сопоставьте с контактной информацией 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") Тогда
Обработка = Справочники.ТелеграмОбработки.НайтиПоНаименованию("Сопоставление");
Справочники.ТелеграмОбработки.ВыполнитьОбработку(Обработка, Бот, Вход);
ИначеЕсли НЕ ЗначениеЗаполнено(Вход.ПараметрыПользователя.ФизЛицо) Тогда
ПараметрыМетода = Новый Структура;
ПараметрыМетода.Вставить("Сообщение", "Пользователь не сопоставлен");
ОтправитьСообщение(Бот, ПараметрыМетода, Вход);
Вход.ПрерватьВыполнение = Истина;
КонецЕсли;