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

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

Очистите движения перед проведением.
alexkhua
Цитата(logist @ 10.01.13, 15:54) необходимо зарегистрироваться для просмотра ссылки
Очистите движения перед проведением.

Да вроде как очистил.


А, начинаю понимать. Попробую, спасибо.
alexkhua
Очистка тут не причем. Выходит, что на момент проведения уже проведенного документа нужно сначала снять его проведение , а уже затем проводить снова, иначе программа видит остатки с учетом этого документа. Прастите если пишу тут понятные истины ))
logist
Цитата(alexkhua @ 10.01.13, 21:54) необходимо зарегистрироваться для просмотра ссылки
Прастите

ПрАстите, но истина в том, что нужно получать остатки без учета движений проводимого документа. Но отмена проведения - это полные глупости.
alexkhua
Цитата(logist @ 11.01.13, 9:08) необходимо зарегистрироваться для просмотра ссылки
ПрАстите, но истина в том, что нужно получать остатки без учета движений проводимого документа. Но отмена проведения - это полные глупости.

Намекните как это сделать.
logist
Я выше написал - очистить движения. Посмотрите типовые решения, что ли, общий модуль "ОбщегоНазначения" процедура "УдалитьДвиженияРегистратора".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.