Модуль программы формирования заказов



 

//----------

Функция Титул()

Если Пустое Значение (ВыбПрайс)=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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!