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