Разработка мобильного приложения для клиентов компании (например, для пациентов медицинской клиники, покупателей интернет-магазина или заказчиков услуг) — отличный способ повысить лояльность аудитории и автоматизировать бизнес-процессы. Однако при использовании платформы 1С:Предприятие в качестве технологической основы разработчики и руководители проектов часто сталкиваются с важными вопросами: как лицензируется такое приложение, нужно ли платить фирме "1С" за каждого пользователя, и как правильно спроектировать обмен данными, чтобы система работала быстро и стабильно?
В этой статье мы подробно разберем все юридические и технические аспекты создания клиентских мобильных приложений на платформе 1С, проанализируем архитектурные подходы и приведем практические примеры реализации ключевых механизмов.
Первый и самый важный вопрос, который возникает при проектировании: нужно ли покупать лицензии для каждого клиента, установившего приложение? Чтобы ответить на него, необходимо четко разграничить понятия "Тиражное" и "Заказное" решение в терминологии фирмы "1С", а также выбрать правильную технологию сборки приложения.
Рассмотрим два основных технологических варианта, которые предлагает платформа 1С для мобильных устройств:
Согласно официальным правилам лицензирования фирмы "1С" для мобильной платформы:
Мобильной платформы для неограниченного круга лиц (пациентов, покупателей) и распространяете его бесплатно через маркеты приложений (App Store, Google Play, RuStore и др.), то никаких лицензионных соглашений с фирмой "1С" заключать не требуется, никаких финансовых обязательств перед "1С" у вас не возникает. Вы можете иметь сотни тысяч пользователей абсолютно бесплатно.Таким образом, приложение для записи пациентов на прием, распространяемое бесплатно среди клиентов больницы, классифицируется как бесплатное тиражное решение для третьих лиц. Лицензирование со стороны "1С" для него полностью бесплатно.
Часто возникает вопрос: если клиент записывается на платный прием через приложение и оплачивает его банковской картой прямо в интерфейсе — считается ли это монетизацией приложения, требующей отчислений в пользу "1С"?
Выясним позицию правообладателя. Под монетизацией программного обеспечения понимается извлечение прибыли непосредственно от дистрибуции самого приложения или его цифровых функций:
Если же через мобильное приложение продаются реальные физические услуги или товары компании (в нашем случае — медицинские услуги, приемы врачей, анализы), это является стандартным каналом продаж бизнеса. Само приложение остается бесплатным инструментом доступа к услугам. Никаких финансовых обязательств и роялти перед фирмой "1С" в этом случае не возникает.
Проанализируем техническую состоятельность платформы. Бытует мнение, что мобильная база 1С слишком "тяжелая" и не справится с нагрузкой на слабом смартфоне. Практика показывает обратное.
Мобильная платформа 1С использует легковесную базу данных SQLite. Локальная база на устройстве пациента должна содержать минимальный объем информации:
Разберем по шагам создание архитектуры обмена данными. Традиционный подход разработчиков 1С, основанный на использовании объекта ПланыОбмена и регистрации изменений для каждого узла (устройства), имеет колоссальный недостаток при работе с внешними клиентами.
Представьте, что у вас 20 000 зарегистрированных пациентов. Если для каждого из них в центральной базе будет создан узел плана обмена, таблицы регистрации изменений разрастутся до гигантских размеров. Любое обновление каталога услуг или расписания приведет к записи миллионов строк в таблицы регистрации изменений, что парализует работу СУБД центральной базы.
Правильное архитектурное решение: организация обмена через легковесные HTTP-сервисы (REST API), развернутые на стороне центральной базы 1С.
В этом сценарии мобильное приложение не хранит всю базу данных клиники и не синхронизирует ее целиком. Вместо этого оно отправляет точечные запросы на сервер. Рассмотрим подробнее, как это реализуется программно.
В конфигурации центральной базы создается объект HTTP-сервис с шаблоном URL /v1/schedule. Ниже приведен пример серверного кода, обрабатывающего GET-запрос от мобильного приложения для получения свободных слотов времени врача:
Функция ПолучитьРасписаниеВрача(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Получаем параметры запроса из URL
IDВрача = Запрос.ПараметрыЗапроса.Получить("doctor_id");
ДатаПриема = Запрос.ПараметрыЗапроса.Получить("date");
// Преобразуем входящую дату из формата YYYY-MM-DD
ДатаПриемаКурс = Дата(СтрЗаменить(ДатаПриема, "-", ""));
// Формируем запрос к регистрам или документам центральной базы
ЗапросКБ = Новый Запрос;
ЗапросКБ.Текст =
"ВЫБРАТЬ
| СвободноеВремяПриема.ВремяНачала КАК Время
|ИЗ
| РегистрСведений.СвободноеВремяПриема КАК СвободноеВремяПриема
|ГДЕ
| СвободноеВремяПриема.Врач.Идентификатор = &IDВрача
| И НАЧАЛОПЕРИОДА(СвободноеВремяПриема.Дата, ДЕНЬ) = &ДатаПриема";
ЗапросКБ.УстановитьПараметр("IDВрача", IDВрача);
ЗапросКБ.УстановитьПараметр("ДатаПриема", ДатаПриемаКурс);
РезультатЗапроса = ЗапросКБ.Выполнить().Выгрузить();
// Сериализуем данные в массив структур для JSON
МассивВремени = Новый Массив;
Для Каждого Строка Из РезультатЗапроса Цикл
СтруктураВремени = Новый Структура;
СтруктураВремени.Вставить("time", Формат(Строка.Время, "ДФ=ЧЧ:мм"));
СтруктураВремени.Вставить("available", Истина);
МассивВремени.Добавить(СтруктураВремени);
КонецЦикла;
// Записываем ответ в тело HTTP-ответа в формате JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивВремени);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
В мобильном приложении, когда пользователь нажимает кнопку "Подтвердить запись", отрабатывает процедура отправки POST-запроса на веб-сервер клиники:
&НаКлиенте
Процедура ЗаписатьсяНаПриемНаСервере(ДанныеЗаписи)
// ДанныеЗаписи - это структура, содержащая ID врача, дату, время и данные пациента
// Настраиваем защищенное соединение SSL
Защита = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("api.myclinic.ru", 443, , , , 15, Защита);
HTTPЗапрос = Новый HTTPЗапрос("/v1/book");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Сериализуем структуру данных в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаписи);
СтрокаJSON = ЗаписьJSON.Закрыть();
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
HTTPОтвет = Соединение.ОтправитьДляОбъекта(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Или HTTPОтвет.КодСостояния = 201 Тогда
// Успешно записано
ПоказатьПредупреждение(, "Вы успешно записаны на прием!");
Иначе
// Сервер вернул ошибку обработки
ПоказатьПредупреждение(, "Не удалось записаться: " + HTTPОтвет.ПолучитьТелоКакСтроку());
EndIf;
Исключение
// Ошибка сети или недоступности сервера
ПоказатьПредупреждение(, "Ошибка связи с сервером. Пожалуйста, попробуйте позже.");
КонецПопытки;
КонецПроцедуры
Такой подход полностью разгружает базу данных мобильного устройства и не перегружает транзакционную систему центральной базы метаданными планов обмена. Все обращения происходят в реальном времени ("на лету"), что обеспечивает актуальность отображаемого расписания и исключает проблему "двойной записи" на одно и то же время.
Запись на прием часто требует внесения предоплаты. Насколько сложно реализовать онлайн-эквайринг в мобильном приложении на 1С? На практике это решается стандартными механизмами интеграции с платежными шлюзами.
Разберем классический сценарий интеграции через технологию WebView с использованием встроенного элемента управления 1С ПолеHTMLДокумента:
ПолеHTMLДокумента, и перенаправляет пользователя по этой ссылке.Пример кода мобильного приложения для инициализации формы оплаты в элементе ПолеHTMLДокумента:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем платежную ссылку, переданную в параметрах формы
ПараметрСсылка = Параметры.СсылкаНаОплату;
// Загружаем страницу платежного шлюза банка в элемент формы
АдресПлатежнойСтраницы = ПараметрСсылка;
КонецПроцедуры
В модуле формы мобильного приложения достаточно разместить реквизит типа Строка, связанный с элементом формы ПолеHTMLДокумента, и присвоить ему полученный URL. Это надежный и безопасный способ, так как данные банковских карт не проходят через инфраструктуру 1С и обрабатываются исключительно на стороне серверов банка, соответствующих стандартам безопасности PCI DSS.
Подводя итоги нашего анализа, можно сделать следующие выводы:
ПолеHTMLДокумента позволяет легко внедрить любой современный интернет-эквайринг или СБП непосредственно внутрь мобильного интерфейса 1С.Таким образом, мобильная платформа 1С предоставляет все необходимые инструменты для быстрого и бюджетного старта разработки клиентских сервисов силами штатных программистов компании.