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