Как реализовать элемент оценки звездочками в мобильном приложении 1С

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

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

Разберем подробнее, какими способами можно реализовать интерактивную шкалу рейтинга со звездочками типовыми и комбинированными средствами платформы 1С.

Способ 1. Группа кнопок с динамической сменой картинок

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

Разберем по шагам алгоритм настройки формы:

  1. Добавим на управляемую форму реквизит ТекущаяОценка с типом Число (длина 1, точность 0).
  2. Создадим группу элементов формы с видом Обычная группа без выделения и установим для нее горизонтальную группировку, а также выравнивание по центру формы.
  3. Внутри группы создадим пять кнопок: КнопкаЗвезда1, КнопкаЗвезда2, КнопкаЗвезда3, КнопкаЗвезда4 и КнопкаЗвезда5.
  4. Для каждой кнопки отключим отображение текста и назначим общую команду или индивидуальные команды, передающие в параметре выбранный балл (от 1 до 5).
  5. В конфигурацию загрузим две картинки: пустую звезду (контур) и закрашенную звезду (активное состояние).

Посмотрим на пример процедуры, которая обновляет отображение звезд при выборе оценки пользователем:


&НаКлиенте
Процедура УстановитьОценку(ВыбранныйБалл)
    
    ТекущаяОценка = ВыбранныйБалл;
    
    Для Индекс = 1 По 5 Цикл
        ИмяКнопки = "КнопкаЗвезда" + Индекс;
        ЭлементКнопка = Элементы[ИмяКнопки];
        
        Если Индекс <= ТекущаяОценка Тогда
            ЭлементКнопка.Картинка = БиблиотекаКартинок.ЗвездаАктивная;
        Иначе
            ЭлементКнопка.Картинка = БиблиотекаКартинок.ЗвездаНеактивная;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Этот метод полностью опирается на типовой функционал платформы, не требует внешних библиотек и стабильно работает на любых мобильных операционных системах.

Способ 2. Использование символов Юникода и форматированной строки

Проанализируем альтернативный вариант, который не требует подготовки отдельных графических файлов и иконок. Мы можем воспользоваться встроенными символами Юникода: закрашенной звездой (★, код U+2605) и полой звездой (☆, код U+2606).

Для создания интерактивного интерфейса применим объект ФорматированнаяСтрока в элементе формы с видом Поле надписи. Каждая звезда оформляется как гиперссылка с уникальным URL-адресом:


&НаКлиенте
Процедура ОбновитьЗвездыФорматированнойСтрокой()
    
    Компоненты = Новый Массив;
    
    Для Индекс = 1 По 5 Цикл
        СимволЗвезды = ?(Индекс <= ТекущаяОценка, "★ ", "☆ ");
        Компоненты.Добавить(Новый ФорматированнаяСтрока(СимволЗвезды, , , , "e1cib/rating/" + Индекс));
    КонецЦикла;
    
    Элементы.ПолеНадписьРейтинг.Заголовок = Новый ФорматированнаяСтрока(Компоненты);
    
КонецПроцедуры

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


&НаКлиенте
Процедура ПолеНадписьРейтингНажатие(Элемент, СтандартнаяОбработка, URL)
    
    СтандартнаяОбработка = Ложь;
    
    Префикс = "e1cib/rating/";
    Если СтрНачинаетсяС(URL, Префикс) Тогда
        ЗначениеОценки = Число(Сред(URL, СтрДлина(Префикс) + 1));
        УстановитьОценку(ЗначениеОценки);
        ОбновитьЗвездыФорматированнойСтрокой();
    КонецЕсли;
    
КонецПроцедуры

Преимущества данного способа: текст с символами Юникода идеально масштабируется платформой под любое разрешение мобильного экрана и размер системного шрифта без искажений и размытия растровой графики.

Способ 3. Интерактивный компонент через ПолеHTMLДокумента

Если требуется реализовать плавную CSS-анимацию при наведении и нажатии, а также отображение дробных оценок (например, 3.5 или 4.2), типовых элементов формы может быть недостаточно. В этом случае мы можем применить элемент формы ПолеHTMLДокумента.

Разберем особенности этой реализации:

  1. HTML-разметка генерируется динамически с использованием векторных иконок SVG или символов шрифтов.
  2. События клика по звездам обрабатываются на стороне JavaScript и передаются в платформу 1С через перехват навигации по специальной ссылке (URL-схеме).
  3. При верстке обязательно задается метатег viewport, отключающий масштабирование и нежелательную прокрутку при касании экрана пользователем.

Следует учитывать, что использование веб-компонента увеличивает потребление оперативной памяти на мобильном устройстве и может создавать небольшую задержку при первой отрисовке формы.

Оценка приложения в магазинах Google Play и App Store

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

Штатные диалоговые окна оценки внутри приложения (Google Play In-App Review API и StoreKit SKStoreReviewController) нельзя вызвать средствами только встроенного языка 1С. Для отображения нативного системного диалога потребуется разработка внешней компоненты по технологии Native API и подключение ее через Сборщик мобильных приложений.

Если внешняя компонента не используется, стандартным решением является перенаправление пользователя на страницу приложения в магазине с помощью метода ЗапуститьПриложение() с передачей URI схемы маркета:


&НаКлиенте
Процедура ОткрытьСтраницуВМагазине()
    
    #Если МобильноеПриложениеКлиент Тогда
        // Для платформы Android переходим по нативной схеме маркета
        ЗапуститьПриложение("market://details?id=com.example.myapp");
    #КонецЕсли
    
КонецПроцедуры

Таким образом, для хранения рейтинга внутри информационной базы наиболее надежным и быстрым вариантом остается горизонтальная группа кнопок со сменой картинок либо поле надписи с форматированной строкой.

← На главную