Файл: Методические указания к лабораторным работам по дисциплине Разработка интеллектуальных мобильных приложений и чатботов Самара 2021.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 20.03.2024

Просмотров: 134

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Возврат
Справочники
ПричиныОтказа
ПустаяСсылка
();
КонецФункции
Итоговые суммы заказанных товаров
Теперь улучшим внешний вид таблицы, содержащей список заказанных товаров. Под таблицей хорошо бы видеть общую сумму и количество товаров.
Для этого можно было бы просто отобразить в форме стандартные итоговые поля табличной части из основного реквизита формы. Но в данном случае нам это не подходит, так как мы хотим видеть итоговые суммы заказанных товаров без учета товаров, от которых клиент отказался.
Поэтому создадим реквизиты формы КоличествоИтог (типа Число 10) и СуммаИтог (типа Число 10,2) и перетащим их в дерево элементов формы в группу СписокТоваров после таблицы Товары.
Установим для соответствующих элементов формы свойство Вид в значение Поле надписи.
Добавление итоговых сумм в форму
Для расчета итоговых сумм по табличной части документа мы создадим следующую процедуру.
&НаСервере
Процедура
ПересчитатьИтоговуюСумму
()

СуммаИтог
=
0
;
КоличествоИтог
=
0
;
Для
Каждого
ТекущаяСтрока
Из
Объект
Товары
Цикл
Если
ТекущаяСтрока
Отказ
=
Ложь
Тогда
СуммаИтог
=
СуммаИтог
+
ТекущаяСтрока
Сумма
;
КоличествоИтог
=
КоличествоИтог
+
ТекущаяСтрока
Количество
;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В данной процедуре мы обходим в цикле табличную часть документа
(Объект.Товары) и накапливаем итоговые значения в реквизитах формы КоличествоИтог и СуммаИтог в том случае, если у товара нет отметки об отказе.
Процедуру для пересчета итоговых сумм табличной части будем вызывать каждый раз при изменении цены и количества товара, при перевыборе товара, а также при изменении информации об отказе от товара.
Соответственно в процедуры ТоварыКоличествоПриИзменении(),
ТоварыЦенаПриИзменении(), ТоварыТоварПриИзменении(), Товары1ОтказП
риИзменении() последней строкой нужно добавить процедуру
ПересчитатьИтоговуюСумму().
Кроме того, создадим обработчик события формы
ПриСозданииНаСервере и также поместим туда процедуру для пересчета итогов.
&НаСервере
Процедура
ПриСозданииНаСервере
(
Отказ
,
СтандартнаяОбработка
)
ПересчитатьИтоговуюСумму
();
КонецПроцедуры
В результате при открытии заказа под списком заказанных товаров курьер будет видеть итоговое количество и сумму без учета товаров, от которых клиент отказался. И при любых изменениях в табличной части эти итоги будут пересчитываться.


Список заказанных товаров с итоговыми суммами
При подсчете итоговых сумм в заказе для упрощения сделано одно допущение. Если клиент отказывается от товара, то считается, что он не берет сразу все количество товара, которое заказано.
Работа с клиентами
Теперь реализуем необходимые функции для работы с клиентами непосредственно из формы заказа. Было бы удобно, чтобы, не закрывая заказа, курьер мог добавить нового клиента, для которого создается заказ, позвонить или отправить СМС клиенту.
Чтобы реализовать эти функции в форме заказа, на закладке Команды добавим команды Позвонить и ОтправитьСМС.
Что касается добавления клиента, то это стандартная функциональность мобильной платформы, и здесь нам ничего делать не придется, за исключением изменения адреса доставки.
Добавление нового клиента

Мобильная платформа предоставляет удобную возможность добавления новых элементов справочников при вводе по строке в соответствующих ссылочных полях.
Поэтому как только пользователь начинает вводить наименование клиента в поле заказа Клиент, под ним открывается выпадающий список вариантов ввода из элементов справочника Клиенты. Если подходящего наименования в справочнике нет, то можно нажать на кнопку создания (со значком «+») в правом нижнем углу выпадающего списка.
Добавление нового клиента из текущего заказа
При этом откроется форма для добавления нового клиента, а ссылка на этого клиента автоматически попадет в заказ. Было бы удобно, чтобы при добавлении нового клиента в заказ (или изменении уже существующего клиента) сразу же заполнялся адрес доставки исходя из адресных реквизитов клиента. Чтобы предоставить эту возможность, создадим обработчик события ПриИзменении для поля формы Клиент и поместим туда вызов функции для получения адреса доставки клиента.
&НаКлиенте
Процедура
КлиентПриИзменении
(
Элемент
)
Объект
АдресДоставки
=
ПолучитьАдресДоставки
(
Объект
Клиент
);
КонецПроцедуры

