Интеграция 1С с облачными АТС (такими как Mango Office, Zadarma, UIS или Телфин) — это классическая задача для современной автоматизации торговли. Основная сложность в случае с 1С:Управление торговлей 10.3 заключается в том, что конфигурация построена на обычных формах, в то время как облачные сервисы ориентированы на работу через Webhooks и REST API. Рассмотрим подробнее, как реализовать стабильный прием данных, несмотря на почтенный возраст конфигурации.
Когда в облачную АТС поступает входящий звонок, она должна «уведомить» об этом вашу базу 1С. Для этого АТС отправляет HTTP-запрос (обычно POST или GET) с данными в формате JSON или CSV на определенный адрес. Проанализируем, что нам понадобится для реализации этой схемы:
Для начала нам необходимо развернуть веб-сервер. Проанализируем важный технический нюанс: разрядность Apache должна строго совпадать с разрядностью установленного модуля расширения веб-сервера 1С. Если вы используете 64-битную платформу 1С, Apache также должен быть 64-битным.
После установки Apache выполним публикацию базы через конфигуратор: Администрирование -> Публикация на веб-сервере. На вкладке «HTTP-сервисы» необходимо отметить созданный нами сервис (о нем ниже). В результате будет создан файл default.vrd, в котором прописываются параметры доступа.
Перейдем в дерево метаданных и создадим новый объект HTTP-сервис. Выясним причину, по которой стоит выбрать именно HTTP-сервис, а не Web-сервис (SOAP): облачные АТС в 99% случаев используют простую REST-архитектуру, передавая данные в JSON. HTTP-сервисы 1С идеально подходят для таких задач.
Создадим шаблон URL (например, /callback/*) и метод POST. Пример серверного кода для приема данных:
Функция ПринятьУведомлениеОЗвонке(Запрос)
// Получаем тело запроса в виде строки
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
// Проанализируем полученные данные (JSON)
ДанныеЗвонка = РаспаковатьJSON(ТелоЗапроса);
// Записываем данные в промежуточный регистр сведений
НоваяЗапись = РегистрыСведений.ВходящиеЗвонкиАТС.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.НомерТелефона = ДанныеЗвонка.phone;
НоваяЗапись.ИдентификаторЗвонка = ДанныеЗвонка.call_id;
НоваяЗапись.Ответственный = НайтиОтветственногоПоТелефону(ДанныеЗвонка.ext_number);
НоваяЗапись.Записать();
// Возвращаем АТС ответ 200 OK
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
Посмотрим на ситуацию с парсингом данных. Если ваша платформа 1С версии 8.3.6 или выше, используйте встроенные средства:
Функция РаспаковатьJSON(СтрокаJSON)
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Результат = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Возврат Результат;
КонецФункции
Если же вы вынуждены работать на более старой платформе, где ЧтениеJSON отсутствует, можно воспользоваться MSScriptControl.ScriptControl для разбора строки через JScript, что гораздо надежнее посимвольного перебора.
Выясним, как вывести карточку звонка менеджеру. Поскольку HTTP-сервис работает в «тихом» режиме на сервере, он не имеет доступа к интерфейсу пользователя. Рассмотрим решение через обработчик ожидания:
ВходящиеЗвонки), куда HTTP-сервис будет записывать информацию о каждом событии звонка.Пример кода в модуле приложения для обычных форм:
Процедура ПриНачалеРаботыСистемы()
// Подключаем опрос регистра каждые 2 секунды
ПодключитьОбработчикОжидания("ПроверитьВходящиеЗвонки", 2);
КонецПроцедуры
Процедура ПроверитьВходящиеЗвонки() Экспорт
// Ищем в регистре записи, предназначенные текущему пользователю
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ РегистрСведений.ВходящиеЗвонки
ГДЕ Ответственный = &ТекущийПользователь И Обработан = ЛОЖЬ";
Запрос.УстановитьПараметр("ТекущийПользователь", глЗначениеПеременной("глТекущийПользователь"));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
// Открываем форму звонка
ОткрытьФорму("Обработка.КарточкаЗвонка.Форма", Новый Структура("Номер", Выборка.НомерТелефона));
// Помечаем запись как обработанную
Менеджер = РегистрыСведений.ВходящиеЗвонки.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Менеджер, Выборка);
Менеджер.Обработан = Истина;
Менеджер.Записать();
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию с авторизацией, упомянутую на форуме. При обращении АТС к вашему веб-сервису, система может вернуть ошибку 401 Unauthorized. Чтобы этого избежать, необходимо:
robot_ats) с минимальными правами (только на чтение/запись нужного регистра и использование HTTP-сервиса).http://login:password@yourdomain.com/base/hs/callback.default.vrd на веб-сервере, чтобы публикация всегда работала под этим пользователем.Важный момент: использование протокола HTTPS крайне рекомендуется. Данные о номерах телефонов клиентов являются персональными данными, и их передача в открытом виде через HTTP небезопасна.
Если настройка веб-сервера и проброс портов кажутся слишком сложными, проанализируем другой путь. Многие операторы (например, Mango или Zadarma) предоставляют готовые внешние компоненты (DLL). Такая компонента подключается непосредственно в сеансе пользователя 1С, сама держит соединение с облаком и генерирует ВнешнееСобытие. В этом случае УТ 10.3 ловит событие в процедуре ОбработкаВнешнегоСобытия, и никакой Apache не требуется. Однако этот метод требует, чтобы у каждого менеджера был стабильный интернет-канал и загруженная компонента.
Таким образом, выбор между созданием собственного HTTP-сервиса и использованием внешней компоненты зависит от ваших навыков администрирования и требований к надежности системы.