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

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.Резерв = МИН(КолНом,ВыборкаНом.ОстатокРезерваТекЗаказа);
КонецЕсли;
КонецЕсли;
КонецЦикла;

 


КонецПроцедуры

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

КонецПроцедуры

 

Отчеты:

Запрос по регистру остатки


ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
ОстаткиНоменклатурыОстатки.Склад КАК Склад,
СУММА(ОстаткиНоменклатурыОстатки.КоличествоОстаток) КАК Остаток
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки

СГРУППИРОВАТЬ ПО
ОстаткиНоменклатурыОстатки.Склад,
ОстаткиНоменклатурыОстатки.Номенклатура

Группировка по полям склад номенклатура, суммируем количество остаток

Параметры период произвольная дата,выбранные поля остаток

Группировки таблица , строки Номенклатура ,Колонки Склад,Номенклатура

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




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