В этом обработчике мы вызываем серверную внеконтекстную функцию ПолучитьАдресДоставки(), которая возвращает адресные реквизиты клиента (Город, Улица, Дом и т. д.), перечисленные через запятую в одной строке, и заполняем ими реквизит АдресДоставки.
&НаСервереБезКонтекста
Функция
ПолучитьАдресДоставки
(
Клиент
)
АдресДоставки
=
СокрЛП
(
Клиент
Страна
)
+
",
"
+
СокрЛП
(
Клиент
Город
)
+
", "
+
СокрЛП
(
Клиент
Улица
)
+
",
"
+
СокрЛП
(
Клиент
Дом
)
+
", "
+
СокрЛП
(
Клиент
Квартира
);
Возврат
АдресДоставки
;
КонецФункции
Таким образом, при добавлении нового клиента в заказ курьер сразу же получает его адрес доставки, заполненный исходя из адресных реквизитов клиента. После этого он может вручную откорректировать это поле в заказе.
Для примера рассмотрим следующую ситуацию. Курьер доставил заказ клиенту. Родственник, сослуживец или знакомый клиента решил заказать себе те же самые товары.
Тогда курьер выполняет команду Скопировать из меню функций в правом верхнем углу формы заказа (кнопка
). Содержимое заказа копируется в новый заказ. Дальше курьеру нужно добавить нового клиента, для которого создается заказ. Для этого курьер нажимает на наименование клиента и затем на кнопку со значком «+» в появившемся окне под этим полем.
В появившейся форме создания клиента он заполняет данные на нового клиента и нажимает кнопку Готово в правом верхнем углу формы.


Добавление нового заказа и нового клиента из текущего заказа
После этого новый клиент и адрес доставки, составленный из адресных реквизитов клиента, попадают в заказ.
Добавление нового заказа и нового клиента из текущего заказа

Связь с клиентом
Теперь добавим в форму заказа команды, с помощью которых можно позвонить клиенту или написать ему сообщение. Для этого используются возможности сотовой связи, которые поддерживаются не всеми мобильными устройствами. В частности, у нашего планшета такой возможности нет, однако соответствующие функции предусмотрены в нашем мобильном приложении.
Перетащим команды Позвонить и ОтправитьСМС в командную панель формы. В командной панели формы появятся соответствующие кнопки для выполнения этих команд.
Здесь также будем действовать по принципу минимизации командного интерфейса формы. Не стоит нагружать форму командами, которые могут и не понадобиться. Поэтому сделаем так, чтобы команда Отправить
СМС была видна только в меню функций, вызывающемся кнопкой в правом верхнем углу заказа. Для этого установим в палитре свойств кнопки командной панели ФормаОтправитьСМС свойство ТолькоВоВсехДействиях в значение Да.
Палитра свойств кнопки «ФормаОтправитьСМС»

Команда Позвонить будет по умолчанию видна в командной панели формы. Чтобы сделать ее более компактной и «симпатичной», зададим ее отображение в виде картинки со значком телефонной трубки. Поскольку подходящей картинки в библиотеке стандартных картинок платформы нет, добавим соответствующую картинку в общие картинки нашего мобильного приложения.
Добавление картинки «Позвонить» в общие картинки конфигурации
После этого в палитре свойств команды Позвонить установим эту картинку в поле Картинка.

Палитра свойств команды «Позвонить»
В результате форма заказа в редакторе формы примет следующий вид.
Форма заказа в редакторе формы
Затем создадим клиентские обработчики для команд
Позвонить и ОтправитьСМС и заполним их следующим образом.
&НаКлиенте
Процедура
Позвонить
(
Команда
)
Если
ЗначениеЗаполнено
(
Объект
Клиент
)
Тогда
Телефон
=
ПолучитьТелефон
(
Объект
Клиент
);
Если
ЗначениеЗаполнено
(
Телефон
)
Тогда

