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