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