[Специалист профессионал 1С 8.2 8.3 ]

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

параметры : произвольная дата

выбранные поля: менеджер номенклатура приоритет резерв


Группировка:Таблица строки номенклатура, колонки менеджер


задача решена.

Просмотров: 1762 | Добавил: moshefoo | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *: