Задача 1.13

Компания занимается оптовой торговлей складских стеллажей и их
комплектующих. Закупка комплектующих отражается документом «Приходная
накладная», продажа - «Расходная накладная».
Каждый стеллаж представляет собой некоторый фиксированный набор
комплектующих (например, 4 стойки, 5 полок и 20 болтов). Необходимо
обеспечить уникальность деталей, т.е. одна и та же деталь не может относиться к
разным стеллажам.
Учет остатков ведется в разрезе складов. В документах «Приходная
накладная» и «Расходная накладная» склад только один (склад – реквизит шапки).
Возможна продажа как отдельных комплектующих, так и целых
стеллажей, причем и стеллажи и их комплектующие указываются в одной
табличной части. В случае продажи стеллажа осуществляется списание со склада
соответствующего количества комплектующих. В том случае, если каких-либо
комплектующих на складе не хватает, документ проводится не должен. Учет
себестоимости деталей вести не требуется.
Создать отчет, который в разрезе складов будет показывать количество
целых стеллажей, и отчет, который будет показывать количество деталей в
разрезе стеллажей, к которым они относятся, и складов. Например, если стеллаж
состоит из 4 стоек, 5 полок и 20 болтов

text.jpg

Видео обзор урока


Объекты метаданных

Нам понадобится справочник "Склады", и реквизит для документов "Приходная" и "Расходная"

2015-09-26 11-59-36 Конфигуратор - Каркасная конфигурация.png

Регистры

Здесь следует обратить внимание на создание регистра "Состав стеллажей", он непериодический и с независимым режимом записи

2015-09-26 12-00-21 Конфигуратор - Каркасная конфигурация.png

Создадим процедуру "Обработка проведения" для документа "Расходная"


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

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



Создание отчетов

Отчет "Наличие стеллажей на дату"



ВЫБРАТЬ
	СоставСтеллажей.Стеллаж,
	СоставСтеллажей.Количество,
	Склады.Ссылка КАК Склад,
	СоставСтеллажей.Комплектующее
ПОМЕСТИТЬ ВТ_НачалДанные
ИЗ
	РегистрСведений.СоставСтеллажей КАК СоставСтеллажей,
	Справочник.Склады КАК Склады
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_НачалДанные.Склад,
	ВТ_НачалДанные.Стеллаж,
	МИНИМУМ(ВЫБОР
			КОГДА ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) = 0
				ТОГДА 0
			ИНАЧЕ ВЫРАЗИТЬ(ОстаткиНоменклатурыОстатки.КоличествоОстаток / ВТ_НачалДанные.Количество - 0.5 КАК ЧИСЛО(10, 0))
		КОНЕЦ) КАК Остаток
ПОМЕСТИТЬ ВТ
ИЗ
	ВТ_НачалДанные КАК ВТ_НачалДанные
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(, ) КАК ОстаткиНоменклатурыОстатки
		ПО ВТ_НачалДанные.Комплектующее = ОстаткиНоменклатурыОстатки.Номенклатура
			И ВТ_НачалДанные.Склад = ОстаткиНоменклатурыОстатки.Склад

СГРУППИРОВАТЬ ПО
	ВТ_НачалДанные.Склад,
	ВТ_НачалДанные.Стеллаж
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ.Склад,
	ВТ.Стеллаж,
	ВТ.Остаток
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.Остаток > 0

Отчет "Наличие деталей на дату"



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



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

2015-09-26 12-01-56 Конфигуратор - Каркасная конфигурация.png

На этом всё. Надеюсь данный урок был полезен для Вас и Вы узнали много нового.



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

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