Как организовать идентификацию пациента через телеграмм-бота в Системе взаимодействия 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При построении систем автоматизации для медицинских центров или лабораторий часто возникает задача оперативного информирования пациентов. Одним из наиболее удобных каналов доставки результатов анализов является Telegram. Однако при использовании штатной Системы взаимодействия 1С (СВ) разработчики сталкиваются с проблемой идентификации: как понять, какой именно пациент сканировал QR-код и подключился к боту, если мессенджер по умолчанию не передает номер телефона пользователя? В этой статье мы подробно разберем механизмы идентификации, технические нюансы работы с API и способы обеспечения безопасности персональных данных.

Проблема анонимности и механика первого контакта

Рассмотрим стандартную ситуацию: пациент сканирует QR-код, переходит в бота и нажимает кнопку «Запустить» (команда /start). В этот момент в 1С через Систему взаимодействия приходит уведомление о новом сообщении. Проанализируем, что мы получаем: идентификатор чата (Chat ID) и имя пользователя (Username), если оно заполнено. Этих данных недостаточно для однозначной связи с медицинской картой в базе 1С. Важно понимать, что Telegram не отдает номер телефона автоматически из соображений конфиденциальности.

Способ 1: Использование кнопки запроса контакта (Real Phone Number)

Это самый надежный способ получить верифицированный номер телефона. Мы не просим пользователя вводить цифры вручную (их можно подделать), а запрашиваем специальную кнопку «Поделиться контактом». Разберем, как это реализовать программно.

Для того чтобы бот предложил пользователю отправить свой номер, необходимо сформировать специальную структуру клавиатуры. Выясним, как это выглядит в коде 1С:


// Формируем структуру кнопки запроса контакта
Кнопка = Новый Структура;
Кнопка.Вставить("text", "Подтвердить номер телефона");
Кнопка.Вставить("request_contact", Истина);

// Формируем массив кнопок (клавиатуру)
МассивКнопок = Новый Массив;
МассивКнопок.Добавить(Кнопка);

СтрокаКнопок = Новый Массив;
СтрокаКнопок.Добавить(МассивКнопок);

Клавиатура = Новый Структура;
Клавиатура.Вставить("keyboard", СтрокаКнопок);
Клавиатура.Вставить("resize_keyboard", Истина);
Клавиатура.Вставить("one_time_keyboard", Истина);

Важный момент: при получении ответа от пользователя необходимо проверить вложения сообщения. Если пользователь нажал на кнопку, в объекте сообщения появится ключ contact. Проанализируем фрагмент кода для обработки входящего контакта:


// Обработка входящего сообщения в Системе взаимодействия
Если ВложенияСообщения.Получить("contact") <> Неопределено Тогда
    // Пользователь прислал контактные данные
    ДанныеКонтакта = Сообщение.contact;
    НомерТелефона = ДанныеКонтакта.phone_number;
    
    // Обязательно проверяем, что это номер именно этого пользователя, 
    // а не пересланный контакт другого лица
    Если ДанныеКонтакта.user_id = Сообщение.from.id Тогда
        // Номер верифицирован, можно привязывать к пациенту в 1С
        ЗарегистрироватьПациентаПоНомеру(НомерТелефона, Сообщение.ChatID);
    КонецЕсли;
    
    // После получения номера клавиатуру лучше удалить
    УдалитьКлавиатуру(Сообщение.ChatID);
КонецЕсли;

Способ 2: Использование параметров запуска (Deep Linking)

Если мы хотим идентифицировать пациента еще до того, как он отправит контакт, мы можем использовать механизм «глубоких ссылок». Рассмотрим ситуацию: при оформлении заказа в клинике 1С генерирует уникальный идентификатор (GUID) для данного визита. Мы можем зашить его в QR-код в виде ссылки: t.me/my_medical_bot?start=ABC123XYZ.

Когда пациент перейдет по этой ссылке и нажмет «Старт», 1С получит сообщение /start ABC123XYZ. Проанализируем преимущества этого подхода: нам не нужно запрашивать номер телефона, если мы точно знаем, кому выдали этот конкретный QR-код. Это значительно упрощает пользовательский путь.

Особенности интеграции через Систему взаимодействия vs Direct API

Стоит отметить, что штатные средства Системы взаимодействия 1С (объект СистемаВзаимодействия.СоздатьСообщение()) ориентированы на упрощенную работу. Для отправки сложных объектов, таких как ReplyKeyboardMarkup (кнопки с запросом контакта), зачастую приходится использовать прямые HTTP-запросы к Telegram Bot API. Выясним причину: СВ выступает посредником и может «срезать» часть специфических полей Telegram. Если стандартный метод SendMessage в СВ не поддерживает передачу структуры клавиатуры, используйте HTTPСоединение для отправки POST-запроса на api.telegram.org.

Вопросы безопасности и защиты персональных данных (ФЗ-152)

Передача медицинских данных (результатов анализов) накладывает серьезную юридическую ответственность. Помните, что Telegram не является сертифицированным средством защиты информации в РФ. Рассмотрим рекомендации по безопасной передаче:

  1. Не присылайте текст анализов в теле сообщения. Лучше отправить уведомление: «Ваш результат готов».
  2. Используйте защищенные файлы. Если вы отправляете PDF, программно устанавливайте на него пароль (например, последние цифры номера паспорта пациента).
  3. Одноразовые ссылки. Присылайте ссылку на защищенный личный кабинет клиники, где требуется дополнительная авторизация.

Техническая отладка бота

Разберем, почему отладка может «не цепляться» к боту. Поскольку Система взаимодействия работает на стороне сервера 1С, обработка входящих сообщений происходит в фоновых заданиях. Чтобы проанализировать поведение кода, необходимо выполнить следующие действия:

Таким образом, организовать идентификацию можно либо через активное действие пользователя (отправка контакта), либо через предварительную подготовку ссылки (Deep Linking). Комбинация этих методов обеспечит максимальное удобство для пациента и надежность данных для клиники.

← На главную