воскресенье, 15 февраля 2015 г.

1c специалист. Задача 1.16.


Решение:
1) Тема стеллажей уже встречалась при решении задачи 1.13, поэтому возьмем ее решение на основу. Как и в задаче 1.13 храние информации о комплектации стеллажей будем хранить в регистре сведений "Комплекты".
Добавим измерение "Склад" в документы "приход" и "расход" и регистр "Остатки номенклатуры". 
Создадим  оборотный регистр "Планирование" для планирования продаж и закупок.
Измерение -номенклатура, ресурс "Количество".
Для решения задачи потребуется сразу 4 документа.

Приходная накладная. Добавляем реквизит "склад", Пишем обработку проведения:

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

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


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

Расходная накладная. Добавляем реквизит "склад", Пишем обработку проведения:

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

План продаж. 
Сперва сформируем записи по регистру "Планирование". Затем учитывая эти движения составим из 3 таблиц: 
  1. Движений регистра "Планирования" сформированных текущим документом,
  2. Таблицы документа "План Закупок", если такой имеется.
  3. Сопоставлением этих таблиц.
Ну а дальше дело техники, обработать выборку данных из запроса и создать документ "План покупок" при необходимости.


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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.Планирование.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;


Движения.Записать();

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

Запрос.УстановитьПараметр( "ДатаНачала", Дата);
Запрос.УстановитьПараметр("ДатаОкончания",КонецНедели(Дата));

естьразличия= Ложь;
ЕстьДок = Ложь;
Результат = Запрос.ВыполнитьПакет();
Если Не Результат[2].Пустой() Тогда
Выборка =   Результат[2].Выбрать();
Пока Выборка.Следующий() Цикл
Док =   Выборка.Док;
Если ЗначениеЗаполнено(Выборка.Док)  Тогда
Док =  Док.ПолучитьОбъект();
ЕстьДок = Истина;
КонецЕсли;

Если Выборка.Требуется <> Выборка.Заказано Тогда
естьразличия = Истина;
КонецЕсли;

КонецЦикла;

КонецЕсли;


Если естьразличия Тогда
Если  ЕстьДок Тогда
Док.УстановитьПометкуУдаления(Истина);
КонецЕсли;
НовДок = Документы.ПланЗакупок.СоздатьДокумент();
НовДок.Дата = Дата;
НовДок.СписокНоменклатуры.Загрузить(Результат[2].Выгрузить());
НовДок.Записать(РежимЗаписиДокумента.Запись);

КонецЕсли;


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

Скачать решение задачи 1.16


Все БЕСПЛАТНЫЕ курсы по работе в 1С:УТ 11.1


Вы можете скачать бесплатные видеокурсы по работе в 1С:УТ 11.1 перейдя по ссылке 

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

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