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