Задача 1.12

Компания занимается оптовой торговлей. Принята следующая схема
работы: поступление товаров отражается документом «Приходная накладная». По
предварительной договоренности с покупателем менеджер может оформить
резерв (документ «Резервирование товара»), причем наличие товара в этот
момент не важно, товар может отсутствовать. Непосредственно отгрузка товара
покупателю отражается документом «Расходная накладная», при этом происходит
снятие резерва.
Учет товаров ведется в разрезе складов. В документах «Приходная
накладная» и Расходная накладная» склад только один (склад – реквизит шапки).
При проведении расходной накладной необходимо проверить наличие
товара на складе и «свободного» (будет описано далее) товара. В том случае,
когда товара недостаточно, документ не проводится и выводится
соответствующее сообщение об ошибке.
У каждого менеджера есть приоритет, чем больше приоритет, тем более
ответственный менеджер и тем важнее его продажи. Таким образом, если два
менеджера одновременно зарезервировали один и тот же товара, то менеджер с
большим приоритетом может продать товар, зарезервированный менеджером с
меньшим приоритетом. Менеджер с низким приоритетом продать чужой резерв
не имеет права. Таким образом, «свободный» товар менеджера определяется как
товар на всех складах минус резерв всех остальных менеджеров с приоритетом
большим либо таким же, как и у текущего менеджера.
Приоритет устанавливается для каждого менеджера индивидуально и
может меняться не чаще чем 1 раз в месяц. При продаже необходимо
использовать приоритет менеджера, актуальный на дату продажи.
Себестоимость товара рассчитывается как средняя по складу.
Необходимо создать отчеты по состоянию остатков и резервов на дату.
2015-09-20 11-49-14 1C_Spec_83.pdf - Adobe Acrobat Pro.png
Видео обзор готового решения



Решение задачи

Вначале создадим необходимые объекты - документы, регистры накопления и регистр сведений

СтруктураОбъектов.png


