В процессе автоматизации розничной торговли часто возникает потребность в «ручном управлении» скидками. Типичный сценарий: кассир в режиме Рабочего места кассира (РМК) хочет предоставить покупателю скидку, превышающую его полномочия, и для этого требуется мгновенное подтверждение от руководителя. Рассмотрим, как реализовать механизм, при котором руководитель получает уведомление на мобильный телефон и одним нажатием кнопки разрешает или отклоняет применение скидки.
Для реализации данной задачи в 1С:Розница 2.2 можно выделить три основных пути, каждый из которых имеет свои преимущества и технические нюансы:
Рассмотрим подробно каждый из этих вариантов, разберем необходимые настройки и примеры программного кода.
Этот вариант считается оптимальным, так как мессенджер Telegram уже установлен у большинства руководителей. Мы будем использовать Inline-кнопки, которые позволяют отправить ответ в 1С прямо из чата.
Шаг 1: Создание регистра сведений для очереди запросов.
Для начала создадим регистр сведений ОчередьСогласованияСкидок. В нем будем хранить уникальный идентификатор запроса (GUID), данные чека, сумму скидки и текущий статус (Ожидает, Разрешено, Отклонено).
Шаг 2: Отправка сообщения из РМК.
В модуле формы РМК при нажатии кнопки «Запросить скидку» необходимо создать запись в регистре и отправить HTTP-запрос к Telegram API. Проанализируем пример кода для отправки сообщения:
Процедура ОтправитьЗапросВTelegram(ИдентификаторЗапроса, ТекстСообщения)
Токен = "ВАШ_ТОКЕН_БОТА";
ID_Чата = "ID_РУКОВОДИТЕЛЯ";
// Формируем кнопки
Кнопки = "[{'text': 'Разрешить', 'callback_data': 'allow_" + ИдентификаторЗапроса + "'},
{'text': 'Отказать', 'callback_data': 'deny_" + ИдентификаторЗапроса + "'}]";
Клавиатура = "{'inline_keyboard': [" + Кнопки + "]}";
ПараметрыЗапроса = "chat_id=" + ID_Чата + "&text=" + ТекстСообщения + "&reply_markup=" + Клавиатура;
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage?" + ПараметрыЗапроса);
Ответ = Соединение.Получить(Запрос);
КонецПроцедуры
Шаг 3: Обработка ответа через HTTP-сервис.
Для получения ответа от Telegram нужно опубликовать HTTP-сервис в основной базе 1С. Telegram будет присылать Webhook-запрос при нажатии кнопки. В обработчике этого сервиса мы находим запись в ОчередьСогласованияСкидок по Идентификатору и меняем статус.
Если шеф настаивает на использовании именно 1С-приложения, нам потребуется реализовать связку: Основная база — HTTP-сервис — Push-сервис — Мобильное приложение.
Важный технический нюанс: Как было отмечено в обсуждении на форуме, само мобильное приложение на Android/iOS не может выступать в роли сервера (принимать входящие HTTP-запросы). Оно должно либо само опрашивать базу (что неэффективно), либо получать Push-уведомления.
Разберем алгоритм настройки Push-уведомлений:
ДоставитьПушУведомление.HTTP-сервис (используя HTTPСоединение).Пример отправки уведомления из основной базы:
Процедура ОтправитьPush(ИдентификаторПодписчика, Текст)
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Текст = Текст;
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещениеДоставляемогоУведомления.ПоУмолчанию;
// ИдентификаторПодписчика получается при регистрации мобильного приложения в сервисе Push
ДоставитьПушУведомление(ИдентификаторПодписчика, Уведомление);
КонецПроцедуры
Выясним, как кассир узнает о решении шефа. Чтобы не блокировать интерфейс 1С и не заставлять программу «зависать» в ожидании ответа, необходимо использовать Обработчик ожидания.
Алгоритм действий в РМК:
ОжиданиеСогласования = Истина.ПодключитьОбработчикОжидания("ПроверитьСтатусСкидки", 5); (проверка каждые 5 секунд).ПроверитьСтатусСкидки выполняется запрос к регистру сведений.Проанализируем пример кода для проверки статуса:
Процедура ПроверитьСтатусСкидки() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Очередь.Статус
|ИЗ
| РегистрСведений.ОчередьСогласованияСкидок КАК Очередь
|ГДЕ
| Очередь.ИдентификаторЗапроса = &Идентификатор";
Запрос.УстановитьПараметр("Идентификатор", ТекущийИдентификаторЗапроса);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Если Результат.Статус = Перечисления.СтатусыСогласования.Разрешено Тогда
ОтключитьОбработчикОжидания("ПроверитьСтатусСкидки");
ПрименитьСкидкуВРМК();
СообщитьПользователю("Скидка подтверждена!");
ИначеЕсли Результат.Статус = Перечисления.СтатусыСогласования.Отклонено Тогда
ОтключитьОбработчикОжидания("ПроверитьСтатусСкидки");
СообщитьПользователю("В скидке отказано.");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для работы любого из предложенных вариантов (кроме SMS, который является устаревшим и дорогим) ваша база 1С:Розница должна быть опубликована на веб-сервере (Apache или IIS). Рассмотрим важные моменты безопасности:
https. Это защитит данные, передаваемые между 1С и Telegram или мобильным приложением.Robot_Mobile) с минимальными правами, необходимыми только для работы с конкретными HTTP-сервисами и регистрами.Резюме: Если вам нужно внедрить функционал максимально быстро, используйте Telegram-бота. Это избавит вас от необходимости поддержки мобильных платформ (Android/iOS) и обеспечит мгновенную доставку уведомлений руководителю. Если же требуется интеграция в существующее мобильное приложение компании, используйте Push-уведомления и HTTP-сервисы, не забывая про асинхронную обработку ответов в РМК через обработчики ожидания.