Файл: Методические указания к лабораторным работам по дисциплине Разработка интеллектуальных мобильных приложений и чатботов Самара 2021.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 20.03.2024
Просмотров: 125
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СтрокаТабличнойЧасти
=
Элементы
Товары
ТекущиеДанные
;
СтрокаТабличнойЧасти
Сумма
=
СтрокаТабличнойЧасти
Количество
*
Строк аТабличнойЧасти
Цена
;
КонецПроцедуры
Назначение этих процедур уже неоднократно разбиралось ранее, поэтому мы не будем еще раз на этом останавливаться.
Затем создадим клиентские обработчики события ПриИзменении для полей таблицы формы ТоварыЦена и ТоварыКоличество и свяжем их с соответствующими процедурами в модуле формы.
А для поля ТоварыСумма в палитре свойств установим свойство ТолькоПросмотр в значение Истина, так как это поле будет расчетным и не должно изменяться вручную.
Кроме того, добавим в модуль формы процедуры для автоматической подстановки актуальной цены товара из регистра сведений при выборе товара
&НаКлиенте
Процедура
ТоварыТоварПриИзменении
(
Элемент
)
СтрокаТабличнойЧасти
=
Элементы
Товары
ТекущиеДанные
;
СтрокаТабличнойЧасти
Цена
=
ПолучитьЦенуТовара
(
Объект
Дата
,
СтрокаТа бличнойЧасти
Товар
);
СтрокаТабличнойЧасти
Количество
=
?(
СтрокаТабличнойЧасти
Количество
=
0
,
1
,
СтрокаТабличнойЧасти
Количество
);
СтрокаТабличнойЧасти
Сумма
=
СтрокаТабличнойЧасти
Количество
*
Строк аТабличнойЧасти
Цена
;
КонецПроцедуры
Функция для получения актуальной цены товара
&НаСервереБезКонтекста
Функция
ПолучитьЦенуТовара
(
Дата
,
Товар
)
Отбор
=
Новый
Структура
(
"Товар"
,
Товар
);
ЦенаТовара
=
РегистрыСведений
ЦеныТоваров
ПолучитьПоследнее
(
Дата
,
От бор
);
Возврат
ЦенаТовара
Цена
;
КонецФункции
Назначение этих процедур уже разбиралось ранее, поэтому мы не будем еще раз на этом останавливаться.
Затем создадим клиентский обработчик события ПриИзменении для поля таблицы ТоварыТовар и свяжем его с соответствующей процедурой в модуле формы.
В заключение, поскольку расходная накладная будет создаваться на основании заказа, нам нужно обеспечить заполнение расходной накладной соответствующими значениями реквизитов заказа.
Для этого мы должны создать обработчик события
ОбработкаЗаполнения и поместить его в модуль документа. Этот обработчик будет вызываться как при программном заполнении документа при выполнении метода Заполнить(), так и при интерактивном вводе нового документа на основании.
Итак, откроем модуль документа РасходнаяНакладная и поместим в него процедуру ОбработкаЗаполнения().
В параметре
ДанныеЗаполнения этой процедуры нам будет доступен объект-основание.
Процедура
ОбработкаЗаполнения
(
ДанныеЗаполнения
,
ТекстЗаполнения
,
Станд артнаяОбработка
)
Если
ТипЗнч
(
ДанныеЗаполнения
)
=
Тип
(
"ДокументСсылка.Заказ"
)
Тогда
// Заполнение шапки
Основание
=
ДанныеЗаполнения
Ссылка
;
Клиент
=
ДанныеЗаполнения
Клиент
;
Курьер
=
ДанныеЗаполнения
Курьер
;
Склад
=
ДанныеЗаполнения
Склад
;
// Заполнение табличной части
Для
Каждого
ТекСтрокаТовары
Из
ДанныеЗаполнения
Товары
Цикл
Если
ТекСтрокаТовары
Отказ
=
Ложь
Тогда
НоваяСтрока
=
Товары
Добавить
();
НоваяСтрока
Товар
=
ТекСтрокаТовары
Товар
;
НоваяСтрока
Цвет
=
ТекСтрокаТовары
Цвет
;
НоваяСтрока
Размер
=
ТекСтрокаТовары
Размер
;
НоваяСтрока
Цена
=
ТекСтрокаТовары
Цена
;
НоваяСтрока
Количество
=
ТекСтрокаТовары
Количество
;
НоваяСтрока
Сумма
=
ТекСтрокаТовары
Сумма
;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
В этом обработчике мы заполняем реквизиты новой расходной накладной соответствующими значениями реквизитов объекта-основания. В реквизит документа Основание попадает ссылка на заказ-основание.
Заметьте, что в табличную часть расходной накладной попадает информация только о тех товарах, по которым не было отказа.
Надо понимать, что расходная накладная будет заполняться данными заказа в основном программно – при записи заказа в основную базу после получения выполненного заказа от курьера. Но на всякий случай мы предусмотрели возможность интерактивного создания расходной накладной на основании заказа. В этом случае вся ответственность за достоверность данных лежит уже на менеджере интернет-магазина.
Главное, что в обоих случаях будет срабатывать обработчик события документа ОбработкаЗаполнения() и расходная накладная будет заполнена данными заказа по описанному нами алгоритму.
1 2 3 4 5 6 7 8 9 10 11
Регистры накопления
Теперь создадим структуры для накопления информации, содержащейся в созданных нами документах. Это регистры накопления, которые будут хранить движения проведенных документов и служить источниками данных для отчетов.
Прежде всего, это регистр накопления остатков ОстаткиТоваров, который будет накапливать информацию о приходе, заказе и расходе товаров на складах в разрезе цветов и размеров.
Регистраторами этого регистра будут документы ПриходнаяНакладная
(тип движения Приход), Заказ (тип движения Приход/Расход) и
РасходнаяНакладная (тип движения Расход).
Измерениями регистра будут:
Товар (тип СправочникСсылка.Товары);
Цвет (тип СправочникСсылка.Цвета);
Размер (тип СправочникСсылка.Размеры);
Склад (тип СправочникСсылка.Склады).
Ресурсами регистра будут:
Заказано (тип Число, длина 10, 0);
Количество (тип Число, длина 10, 0).
Затем нам понадобится регистр накопления оборотов Продажи, который будет накапливать информацию о продажах товаров в разрезе клиентов и курьеров.
Регистратором этого регистра будет документ РасходнаяНакладная.
Измерениями регистра будут:
Товар (тип СправочникСсылка.Товары);
Клиент (тип СправочникСсылка.Клиенты);
Курьер (тип СправочникСсылка.Пользователи).
Ресурсами регистра будут:
Количество (тип Число, длина 10, 0);
Сумма (тип Число, длина 15, 2).
А также для анализа причин отказа от товаров нам понадобится регистр накопления оборотов ПричиныОтказа, который будет накапливать информацию об отказах от товаров в разрезе причин отказа.
Регистратором этого регистра будет документ Заказ.
Измерениями регистра будут:
Товар (тип СправочникСсылка.Товары);
ПричинаОтказа (тип СправочникСсылка.ПричиныОтказа).
Ресурсами регистра будут:
Отказ (тип Число, длина 10, 0).
Движения документов при проведении
Теперь сформируем движения в этих регистрах накопления при проведении документов.
Это делается в обработчике события
ОбработкаПроведения, который помещается в модуле документов. Именно в эту процедуру разработчик должен поместить собственные алгоритмы по учету данных, выполняемые в момент проведения документа.
Приходная накладная
Откроем окно редактирования объекта конфигурации
Документ ПриходнаяНакладная. Перейдем на закладку Движения, раскроем список Регистры накопления и отметим регистр накопления
ОстаткиТоваров.
Создание движений документа «ПриходнаяНакладная» в регистре
«ОстаткиТоваров»
Здесь же можно нажать на кнопку Конструктор движений и сформировать движения документа в регистре с помощью конструктора. Но мы сделаем это вручную.
Откроем модуль документа ПриходнаяНакладная и поместим туда процедуру ОбработкаПроведения(), заполненную следующим образом.
Процедура
ОбработкаПроведения
(
Отказ
,
Режим
)
// регистр ОстаткиТоваров Приход
Движения
ОстаткиТоваров
Записывать
=
Истина;
Для
Каждого
ТекСтрокаТовары
Из
Товары
Цикл
Движение
=
Движения
ОстаткиТоваров
Добавить
();
Движение
ВидДвижения
=
ВидДвиженияНакопления
Приход
;
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Цвет
=
ТекСтрокаТовары
Цвет
;
Движение
Размер
=
ТекСтрокаТовары
Размер
;
Движение
Склад
=
Склад
;
Движение
Количество
=
ТекСтрокаТовары
Количество
;
КонецЦикла;
КонецПроцедуры
В первой строке процедуры мы устанавливаем свойство
Записывать набора записей регистра ОстаткиТоваров в значение Истина.
То есть в явном виде указываем, что после завершения обработки проведения платформа должна будет записать этот набор записей в базу данных.
Затем обходим табличную часть документа в цикле. На каждом шаге цикла мы добавляем новую запись в коллекцию движений документа в регистре ОстаткиТоваров.
Тем самым мы создаем объект
РегистрНакопленияЗапись и сохраняем его в переменной Движение.
Используя этот объект, мы можем обратиться к полям этой записи, указав имя поля через точку от этой переменной (например,
Движение.Количество).
Сначала мы задаем вид движения (Движение.ВидДвижения) как значение системного перечисления (ВидДвиженияНакопления.Приход), которое определяет вид движения регистра накопления как Приход.
Чтобы присвоить полям новой записи регистра соответствующие значения полей документа, мы обращаемся к полям табличной части, указав имя поля через точку от переменной
ТекСтрокаТовары
(например, ТекСтрокаТовары.Цвет).
Причем в цикле меняются только значения полей табличной части документа. Поля Дата и Склад не меняются, так как относятся к документу в целом и не зависят от текущей строки табличной части документа.
Таким образом мы присваиваем нужные значения всем полям новой записи.
После завершения цикла в наборе записей
(Движения.ОстаткиТоваров) будет содержаться столько записей, сколько строк в табличной части проводимого документа.
Расходная накладная
Затем откроем в конфигураторе окно редактирования объекта конфигурации Документ РасходнаяНакладная и на закладке Движения укажем, что этот документ будет создавать движения в двух регистрах: ОстаткиТоваров и Продажи.
Откроем модуль документа РасходнаяНакладная и поместим туда процедуру ОбработкаПроведения(), заполненную следующим образом
Процедура
ОбработкаПроведения
(
Отказ
,
Режим
)
Движения
ОстаткиТоваров
Записывать
=
Истина;
Движения
Продажи
Записывать
=
Истина;
Для
Каждого
ТекСтрокаТовары
Из
Товары
Цикл
// регистр ОстаткиТоваров Расход
Движение
=
Движения
ОстаткиТоваров
Добавить
();
Движение
ВидДвижения
=
ВидДвиженияНакопления
Расход
;
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Цвет
=
ТекСтрокаТовары
Цвет
;
Движение
Размер
=
ТекСтрокаТовары
Размер
;
Движение
Склад
=
Склад
;
Движение
Количество
=
ТекСтрокаТовары
Количество
;
Движение
Заказано
=
ТекСтрокаТовары
Количество
;
// регистр Продажи
Движение
=
Движения
Продажи
Добавить
();
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Клиент
=
Клиент
;
Движение
Курьер
=
Курьер
;
Движение
Количество
=
ТекСтрокаТовары
Количество
;
Движение
Сумма
=
ТекСтрокаТовары
Сумма
;
КонецЦикла;
КонецПроцедуры
Сначала мы указываем платформе на необходимость записи движений документа по регистрам ОстаткиТоваров и Продажи. Затем обходим
табличную часть документа в цикле и на каждом шаге цикла формируем движения в обоих регистрах.
В регистре ОстаткиТоваров ситуация идентичная рассмотренной выше для приходной накладной, но движения формируются с обратным знаком – это определяет вид движения регистра накопления как Расход.
Кроме того, значение поля Количество в строке табличной части присваивается двум ресурсам регистра Количество и Заказано. То есть суммарное количество заказанного товара уменьшается на количество его продаж – иными словами, если товар продан, то он уже не может быть заказан.
Регистр Продажи – оборотный, поэтому при формировании движений по этому регистру отсутствует вид движения. В ресурсах этого регистра, помимо количества, учитывается также сумма продаж.
Обратите внимание, что в обработке проведения расходной накладной отсутствует контроль остатков товара. Во-первых, это сделано для упрощения, а во-вторых – такой контроль имеет смысл только при оперативном проведении документа. В нашем же случае считается, что расходная накладная будет программно создаваться, записываться и проводиться в неоперативном режиме при поступлении выполненных заказов от курьера в процессе обмена данными.
Заказ
При проведении заказа мы реализуем следующую бизнес-логику:
Первоначально заказ создается в интернет-магазине (или иногда на планшете) со статусом Открыт.
Затем у заказа устанавливается курьер и статус заказа В работе, и заказ отправляется курьеру на планшет. При проведении заказа с этим статусом формируются движения типа Приход в регистре
ОстаткиТоваров.
Курьер обслуживает заказ, отмечает товары, от которых клиент отказался, присваивает заказу статус Выполнен и отправляет его
В регистре ОстаткиТоваров ситуация идентичная рассмотренной выше для приходной накладной, но движения формируются с обратным знаком – это определяет вид движения регистра накопления как Расход.
Кроме того, значение поля Количество в строке табличной части присваивается двум ресурсам регистра Количество и Заказано. То есть суммарное количество заказанного товара уменьшается на количество его продаж – иными словами, если товар продан, то он уже не может быть заказан.
Регистр Продажи – оборотный, поэтому при формировании движений по этому регистру отсутствует вид движения. В ресурсах этого регистра, помимо количества, учитывается также сумма продаж.
Обратите внимание, что в обработке проведения расходной накладной отсутствует контроль остатков товара. Во-первых, это сделано для упрощения, а во-вторых – такой контроль имеет смысл только при оперативном проведении документа. В нашем же случае считается, что расходная накладная будет программно создаваться, записываться и проводиться в неоперативном режиме при поступлении выполненных заказов от курьера в процессе обмена данными.
Заказ
При проведении заказа мы реализуем следующую бизнес-логику:
Первоначально заказ создается в интернет-магазине (или иногда на планшете) со статусом Открыт.
Затем у заказа устанавливается курьер и статус заказа В работе, и заказ отправляется курьеру на планшет. При проведении заказа с этим статусом формируются движения типа Приход в регистре
ОстаткиТоваров.
Курьер обслуживает заказ, отмечает товары, от которых клиент отказался, присваивает заказу статус Выполнен и отправляет его
обратно в офис. При проведении заказа с этим статусом, в случае если клиент отказался от каких-то товаров, формируются движения в регистре ПричиныОтказа, а также формируются движения типа Расход в регистре ОстаткиТоваров.
Менеджер интернет-магазина проверяет заказ и присваивает ему статус Закрыт. После этого на основании заказа создается расходная накладная со списком товаров, которые клиент купил.
Для реализации данного алгоритма при проведении заказа откроем модуль документа Заказ и поместим туда процедуру ОбработкаПроведения(), заполненную следующим образом
Процедура
ОбработкаПроведения
(
Отказ
,
Режим
)
Если
СтатусЗаказа
=
Перечисления
СтатусыЗаказов
ВРаботе
Тогда
// регистр ОстаткиТоваров Приход
Движения
ОстаткиТоваров
Записывать
=
Истина;
Для
Каждого
ТекСтрокаТовары
Из
Товары
Цикл
Движение
=
Движения
ОстаткиТоваров
Добавить
();
Движение
ВидДвижения
=
ВидДвиженияНакопления
Приход
;
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Цвет
=
ТекСтрокаТовары
Цвет
;
Движение
Размер
=
ТекСтрокаТовары
Размер
;
Движение
Склад
=
Склад
;
Движение
Заказано
=
ТекСтрокаТовары
Количество
;
КонецЦикла;
ИначеЕсли
СтатусЗаказа
=
Перечисления
СтатусыЗаказов
Выполнен
Тогда
Движения
ПричиныОтказа
Записывать
=
Истина;
Движения
ОстаткиТоваров
Записывать
=
Истина;
Для
Каждого
ТекСтрокаТовары
Из
Товары
Цикл
// регистр ОстаткиТоваров Приход
Движение
=
Движения
ОстаткиТоваров
Добавить
();
Движение
ВидДвижения
=
ВидДвиженияНакопления
Приход
;
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Цвет
=
ТекСтрокаТовары
Цвет
;
Движение
Размер
=
ТекСтрокаТовары
Размер
;
Движение
Склад
=
Склад
;
Движение
Заказано
=
ТекСтрокаТовары
Количество
;
Менеджер интернет-магазина проверяет заказ и присваивает ему статус Закрыт. После этого на основании заказа создается расходная накладная со списком товаров, которые клиент купил.
Для реализации данного алгоритма при проведении заказа откроем модуль документа Заказ и поместим туда процедуру ОбработкаПроведения(), заполненную следующим образом
Процедура
ОбработкаПроведения
(
Отказ
,
Режим
)
Если
СтатусЗаказа
=
Перечисления
СтатусыЗаказов
ВРаботе
Тогда
// регистр ОстаткиТоваров Приход
Движения
ОстаткиТоваров
Записывать
=
Истина;
Для
Каждого
ТекСтрокаТовары
Из
Товары
Цикл
Движение
=
Движения
ОстаткиТоваров
Добавить
();
Движение
ВидДвижения
=
ВидДвиженияНакопления
Приход
;
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Цвет
=
ТекСтрокаТовары
Цвет
;
Движение
Размер
=
ТекСтрокаТовары
Размер
;
Движение
Склад
=
Склад
;
Движение
Заказано
=
ТекСтрокаТовары
Количество
;
КонецЦикла;
ИначеЕсли
СтатусЗаказа
=
Перечисления
СтатусыЗаказов
Выполнен
Тогда
Движения
ПричиныОтказа
Записывать
=
Истина;
Движения
ОстаткиТоваров
Записывать
=
Истина;
Для
Каждого
ТекСтрокаТовары
Из
Товары
Цикл
// регистр ОстаткиТоваров Приход
Движение
=
Движения
ОстаткиТоваров
Добавить
();
Движение
ВидДвижения
=
ВидДвиженияНакопления
Приход
;
Движение
Период
=
Дата
;
Движение
Товар
=
ТекСтрокаТовары
Товар
;
Движение
Цвет
=
ТекСтрокаТовары
Цвет
;
Движение
Размер
=
ТекСтрокаТовары
Размер
;
Движение
Склад
=
Склад
;
Движение
Заказано
=
ТекСтрокаТовары
Количество
;