Теперь создадим процедуру "Обработка проведения" для документа "Расходная накладная"
 
	
Процедура ОбработкаПроведения(Отказ, Режим)

	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
	ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
	ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
	ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
	Блокировка.Заблокировать(); 

	
	Движения.ОстаткиНоменклатуры.Записывать=Истина;
	Движения.Резервы.Записывать=Истина;

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
		|	СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество
		|ПОМЕСТИТЬ Док
		|ИЗ
		|	Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
		|ГДЕ
		|	РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
		|
		|СГРУППИРОВАТЬ ПО
		|	РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Док.Номенклатура,
		|	Док.Количество,
		|	ЕСТЬNULL(ОстаткиОбщ.КоличествоОстаток, 0) КАК КоличествоОстаток,
		|	ЕСТЬNULL(ОстаткиОбщ.СуммаОстаток, 0) КАК СуммаОстаток,
		|	ЕСТЬNULL(ОстаткиПоСкладу.Склад, """") КАК Склад,
		|	ЕСТЬNULL(ОстаткиПоСкладу.КоличествоОстаток, 0) КАК ОстатокПоСкладу,
		|	ЕСТЬNULL(ОстаткиПоСкладу.СуммаОстаток, 0) КАК СуммаПоСкладу,
		|	ЕСТЬNULL(МоиРезервы.КоличествоОстаток, 0) КАК МойРезерв,
		|	ЕСТЬNULL(РезервыДругих.КоличествоОстаток, 0) КАК РезервыДругих
		|ИЗ
		|	Док КАК Док,
		|	РегистрНакопления.ОстаткиНоменклатуры.Остатки(
		|			&Момент,
		|			Номенклатура В
		|				(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|					Док.Номенклатура
		|				ИЗ
		|					Док КАК Док)) КАК ОстаткиОбщ,
		|	РегистрНакопления.ОстаткиНоменклатуры.Остатки(
		|			&Момент,
		|			Номенклатура В
		|					(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|						Док.Номенклатура
		|					ИЗ
		|						Док КАК Док)
		|				И Склад = &Склад) КАК ОстаткиПоСкладу,
		|	РегистрНакопления.Резервы.Остатки(
		|			&Момент,
		|			Номенклатура В
		|					(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|						Док.Номенклатура
		|					ИЗ
		|						Док КАК Док)
		|				И Менеджер = &Менеджер) КАК МоиРезервы,
		|	РегистрНакопления.Резервы.Остатки(
		|			&Момент,
		|			Номенклатура В
		|					(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|						Док.Номенклатура
		|					ИЗ
		|						Док КАК Док)
		|				И Менеджер В
		|					(ВЫБРАТЬ
		|						ПриоритетыМенеджеровСрезПоследних.Менеджер
		|					ИЗ
		|						РегистрСведений.ПриоритетыМенеджеров.СрезПоследних(&Момент, Менеджер <> &Менеджер
		|							И Приоритет >= &Менеджер) КАК ПриоритетыМенеджеровСрезПоследних)) КАК РезервыДругих";
	
	Запрос.УстановитьПараметр("Менеджер", Менеджер);
	Запрос.УстановитьПараметр("Момент", МоментВремени());
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		СвободныйОстаток = Выборка.КоличествоОстаток - Выборка.РезервыДругих;
		Если Выборка.Количество > СвободныйОстаток Тогда
			Сообщить("Не хватает свободного остатка по товару "+Выборка.Номенклатура);
			Отказ = Истина;
			Продолжить;
		ИначеЕсли Выборка.КоличествоОстаток > Выборка.ОстатокПоСкладу Тогда
			Сообщить("Не хватает остатка на складе по товару "+Выборка.Номенклатура);
			Отказ = Истина;
			Продолжить;
		Иначе 
			Если Выборка.ОстатокПоСкладу <> 0 Тогда
				СебестоимостьШтуки = Выборка.СуммаПоСкладу / Выборка.ОстатокПоСкладу;
			КонецЕсли;
			
			СуммаСписания = ?(Выборка.Количество = Выборка.ОстатокПоСкладу, Выборка.СуммаПоСкладу, СебестоимостьШтуки *Выборка.Количество);
			Движение = Движения.ОстаткиНоменклатуры.Добавить();
			Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
			Движение.Период = Дата;
			Движение.Номенклатура = Выборка.Номенклатура;
			Движение.Склад = Склад;
			Движение.Количество = Выборка.Количество;
			Движение.Сумма = СуммаСписания;
			
			Если Выборка.МойРезерв > 0 Тогда
				//Снятие резерва
				МинимальноеКоличество = Мин(Выборка.МойРезерв, Выборка.Количество);
				
				Движение = Движения.Резервы.Добавить();
				Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
				Движение.Период = Дата;
				Движение.Номенклатура = Выборка.Номенклатура;
				Движение.Менеджер = Менеджер;
				Движение.Количество = МинимальноеКоличество;				
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
 
Отчет "Остатки товаров"
Запрос:
 
	ВЫБРАТЬ
	ОстаткиНоменклатурыОстатки.Номенклатура,
	ОстаткиНоменклатурыОстатки.Склад,
	ОстаткиНоменклатурыОстатки.КоличествоОстаток,
	0 КАК Порядок
ИЗ
	РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	РезервыОстатки.Номенклатура,
	"Резерв",
	РезервыОстатки.КоличествоОстаток,
	1
ИЗ
	РегистрНакопления.Резервы.Остатки КАК РезервыОстатки
Настройки СКД

Настройка группировок

2015-09-24 05-55-31 Конфигуратор - Каркасная конфигурация.png
 
Настройка макета для отображения отчета в точности, как в задании

2015-09-23_112552.png

Отчет "Резервы товаров"

Настройки СКД

Настройка группировок

2015-09-23_112715.png


Настройка своего макета в СКД

2015-09-23_112653.png
 
	ВЫБРАТЬ
	МАКСИМУМ(ПриоритетыМенеджеровСрезПоследних.Приоритет) КАК Приоритет
ПОМЕСТИТЬ МаксПриоритет
ИЗ
	РегистрСведений.ПриоритетыМенеджеров.СрезПоследних КАК ПриоритетыМенеджеровСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	РезервыОстатки.Номенклатура,
	РезервыОстатки.Менеджер,
	РезервыОстатки.КоличествоОстаток,
	ПриоритетыМенеджеровСрезПоследних.Приоритет КАК Порядок
ИЗ
	РегистрНакопления.Резервы.Остатки КАК РезервыОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыМенеджеров.СрезПоследних КАК ПриоритетыМенеджеровСрезПоследних
		ПО РезервыОстатки.Менеджер = ПриоритетыМенеджеровСрезПоследних.Менеджер

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ОстаткиНоменклатурыОстатки.Номенклатура,
	"Остаток",
	ОстаткиНоменклатурыОстатки.КоличествоОстаток,
	(ВЫРАЗИТЬ(МаксПриоритет.Приоритет КАК ЧИСЛО)) + 1
ИЗ
	РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ МаксПриоритет КАК МаксПриоритет
		ПО (ИСТИНА)  

Возврат к списку

  • Facebook
  • Вконтакте