суббота, 24 января 2015 г.

1с специалист задача 1.12

Условие задачи из сборника:

Компания занимается оптовой торговлей. Принята следующая схема работы: поступление товаров отражается документом «Приходная накладная». По предварительной договоренности с покупателем менеджер может оформить резерв (документ «Резервирование товара»), причем наличие товара в этот момент не важно, товар может отсутствовать. Непосредственно отгрузка товара покупателю отражается документом «Расходная накладная», при этом происходит снятие резерва. Учет товаров ведется в разрезе складов. В документах «Приходная накладная» и Расходная накладная» склад только один (склад – реквизит шапки). При проведении расходной накладной необходимо проверить наличие товара на складе и «свободного» (будет описано далее) товара. В том случае, когда товара недостаточно, документ не проводится и выводится соответствующее сообщение об ошибке. У каждого менеджера есть приоритет, чем больше приоритет, тем более ответственный менеджер и тем важнее его продажи. Таким образом, если два менеджера одновременно зарезервировали один и тот же товара, то менеджер с большим приоритетом может продать товар, зарезервированный менеджером с меньшим приоритетом. Менеджер с низким приоритетом продать чужой резерв не имеет права. Таким образом, «свободный» товар менеджера определяется как товар на всех складах минус резерв всех остальных менеджеров с приоритетом большим либо таким же, как и у текущего менеджера. Приоритет устанавливается для каждого менеджера индивидуально и может меняться не чаще чем 1 раз в месяц. При продаже необходимо использовать приоритет менеджера, актуальный на дату продажи. Себестоимость товара рассчитывается как средняя по складу. Необходимо создать отчеты по состоянию остатков и резервов на дату.
Решение задачи :
1. Создадим недостающие объекты конфигурации:
Справочник Склады,
Документ "Приходная накладная" добавляем реквизит "Склад".
Документ "Расходная накладная" добавляем реквизиты "Склад","Менеджер" (тип - справочник "физ лица")
Новый документ "Резервирование товара"
Реквизит шапки "Менеджер"
Табличная часть "Список Номенклатуры" с реквизитами "Номенклатура", "Количество".
Регистр "Остатки номенклатуры" добавим измерение "Склад"
Новый регистр "ТоварыВРезерве" измерения "Номенклатура", "Менеджер", ресурс -Количество.
Регистр сведений "CтатусыМенеджеров" с периодичностью месяц, измерение "Менеджер", ресурс "Приоритет".

2) Документ "Приходная накладная".
Создаем форму документа, в ней реализуем пересчет для реквизитов ТЧ "Цена", "Количество"
&НаКлиенте
Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент)
ОМ.РассчитатьСумму(Элементы.СписокНоменклатуры.ТекущиеДанные);
КонецПроцедуры

&НаКлиенте
Процедура СписокНоменклатурыЦенаПриИзменении(Элемент)
ОМ.РассчитатьСумму(Элементы.СписокНоменклатуры.ТекущиеДанные);
КонецПроцедуры

вызывается процедура общего модуля ОМ( с признаком "клиент").

Процедура РассчитатьСумму(ТекСтрока) Экспорт
ТекСтрока.Сумма = ТекСтрока.Количество * ТекСтрока.Цена;
КонецПроцедуры

Документ является регистратором регистра "Остатки номенклатуры", С помощью конструктора заполним обработку проведения.

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

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

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

4. Переходим к документу "Расходная накладная товара". Аналогично приходной накладной создаем форму и реализуем пересчет ТЧ.
На этом прелюдия закончена, переходим к обработке проведения.
Комментировать код не буду просто выложу его.

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

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

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


5) Переходим к отчетам.
Отчеты "Остатки товаров" идентичен отчету из предыдущей задачи (1.11), а отчет "Резервы товаров" аналогичен отчету "Остатки товаров" только вместо склада здесь менеджер.








вторник, 20 января 2015 г.

1с специалист задача 1.11

Условие задачи из сборника:

Организация занимается продажей экзотических товаров. Принята следующая схема работы: в момент оформления заказа на товар (документ «Заказ покупателя») происходит его (товара) резервирование, причем реально этого товара в это время может и не быть. Непосредственно отгрузка товара по заказу со склада и снятие резерва оформляется документом «Расходная накладная».Следует учесть, что отгрузка товаров по одному заказу может производиться с разных складов, но в документе «Расходная накладная» склад может быть только один. Необходимо предоставить пользователю возможность указать в заказе количество резервируемого товара. При этом следует контролировать количество резерва, чтобы оно не превышало количество заказанного товара.В момент проведения «Расходной накладной» производится проверка наличия свободного товара (товар на всех складах минус резерв по всем остальным заказам). В том случае, если свободного товара достаточно для отгрузки, и на выбранном складе есть необходимое количество, то документ проводится, в противном случае выдается сообщение о недостаче свободного товара или товара на складе, и документ не проводится.Отгрузка может происходить только на основании заказа, накладная, не относящаяся ни к одному заказу, не может быть введена. Предполагается, что заказ будет отгружен полностью.Себестоимость товара рассчитывается как средняя по складу.Например:Если на складе есть 10 штук авторских ручек и выписан заказ на 7 ручек,то по этому заказу можно отгрузить товар, поскольку есть свободное количество и на складе товара хватает.Если те же 10 ручек находятся на разных складах – 8 и 2, то тогда с первого склада товар отгрузить можно, а со второго нет.Если 10 ручек находятся на одном складе, но заказов выписано 2, на 7 и 8 штук. В этом случае свободного товара недостаточно и отгрузить его нельзя.Создать отчет, который в сводной таблице в разрезе товаров будет показывать на заданную дату количество в резерве и количество в разрезе складов.

Решение:
После первого прочтения задание показалось мне вполне годным, но после последующего "вкуривания" пришел к глубокому убеждению что постановка "так себе" мягко говоря. Но ничего не поделаешь пришлось решать как понял.
Потребуется завести новые объекты:
Регистр накопления:"Зарезервированные Товары" с измерениями "Номенклатура" и "Заказ" и ресурсами "количество " и "резерв". 
Регистр "Остатки номенклатуры" имеет измерения "Номенклатура" , "Склад" , ресурсы "Себестоимость" и "Количество".

Создаем документ "Заказ Покупателя" с реквизитом "Покупатель" и ТЧ ""СписокНоменклатуры" с рекизитами "Номенклатура", "Количество", "Резерв". С помощью конструктора запроса создаем движения по регистру "зарезервированные товары".

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

КонецЦикла;


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


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

Саму проверку и отказ в случае надобности реализуем в процедуре формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Объект.ДокОснование) Тогда
Отказ = Истина;
КонецЕсли;

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

Переходим к обработке проведения.
В данном случае использовать новую методику не целесообразно в силу запутанности условий,  Для реализации пришлось в запросе использовать 5!! временных таблиц. Не припомню чтобы даже в реальной практике я писал такие длинные запросы.
Собственно сама обработка проведения.

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


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

КонецЕсли;
КонецЦикла;
КонецПроцедуры

После "тщательного" тестирования переходим к отчету. 
Отчет тоже не такой простой как кажется на первый взгляд. 
В запросе пришлось делать Объединение 2-х таблиц для того чтобы вывести колонку "Резерв" как еще один склад. Для того чтобы форма отчета как в задании и не выводилась колонка итого необходимо на закладке "другие. настройки" установить "расположение общих итогов по горизонтали" равным "нет" для группировки "Номенклатура" и для всей таблицы.
Ниже прилагаю свое решение.Скачать