13:01 Задача 1.12 | |
Похожая задача как 1.11 но в данном случае товар может продать менеджер с большим приоритетом .манагер с низким приоритетом отдыхает . продать он не может товар зарезервированный манагером у которого больший приоритет. опять делаем документ резервирование товара . в шапке реквизит менеджер - спр Физ лица Таб часть СписокНоменклатуры колонки Номенклатура Количество в модуле объекта код: Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Резервы Приход Движения.Резервы.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Резервы.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Менеджер = Менеджер; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Свободный товар по условию = Сумма(количество Товара на всех складах)- Сумма(Резерва количества менеджеров с приоритетом равным продающему или выше его). Приоритет устанавливается у каждого манагера индивидуально и не может меняться чаще чем раз в месяц При продаже приоритет берем актуальный на дату продажи.срез последних Создаем регистр сведений ПриоритетыМенеджеров периодичность в месяц измерение менеджер и ресурс приоритет . В приходной обычный модуль: Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры В Расходной: в шапке добавим реквизит менеджер В модуле объекта такой код: Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Резервы.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Резервы.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Резервы"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Приоритет = РегистрыСведений.ПриоритетыМенеджеров.ПолучитьПоследнее(Дата, Новый Структура("Менеджер",Менеджер)).Приоритет; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ПОМЕСТИТЬ ОстаткиНаВсехСкладах |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ)) КАК ОстаткиНоменклатурыОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | РезервыОстатки.Менеджер, | РезервыОстатки.Номенклатура, | РезервыОстатки.КоличествоОстаток, | ЕСТЬNULL(ПриоритетыМенеджеровСрезПоследних.Приоритет, 0) КАК Приоритет |ПОМЕСТИТЬ ВсеРезервы |ИЗ | РегистрНакопления.Резервы.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ)) КАК РезервыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыМенеджеров.СрезПоследних(&Момент, ) КАК ПриоритетыМенеджеровСрезПоследних | ПО РезервыОстатки.Менеджер = ПриоритетыМенеджеровСрезПоследних.Менеджер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНаВсехСкладах.Номенклатура КАК Номенклатура, | ВЫБОР | КОГДА ОстаткиНаВсехСкладах.КоличествоОстаток - ЕСТЬNULL(ВсеРезервы.КоличествоОстаток, 0) < 0 | ТОГДА 0 | ИНАЧЕ ОстаткиНаВсехСкладах.КоличествоОстаток - ЕСТЬNULL(ВсеРезервы.КоличествоОстаток, 0) | КОНЕЦ КАК СвободноеКоличество |ПОМЕСТИТЬ СвободныйОстаток |ИЗ | ОстаткиНаВсехСкладах КАК ОстаткиНаВсехСкладах | ЛЕВОЕ СОЕДИНЕНИЕ ВсеРезервы КАК ВсеРезервы | ПО ОстаткиНаВсехСкладах.Номенклатура = ВсеРезервы.Номенклатура |ГДЕ | ВсеРезервы.Приоритет >= &Приоритет | И ВсеРезервы.Менеджер <> &Менеджер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДокТЧ.Номенклатура, | ДокТЧ.Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток, | СвободныйОстаток.СвободноеКоличество, | ЕСТЬNULL(РезервыОстатки.КоличествоОстаток, 0) КАК ЗарезервированноМенеджером |ИЗ | ДокТЧ КАК ДокТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ) | И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки | ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ СвободныйОстаток КАК СвободныйОстаток | ПО ДокТЧ.Номенклатура = СвободныйОстаток.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Резервы.Остатки( | &Момент, | Менеджер = &Менеджер | И Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ)) КАК РезервыОстатки | ПО ДокТЧ.Номенклатура = РезервыОстатки.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Менеджер", Менеджер); Запрос.УстановитьПараметр("Приоритет", Приоритет); Запрос.УстановитьПараметр("Момент", МоментВремени()); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл МожноРасходовать = МИН(Выборка.КоличествоОстаток,Выборка.СвободноеКоличество); Если Выборка.Количество > МожноРасходовать Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Нехватает " + Выборка.Номенклатура + ". Осталось на складе в свободном остатке (не зарезервированы менеджерами с высшими приоритетами): " + МожноРасходовать + ", необходимо: " + Выборка.Количество; //Сообщение.Поле = ""; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Если Выборка.ЗарезервированноМенеджером > 0 Тогда //Если был резерв у менеджера то списываем его // регистр Резервы Расход Движение = Движения.Резервы.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Менеджер = Менеджер; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = МИН(Выборка.Количество,Выборка.ЗарезервированноМенеджером); КонецЕсли; // регистр ОстаткиНоменклатуры Расход Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Склад = Склад; Движение.Количество = Выборка.Количество; Движение.Сумма = ?(Выборка.Количество = Выборка.КоличествоОстаток,Выборка.СуммаОстаток, Выборка.Количество * Выборка.СуммаОстаток / Выборка.КоличествоОстаток); КонецЦикла; //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Отчеты : Остатки товаров Будет 2 запроса по регистру Отстаки и Резервы . Такой код: ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ РезервыОстатки.Номенклатура, "Резерв", РезервыОстатки.КоличествоОстаток ИЗ РегистрНакопления.Резервы.Остатки КАК РезервыОстатки Ресурсы : выберем КоличествоОстаток выражение Сумма(КоличествоОстаток) Группировки таблица :строки номенклатура колонки Склад Выбранные поля Номенклатура ,Склад ,КоличествоОстаток Параметры период Дата Отчет резервы посложнее ВЫБРАТЬ РезервыОстатки.Номенклатура, РезервыОстатки.Менеджер, РезервыОстатки.КоличествоОстаток КАК Резерв, ЕСТЬNULL(ПриоритетыМенеджеровСрезПоследних.Приоритет, 0) КАК Приоритет ИЗ РегистрНакопления.Резервы.Остатки КАК РезервыОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыМенеджеров.СрезПоследних КАК ПриоритетыМенеджеровСрезПоследних ПО РезервыОстатки.Менеджер = ПриоритетыМенеджеровСрезПоследних.Менеджер ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, "Остаток", ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0 ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки УПОРЯДОЧИТЬ ПО Приоритет УБЫВ 2 запроса первый запрос по регистрам ПриоритетыМенеджеров Срез Последних РезервыОстатки связь по левому соединению поле Менеджер второй запрос во регистру ОстаткиНоменклатурыОстатки выбираем Номенклатуру КоличествоОстаток и две функции 0 и " Остаток" в настройках запроса : Объединения псевдонимы будет Приоритет - функция 0 параметры : произвольная дата выбранные поля: менеджер номенклатура приоритет резерв Группировка:Таблица строки номенклатура, колонки менеджер задача решена. | |
|
Всего комментариев: 0 | |