СредстваТелефонии
НабратьНомер
(
Телефон
,
Ложь);
Иначе
Сообщение
=
Новый
СообщениеПользователю
();
Сообщение
Текст
=
"Не указан телефон клиента!"
;
Сообщение
Поле
=
"Объект.Клиент"
;
Сообщение
Сообщить
();
КонецЕсли
Иначе
Сообщение
=
Новый
СообщениеПользователю
();
Сообщение
Текст
=
"Клиент не выбран!"
;
Сообщение
Поле
=
"Объект.Клиент"
;
Сообщение
Сообщить
();
КонецЕсли
КонецПроцедуры
Обработчик команды «ОтправитьСМС»
&НаКлиенте
Процедура
ОтправитьСМС
(
Команда
)
Если
ЗначениеЗаполнено
(
Объект
Клиент
)
Тогда
Телефон
=
ПолучитьТелефон
(
Объект
Клиент
);
Если
ЗначениеЗаполнено
(
Телефон
)
Тогда
Сообщение
=
Новый
SMSСообщение
();
Сообщение
Получатели
Добавить
(
Телефон
);
СредстваТелефонии
ПослатьSMS
(
Сообщение
,
Истина);
Иначе
Сообщение
=
Новый
СообщениеПользователю
();
Сообщение
Текст
=
"Не указан телефон клиента"
;
Сообщение
Поле
=
"Объект.Клиент"
;
Сообщение
Сообщить
();
КонецЕсли
Иначе
Сообщение
=
Новый
СообщениеПользователю
();
Сообщение
Текст
=
"Клиент не выбран!"
;
Сообщение
Поле
=
"Объект.Клиент"
;
Сообщение
Сообщить
();
КонецЕсли
КонецПроцедуры


В обработчиках обеих команд, в случае если поле заказа Клиент заполнено, вызывается серверная внеконтекстная функция ПолучитьТелефон() для получения телефона клиента.
&НаСервереБезКонтекста
Функция
ПолучитьТелефон
(
Клиент
)
Возврат
Клиент
Телефон
;
КонецФункции
Если телефон клиента заполнен, то выполняется звонок или отправка сообщения клиенту с помощью объекта глобального контекста
СредстваТелефонии, который предоставляет доступ к средствам телефонии на мобильном устройстве.
Для звонка клиенту в процедуре Позвонить() используется метод средств телефонии НабратьНомер, в который передается телефон клиента.
Поскольку мы передаем во втором параметре метода Ложь, при выполнении метода будет открыто приложение работы со звонками, в котором уже установлен заданный номер. Курьеру нужно будет только нажать кнопку начала вызова.
Для отправки СМС клиенту в процедуре ОтправитьСМС() используется метод средств телефонии ПослатьSMS. Сначала создается объект SMSСообщение, затем в свойство Получатели этого объекта добавляется телефон клиента. После этого вызывается метод средств телефонии ПослатьSMS, в который первым параметром передается объект SMSСообщение, а вторым Истина. При этом будет запущено системное приложение для отправки SMS-сообщений. Курьеру остается ввести текст сообщения и нажать кнопку отправки.
Следует иметь в виду, что объекты
СредстваТелефонии и SMSСообщение доступны только в мобильном приложении. Поэтому при синтаксической проверке текста модуля формы может возникнуть ошибка.
Но поскольку мы указали в свойстве конфигурации Назначение
использования значение Мобильное устройство, то параметры проверки
модулей (Сервис > Параметры > Модули > Проверка) уже стандартно включены только для мобильного приложения.
Параметры проверки текстов модулей
При этом надо учитывать, что вы сможете без ошибок сохранять конфигурацию базы данных и обновлять мобильное приложение, но работать это будет только на планшете, так как работа со средствами телефонии (а также с данными мультимедиа, средствами геопозиционирования и средствами почты, которые будут показаны дальше) возможна только на мобильном устройстве.
Если же вам хочется, чтобы мобильное приложение работало и на стационарном компьютере, то все части кода, где происходит обращение к средствам телефонии и т. п., нужно обрамлять с помощью директив препроцессору, указывающих, что выполнять компиляцию этих частей кода нужно только на мобильном клиенте.
&НаКлиенте
Процедура
Позвонить
(
Команда
)
Если
ЗначениеЗаполнено
(
Телефон
)
Тогда
#Если МобильноеПриложениеКлиент Тогда
СредстваТелефонии
НабратьНомер
(
Телефон
,
Ложь);
#КонецЕсли


