Задача 1.14

Товар на складе размещается в ячейках. При поступлении на склад каждый товар помещается в отдельную ячейку, которая однозначно определяется своим рядом и стеллажом. При продаже товара определяется способ отгрузки: сразу или с доставкой. Если товар отгружается сразу, то чтобы быстрее осуществить продажу в первую очередь должен отпускаться ближайший товар. Если же производится доставка товара, то тогда должен списываться товар, до которого неудобнее всего добираться. Критерием удобства отгрузки (расстояние) служит сумма номера ряда и номера стеллажа. После проведения расходной накладной должна формироваться печатная форма, в которой будет указано, из каких ячеек должен быть получен товар.

 Расходная накладная №1 от 01.01.2010 
table.PNG


В данной необходимо добавить минимум объектов.

Создаем необходимые справочники:

2-objects.PNG


Добавляем реквизит "Ячейка" для документа "Приходная". Также добавляем измерение для регистра "Остатки"

1-objects.PNG

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

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

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

	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	ВыборкаОбщийИтог.Следующий();		// Общий итог
	
	// Вставить обработку выборки ВыборкаОбщийИтог
	
	Движения.ОстаткиНоменклатуры.Записывать = Истина;
	ТЗ = Новый ТаблицаЗначений;
	Тз.Колонки.Добавить("Номенклатура");
	Тз.Колонки.Добавить("Стеллаж");
	Тз.Колонки.Добавить("Ячейка");
	Тз.Колонки.Добавить("Количество");
	Тз.Колонки.Добавить("Цена");
	Тз.Колонки.Добавить("Сумма");
	
	ВыборкаНоменклатура = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаНоменклатура.Следующий() Цикл
		 НоваяСтрока = Тз.Добавить();
		 НоваяСтрока.Номенклатура = ВыборкаНоменклатура.Номенклатура;

		
		ОсталосьСписать = ВыборкаНоменклатура.Количество;
		
		Выборка = ВыборкаНоменклатура.Выбрать();
	
		Пока Выборка.Следующий() и ОсталосьСписать >0  Цикл
			    НоваяСтрока = Тз.Добавить();
				Списать = Мин(Выборка.КоличествоОстаток, ОсталосьСписать);
			
				Движение = Движения.ОстаткиНоменклатуры.Добавить();
				Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
				Движение.Период = Дата;
				Движение.Номенклатура = Выборка.Номенклатура;
				Движение.Ячейка = Выборка.Ячейка;
				Движение.Количество = Выборка.Количество;
				
				ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
				НоваяСтрока.Сумма = Списать *Выборка.Цена;
				новаястрока.количество = списать;
				НоваяСтрока.Номенклатура = "";
				
				ОсталосьСписать = ОсталосьСписать - Списать;
		КонецЦикла;
	КонецЦикла;
	


	ТабДок = Новый ТабличныйДокумент;
	Документы.РасходнаяНакладная.Печать(ТабДок,Ссылка, ТЗ);
	ТабДок.ОтображатьСетку = Ложь;
	ТабДок.Защита = Ложь;
	ТабДок.ТолькоПросмотр = Ложь;
	ТабДок.ОтображатьЗаголовки = Ложь;
	ТабДок.Показать();	
	
КонецПроцедуры




Также модернизируем процедуру "Печать" в модуле менеджера, которая была сформирована конструктором


Процедура Печать(ТабДок, Ссылка,ТЗ) Экспорт

	Макет = Документы.РасходнаяНакладная.ПолучитьМакет("Печать");
	
	ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
	Шапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьСписокНоменклатурыШапка = Макет.ПолучитьОбласть("СписокНоменклатурыШапка");
	ОбластьСписокНоменклатуры = Макет.ПолучитьОбласть("СписокНоменклатуры");


	Подвал = Макет.ПолучитьОбласть("Подвал");

	ТабДок.Очистить();

	ВставлятьРазделительСтраниц = Ложь;
	
	ТабДок.Вывести(ОбластьЗаголовок);
	ТабДок.Вывести(ОбластьСписокНоменклатурыШапка);
	
			
			
			Для Каждого Строка Из ТЗ Цикл
				ОбластьСписокНоменклатуры.Параметры.Заполнить(Строка);
				ТабДок.Вывести(ОбластьСписокНоменклатуры);

				
			КонецЦикла;
КонецПроцедуры




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

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