Модуль программы формирования заказов
//----------
Функция Титул()
Если Пустое Значение (ВыбПрайс)=1 Тогда Возврат "<<Прайс не указан>>" Конец Если;
Х=?(Выб Прайс. Выбран()=0,"",
?(ВыбПрайс.Уровень()=1,""+ВыбПрайс,?(ВыбПрайс.Уровень()=2,ВыбПрайс.Родитель,""+ВыбПрайс.Родитель.Родитель+" - "+ВыбПрайс.Родитель)))+?(ВыбТовар.Выбран()=0,"",": "+ВыбТовар);
//?(ВыбПрайсЛогистика.Выбран()=0,"",?(ВыбПрайсЛогистика.Уровень()=1,"",?(ВыбПрайс.Уровень()=2,ВыбПрайс.Родитель,""+ВыбПрайс.Родитель.Родитель+" - "+ВыбПрайс.Родитель)))+?(ВыбТовар.Выбран()=0,"",": "+ВыбТовар)
Возврат Х;
КонецФункции // Титул
//----------
Процедура Товары Прайса (Прайс, Список Товаров) // Список товаров (указанной части) прайса
Прс=СоздатьОбъект("Справочник._Прайсы");
СпрТов=СоздатьОбъект("Справочник._Прайс_товар");
Если ПустоеЗначение(Прайс)=0 Тогда
Если Прайс.ЭтоГруппа()=1 Тогда
Прс.ИспользоватьРодителя(Прайс.ТекущийЭлемент()); // и переходим к перебору
Иначе // итак, единственная прайсовая группа, товар перечислен в подчинённом справочнике...
СпрТов.ИспользоватьВладельца(Прайс.ТекущийЭлемент());
СпрТов.ВыбратьЭлементы();
Пока СпрТов.ПолучитьЭлемент()=1 Цикл
Если СпрТов.Товар.Выбран()=0 Тогда Продолжить КонецЕсли;
Если СпрТов.Товар.ПометкаУдаления()=1 Тогда Продолжить КонецЕсли;
Если СпрТов.ПометкаУдаления()=1 Тогда Продолжить КонецЕсли;
Если СписокТоваров.Принадлежит(СпрТов.Товар.ТекущийЭлемент())=0 Тогда
|
|
СписокТоваров.ДобавитьЗначение(СпрТов.Товар.ТекущийЭлемент())
КонецЕсли
КонецЦикла;
Возврат
КонецЕсли;
КонецЕсли;
Прс.ВыбратьЭлементы();
Пока Прс.ПолучитьЭлемент()=1 Цикл
Если Прс.ЭтоГруппа()=1 Тогда Продолжить КонецЕсли;
// Выведем все товары-строки
СпрТов.ИспользоватьВладельца(Прс.ТекущийЭлемент());
СпрТов.ВыбратьЭлементы();
Пока СпрТов.ПолучитьЭлемент()=1 Цикл
Если СпрТов.Товар.Выбран()=0 Тогда Продолжить КонецЕсли;
Если СпрТов.Товар.ПометкаУдаления()=1 Тогда Продолжить КонецЕсли;
Если СпрТов.ПометкаУдаления()=1 Тогда Продолжить КонецЕсли;
Если СписокТоваров.Принадлежит(СпрТов.Товар.ТекущийЭлемент())=0 Тогда
СписокТоваров.ДобавитьЗначение(СпрТов.Товар.ТекущийЭлемент())
КонецЕсли
КонецЦикла;
КонецЦикла;
КонецПроцедуры // ТоварыПрайса
//------------
Функция НазваниеДня(ДатаХ)
i=НомерДняНедели(ДатаХ);
Если i=1 Тогда Возврат "понедельник" КонецЕсли;
Если i=2 Тогда Возврат "вторник" КонецЕсли;
Если i=3 Тогда Возврат "среда" КонецЕсли;
Если i=4 Тогда Возврат "четверг" КонецЕсли;
Если i=5 Тогда Возврат "пятница" КонецЕсли;
Если i=6 Тогда Возврат "суббота" КонецЕсли;
Если i=7 Тогда Возврат "воскресенье" КонецЕсли;
|
|
КонецФункции // НазваниеДня
//----------
Процедура ПоПрайсу()
Если Форма.Закладки.ТекущаяСтрока()=1 Тогда
ВыбТовар="";
ЕстьТовар=?(ВыбПрайс.Выбран()=0,0,?(ВыбПрайс.ЭтоГруппа()=1,0,1));
Форма.ВыбТовар.Видимость(ЕстьТовар);
Форма.ВТх.Видимость(ЕстьТовар);
Форма.ВТхх.Видимость(ЕстьТовар);
Если ВыбПрайс.Выбран()=0 Тогда Возврат КонецЕсли;
Голова=?(ВыбПрайс.Уровень()=1,ВыбПрайс,?(ВыбПрайс.Уровень()=2,ВыбПрайс.Родитель,ВыбПрайс.Родитель.Родитель));
ПризнакОтбора=СокрЛП(Голова);
КонецЕсли;
КонецПроцедуры // ПоПрайсу
//------------
Процедура ЗаказПоставщику()
Если ВыбЗаказ.Выбран()=0 Тогда
//Х="Предварительно в поле справа д.б. показан предыдущий заказ
//|или введён новый, без заполнения табличной части!";
Х="Предварительно в поле справа должен быть введён новый заказ
|без заполнения табличной части!";
Предупреждение(Х);
Возврат
КонецЕсли;
Если ВыбЗаказ.КоличествоСтрок()>0 Тогда
Если Вопрос("В указанном заказе строк в табличной части "+ВыбЗаказ.КоличествоСтрок()+"."+РазделительСтрок+
"Формируем заказ заново ?","Да+Нет")="Нет" Тогда Возврат КонецЕсли;
КонецЕсли;
ВЗ=СоздатьОбъект ("Документ."+ВыбЗаказ.Вид());
|
|
Если ВЗ.НайтиДокумент(ВыбЗаказ)=0 Тогда
Предупреждение ("СОШ-529");Возврат
КонецЕсли;
ВЗ.УдалитьСтроки();
ВЗ.ДатаОтгрузки=ВЗ.ДатаДок;
// Заполнение
ЕстьОШИБКИ=0;
ТП.ВыбратьСтроки();
Пока ТП.ПолучитьСтроку()=1 Цикл
Если ПустоеЗначение(ТП.Заказ)=1 Тогда Продолжить; КонецЕсли;
ВЗ.НоваяСтрока();
ВЗ.Номенклатура=ТП.Товар;
ЕстьЕД=1;
Если ТП.Товар.ЗакупочнаяЕдиница.Выбран()=0 Тогда
ЕстьЕД=0;
КонецЕсли;
Если ЕстьЕД=0 Тогда
Единица=ТП.Товар.БазоваяЕдиница.ТекущийЭлемент();
Сообщить ("Закупочная единица не указана или коэффициент<=1. Строка "+ТП.НомерСтроки+", товар: "+ТП.Товар);
Иначе
Единица=ТП.Товар.ЗакупочнаяЕдиница.ТекущийЭлемент();
КонецЕсли;
К=Единица.Коэффициент;
Если К < 1 Тогда
Сообщить("Нет коэффициента у единицы. Строка "+ТП.НомерСтроки+", товар: "+ТП.Товар,"!");
К=1;
ЕстьОШИБКИ=1
КонецЕсли;
Если К=1 Тогда
Кц=ТП.Заказ;
Иначе
//Кц=Цел(ТП.Заказ/К);
//Если Кц*К<>ТП.Заказ Тогда
//Сообщить("Указано количество не кратное упаковке (кф.уп."+К+"). Строка "+ТП.НомерСтроки+", товар: "+ТП.Товар,"!");
//ЕстьОШИБКИ=1
//КонецЕсли;
Кц=Цел(ТП.Заказ/К);
Если Кц*К<>ТП.Заказ Тогда Кц=Кц+1 КонецЕсли;
|
|
КонецЕсли;
ВЗ.Единица=Единица;
ВЗ.Коэффициент=К;
ВЗ.Количество=Кц;
глПересчетТаблЧасти(ВЗ.ТекущийДокумент(),"Номенклатура");
КонецЦикла;
ВЗ.Записать();
Х="Заказ сформирован."+?(ЕстьОШИБКИ=1," Есть ОШИБКИ !!!","");
Предупреждение(Х);
КонецПроцедуры // ЗаказПоставщику
//------------
Процедура ДиапазонПоДате(Дата0="",Дата1,Дата2)
Если ПустоеЗначение(Дата0)=0 Тогда
Если Дата0>ПолучитьДатуТА() Тогда Дата0=ПолучитьДатуТА(); Предупреждение("Итоги расчитаны по "+Дата0); КонецЕсли;
Понедельник=Дата(Дата0-НомерДняНедели(Дата0)+1);
Дата2=Дата(Понедельник-3);
КонецЕсли;
хх=НомерДняНедели(Дата0);
х=Число(Дата0Х)-Число(Дата0);
Если (х>7)ИЛИ(х<(8-хх)) Тогда Дата0Х=Дата(Дата0+7);КонецЕсли;
Если НЕ(НомерДняНедели(Дата2)=5) Тогда
Дата2=Дата(Дата2-НомерДняНедели(Дата2)+5);
КонецЕсли;
Понедельник=Дата(Дата2-НомерДняНедели(Дата2)+1);
Дата1=Дата(Понедельник-7*(ГлубинаАнализа-1));
РабочихДнейДоПоставки=Число(Дата0Х)-Число(Дата0)-3;
КонецПроцедуры // ДиапазонПоДате
//------------
Процедура Аппроксимация(Данные,А,В)
А=0;В=0;
Если ПустоеЗначение(Данные)=1 Тогда Возврат КонецЕсли;
Хсред=Данные.Итог("Х")/Данные.КоличествоСтрок();
Усред=Данные.Итог("У")/Данные.КоличествоСтрок();
Числитель=0;
Знаменатель=0;
Данные.ВыбратьСтроки();
Пока Данные.ПолучитьСтроку()=1 Цикл
Числитель=Числитель+(Данные.Х-Хсред)*Данные.У;
Знаменатель=Знаменатель+(Данные.Х-Хсред)*(Данные.Х-Хсред);
КонецЦикла;
Если Знаменатель=0 Тогда
А=Усред; В=0;
Иначе
В=Числитель/Знаменатель;
А=Усред-Хсред*Числитель/Знаменатель;
КонецЕсли;
КонецПроцедуры // Аппроксимация
//------------
Процедура АнализЛинейный() // Линейная апроксимация
Перем Прогноз,А,В,Хмин,Хмакс,Заказ;
ТП.Очистить();
ТТ.Выгрузить(ТП,,,"Товар,Остаток");
ТП.НоваяКолонка("ПрогнозПродаж","Число",7,0,"Прогноз",6);
ТП.НоваяКолонка("А","Число",17,0,"А",6);
ТП.НоваяКолонка("В","Число",17,0,"В",6);
ТП.НоваяКолонка("Мин","Число",17,0,"min",6);
ТП.НоваяКолонка("Макс","Число",17,0,"max",6);
ТП.НоваяКолонка("Заказ","Число",7,0,"Заказ",6);
Данные=СоздатьОбъект("ТаблицаЗначений");
Данные.НоваяКолонка("Х","Число",3,0);
Данные.НоваяКолонка("У","Число",7,0);
Если ТТ.КоличествоКолонок()<> ГлубинаАнализа+3 Тогда Сообщить("СОШ-682");Возврат КонецЕсли;
ном=0;
ТТ.ВыбратьСтроки();
Пока ТТ.ПолучитьСтроку()=1 Цикл
ном=ном+1;
ТП.ПолучитьСтрокуПоНомеру(ном);
Данные.УдалитьСтроки();
Для i=1 По ГлубинаАнализа Цикл
у=ТТ.ПолучитьЗначение(ном,i+3);
Если (ПустоеЗначение(у)=1)И(ПустоПропускать=1) Тогда // пропускаем
Иначе
Данные.НоваяСтрока();
Данные.Х=i;
Данные.У=у;
КонецЕсли;
КонецЦикла;
Если ПустоеЗначение(Данные)=1 Тогда Сообщить("Строку "+ТТ.ТекущаяСтрока()+" не обрабатываем.");Продолжить КонецЕсли;
Аппроксимация (Данные,А,В);
// Параметры заказа
//Прогноз1=А+В*(ГлубинаАнализа+1);
Прогноз2=А+В*(ГлубинаАнализа+2);
Расчётный Остаток На Моменть Поступления Заказа=Макс(ТТ.Остаток-ТТ.Расходимость*РабочихДнейДоПоставки,0);
Заказ=Прогноз2*1.3-РасчётныйОстатокНаМоментьПоступленияЗаказа;
Хмин=Прогноз2*0.5;
Хмакс=Прогноз2*1.5;
ТП.А=А;
ТП.В=В;
ТП.ПрогнозПродаж=Прогноз2;
ТП.Заказ=Заказ;
ТП.Мин=Хмин;
ТП.Макс=Хмакс;
КонецЦикла;
ТТ.ТекущаяСтрока(1);
ТП.ТекущаяСтрока(1);
Форма.Закладки.ТекущаяСтрока(3);
Форма.ИспользоватьСлой("Основной,Даты,Заказ", 2);
КонецПроцедуры // АнализЛинейный
//------------
Процедура УбратьОтрицательныеОстатки() // Возможна пересортица...
ТТ.ВыбратьСтроки();
Пока ТТ.ПолучитьСтроку()=1 Цикл
Если ТТ.Остаток<0 Тогда ТТ.Остаток=0; КонецЕсли;
КонецЦикла;
КонецПроцедуры // УбратьОтрицательныеОстатки
//------------
Процедура Хроника() // Построение графика продаж по неделям
СписокТоваров=СоздатьОбъект("СписокЗначений");
ТоварыПрайса(ВыбПрайс,СписокТоваров);
// Остаток расчитываем на конец предыдущей недели...
// Нет, берём текущий остаток, на рабочую дату.
ОстаткиПоТоварам=СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Остатки)
|Период с Дата0 по Дата0;
|Товар=Регистр.ОстаткиТМЦ.Номенклатура;
|КолВо = Регистр.ОстаткиТМЦ.Количество;
|Функция КО = КонОст(КолВо);
|Группировка Товар Без Групп;
|Условие (Товар В СписокТоваров);
|"//}}ЗАПРОС
;
Если Остатки По Товарам. Выполнить (ТекстЗапроса) = 0 Тогда Предупреждение("Запрос по остаткам не выполнен!");Возврат КонецЕсли;
ЗапросПоТоварам=Создать Объект ("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Товар)
|Период с Дата1 по Дата2;
|Товар=Регистр.ПартииНаличие.Номенклатура;
|КодОперации=Регистр.ПартииНаличие.КодОперации;
|КолВо = Регистр.ПартииНаличие.Количество;
//|Функция Закупка = Приход(КолВо) когда (КодОперации=глКО.Закупка);
//|Функция ВозвратПоставщику = Расход(КолВо) когда (КодОперации=глКО.ВозвратПоставщику);
|Функция Продажа = Расход(КолВо) когда (КодОперации=глКО.Продажа);
//|Функция ВозвратОтПокупателя = Приход(КолВо) когда (КодОперации=глКО.ВозвратОтПокупателя);
|Группировка Неделя;
|Группировка Товар Без Групп;
//|Без итогов;
|Условие (Товар В СписокТоваров);
|"//}}ЗАПРОС;
Если ЗапросПоТоварам.Выполнить(ТекстЗапроса) = 0 Тогда Предупреждение("Запрос по товарам не выполнен!");Возврат КонецЕсли;
ТТ.Очистить();
ТХ=СоздатьОбъект("ТаблицаЗначений");
ТХ.НоваяКолонка("Товар","Справочник.Номенклатура",,,,10);
ТХ.НоваяКолонка("Остаток","Число",7,0,"КонОст",5);
ТХ.НоваяКолонка("Расходимость","Число",7,0,"СрРсх",5);
КолонкиПрихода=СоздатьОбъект("СписокЗначений");
КолонкиРасхода=СоздатьОбъект("СписокЗначений");
Д=0;
Пока ЗапросПоТоварам.Группировка("Неделя") = 1 Цикл
День=Дата(ЗапросПоТоварам.Неделя);
Состояние(""+День);
Д=Д+1;
КолонкаРасхода="Д"+Д;
ТХ.НоваяКолонка(КолонкаРасхода,"Число",7,0,""+День,6);
КолонкиРасхода.ДобавитьЗначение(КолонкаРасхода);
Пока ЗапросПоТоварам.Группировка("Товар") = 1 Цикл
Товар=ЗапросПоТоварам.Товар.ТекущийЭлемент();
СтрокаХ=0;
Если ТХ.НайтиЗначение(Товар,СтрокаХ,1)=0 Тогда
ТХ.НоваяСтрока();
ТХ.Товар=Товар.ТекущийЭлемент();
Если ОстаткиПоТоварам.Получить(Товар.ТекущийЭлемент())=1 Тогда
//ОстаткиПоТоварам.Группировка("Товар");
ТХ.Остаток=Число(ОстаткиПоТоварам.КО);
КонецЕсли;
СтрокаХ=ТХ.КоличествоСтрок();
Иначе
ТХ.ПолучитьСтрокуПоНомеру(СтрокаХ);
КонецЕсли;
//Приход=ЗапросПоТоварам.Закупка-ЗапросПоТоварам.ВозвратПоставщику;
//Расход=ЗапросПоТоварам.Продажа-ЗапросПоТоварам.ВозвратОтПокупателя;
Расход=ЗапросПоТоварам.Продажа;
ТХ.Расходимость=ТХ.Расходимость+Расход;
//ТХ.УстановитьЗначение(СтрокаХ,КолонкаПрихода,Приход);
ТХ.УстановитьЗначение(СтрокаХ,КолонкаРасхода,Расход);
КонецЦикла;
КонецЦикла;
Если ПустоеЗначение(ТХ)=1 Тогда Предупреждение("Данных не найдено !");Возврат КонецЕсли;
ТХ.ВыбратьСтроки();
Пока ТХ.ПолучитьСтроку()=1 Цикл
ТХ.Расходимость=ТХ.Расходимость/Д;
КонецЦикла;
ТХ.Выгрузить(ТТ);
Форма.Закладки.ТекущаяСтрока(2);
Форма.ИспользоватьСлой("Основной,Даты,Планирование", 2);
КонецПроцедуры // Хроника
//------------
Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
Если НомерЗакладки = 1 Тогда
Форма.ИспользоватьСлой("Основной,Анализ,Даты",2);
ПоПрайсу();
ИначеЕсли НомерЗакладки = 2 Тогда
Форма.ИспользоватьСлой("Основной,Даты,Планирование", 2);
ИначеЕсли НомерЗакладки = 3 Тогда
Форма.ИспользоватьСлой("Основной,Даты,Заказ", 2);
КонецЕсли;
КонецПроцедуры // ПриВыбореЗакладки
//------------
Процедура ПриОткрытии()
Если ПустоеЗначение(Дата0)=1 Тогда Дата0=РабочаяДата(); КонецЕсли;
Если Дата0>ПолучитьДатуТА() Тогда Дата0=ПолучитьДатуТА(); КонецЕсли;
ДиапазонПоДате(Дата0,Дата1,Дата2);
Спр = Форма.Параметр;
Если ПустоеЗначение(Спр) =0 Тогда
Если Спр.Вид() = "_Прайсы" Тогда
ВыбПрайс=Спр.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
Форма.ИспользоватьЗакладки(1);
Форма.Закладки.ДобавитьЗначение(1, "Анализ");
Форма.Закладки.ДобавитьЗначение(2, "Планирование");
Форма.Закладки.ДобавитьЗначение(3, "Заказ");
//Форма.Закладки.ДобавитьЗначение(4, "Данные");
//Форма.Закладки.ДобавитьЗначение(5, "Метод");
Форма.ИспользоватьСлой("Основной,Анализ,Даты",2);
ПоПрайсу();
КонецПроцедуры // ПриОткрытии
Размещено на Allbest.ru
Дата добавления: 2018-10-26; просмотров: 358; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!