Иначе

КонецПроцедуры
При открытии формы заказа установим доступность команд для работы со средствами телефонии только. Для этого создадим обработчик события формы ПриОткрытии и заполним его следующим образом.
&НаКлиенте
Процедура
ПриОткрытии
(
Отказ
)
Элементы
ФормаПозвонить
Доступность
=
СредстваТелефонии
Поддер живаетсяНаборНомера
();
Элементы
ФормаОтправитьСМС
Доступность
=
СредстваТелефонии
Под держиваетсяОтправкаSMS
(Истина);
КонецПроцедуры
В заключение установим в свойстве Требуемые разрешения мобильного
приложения необходимые разрешения для работы со средствами телефонии
(а также средствами мультимедиа, геопозиционирования, Puch- и локальными уведомлениями, которые мы рассмотрим позже) на мобильном устройстве.
Требуемые разрешения мобильного приложения

Дело в том, что мобильная платформа разработчика уже содержит все необходимые разрешения. Но когда мы будем собирать готовое мобильное приложение, эти разрешения необходимы, чтобы вся указанная в них специфика мобильных устройств могла работать и без мобильной платформы разработчика.
Ввод на основании
Теперь предоставим курьеру еще одну удобную возможность – ввода новых заказов на основании отдельных товаров и клиентов.
Для этого в окне редактирования объекта конфигурации
Документ Заказ на закладке Ввод на основании добавим справочники
Товары и Клиенты в список Вводится на основании.
Список объектов конфигурации, на основании которых вводится заказ
Это значит, что новый заказ можно будет ввести на основании элементов справочников товаров или клиентов. После этого в форме списка
(в контекстном меню строки списка) и в форме элемента этих справочников станет доступна команда Создать на основании > Заказ. При выполнении этой команды нам нужно обеспечить следующее заполнение заказа:

Если заказ вводится на основании клиента, ссылка на этого клиента должна попасть в поле Клиент нового заказа, а поле Адрес

доставки должно быть заполнено исходя из адресных реквизитов клиента.

Если заказ вводится на основании товара, то в табличную часть нового документа должна быть добавлена строка, содержащая ссылку на этот товар. Причем у добавленного товара должна быть получена актуальная цена из регистра сведений и подставлена в строку табличной части (вместе с одинарным количеством заказанного товара). С учетом цены и количества товара должна быть посчитана сумма по товару, на основании которого вводился заказ.
Чтобы обеспечить требуемое поведение мобильного приложения, мы должны прописать данный алгоритм в обработчике события
ОбработкаЗаполнения, которое описывается в модуле документа. Этот обработчик вызывается при вводе документа на основании, при выполнении метода Заполнить(), а также при интерактивном вводе нового документа.
Итак, откроем модуль документа Заказ и поместим в него следующую процедуру.
Процедура
ОбработкаЗаполнения
(
ДанныеЗаполнения
,
ТекстЗаполнения
,
СтандартнаяОбработка
)
Если
ТипЗнч
(
ДанныеЗаполнения
)
=
Тип
(
"СправочникСсылка.Клиенты"
)
Тогда
// Заполнение шапки
Клиент
=
ДанныеЗаполнения
Ссылка
;
АдресДоставки
=
СокрЛП
(
Клиент
Страна
)
+
",
"
+
СокрЛП
(
Клиент
Город
)
+
", "
+
СокрЛП
(
Клиент
Улица
)
+
",
"
+
СокрЛП
(
Клиент
Дом
)
+
", "
+
СокрЛП
(
Клиент
Квартира
);
ИначеЕсли
ТипЗнч
(
ДанныеЗаполнения
)
=
Тип
(
"СправочникСсылка.Тов ары"
)
Тогда
// Заполнение табличной части
НоваяСтрока
=
Товары
Добавить
();
НоваяСтрока
Товар
=
ДанныеЗаполнения
Ссылка
;
НоваяСтрока
Количество
=
1
;
ЦенаТовара
=
РегистрыСведений
ЦеныТоваров
ПолучитьПоследнее
(
Дата
,
Новый
Структура
(
"Товар"
,
ДанныеЗаполнения
Ссылка
));
НоваяСтрока
Цена
=
ЦенаТовара
Цена
;