понедельник, 8 июня 2015 г.

1c специалист решение задачи 1.33

Решение:

1) Создаем регистры следующей структуры:

Движения документов по регистрам:
Документ "Заказ":
"Заказы покупателей" +

Документ "Приходная накладная":
"Остатки номенклатуры" +

Документ "Расходная накладная":
"Остатки номенклатуры" -
"Заказы покупателей" -

2) Документ "Заказ".

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


3) Документ "Приходная накладная".

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

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


Запрос.УстановитьПараметр("Ссылка", Ссылка);


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

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


4) Документ "Расходная накладная".


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

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

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Заказ", Заказ);
Запрос.УстановитьПараметр("ТочкаИтогов", Новый Граница(МоментВремени(),ВидГраницы.Исключая));


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

Иначе
ОсталосьСписать = ВыборкаНом.КолДок;

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

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


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


5) Отчет

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


Комментариев нет:

Отправить комментарий