Имя: Пароль:
1C
1С v8
Программное перемещение товара с перепроведением документа расход
0 sqr4
 
18.06.13
11:51
Такая задача. Организация продает товар. Есть подразделения и привязанные к нему торговые точки, товар может хранится как в подразделении так и на торговой точке. При продаже товар сначала списывается с остатка на торговой точке, а потом если его не хватает с подразделения, которому эта точка принадлежит. В конце дня запускается обработка. Которая перемещает товар, который был продан с подразделения, на торговые точки и перепроводит документ расход, для того чтобы списание товара происходило только с торговых точек. Так вот вопрос, как сделать это самое перепроведение.

Т.е я делал так. В запросе получаются все обороты, которые были по торговым точкам за день. Затем в цикле обходятся полученные записи, формируется документ Перемещение->Отменяется проведение документа Расход->проводится сформированный документ Перемещение с датой в начало дня->проводится Документ расход с датой продажи, т.е позднее перемещения.

Но данная конструкция не работает, т.е списание при проведении документа Расход, происходит как будто бы документа Перемещение и небыло в помине). Если проводить сформированные документы вручную, то все работает на ура.

Прошу помощи.
1 sqr4
 
19.06.13
11:58
Дело вот в чем, если проводить перемещение началом дня, то оно почему то не проводится так как нужно. Не могу понять в чем дело
2 Галахад
 
гуру
19.06.13
12:03
Не понял. Перемещение не перемещает товар?
3 sqr4
 
19.06.13
12:05
минуса плодит по партиям, выложу текст обработки проведения, за одно и в гонокод носом потыкаете
СтрЗап = "Выбрать
               |РТ.Товар,
               |РТ.Количество
               |ПОМЕСТИТЬ ТЧ
               |ИЗ
               |&ТаблЧасть КАК РТ;
               |Выбрать
               |ТЧ.Товар КАК Товар,
               |СУММА(ТЧ.Количество) КАК Количество
               |ИЗ ТЧ
               |СГРУППИРОВАТЬ ПО ТЧ.Товар";
   Запрос = Новый Запрос(СтрЗап);
   Запрос.УстановитьПараметр("ТаблЧасть",ПеремещениеТовара);
   Выборка = Запрос.Выполнить().Выбрать();
   Фильтр = Новый Структура;
 
   Пока Выборка.Следующий() Цикл
        Фильтр.Вставить("Товар",Выборка.Товар);
        Фильтр.Вставить("Склад",Откуда);
        Если РегистрыНакопления.ПартииТоваров.Остатки(Дата,Фильтр,"Товар","Количество").Итог("Количество")<Выборка.Количество тогда
            Предупреждение("Недостаточно товара "+Выборка.Товар+" на складе!");
            Отказ = Истина;
       КонецЕсли;
   КонецЦикла;
   Сортировка = "";
   Если РегистрыСведений.МетодыРасчета.СрезПоследних(Дата,)[0].МетодРасчета = Перечисления.МетодРасчета.LIFO тогда
       Сортировка = "Убыв";
   КонецЕсли;

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

       КонецЦикла;
   КонецЦикла;
4 Галахад
 
гуру
19.06.13
12:15
Код не читал.

Может при программном проведении в обработку попадает пустая дата?
5 sqr4
 
19.06.13
12:26
Документы создаются нормальные, если их потом перепровести оперативно, а затем провести расход тоже оперативно, все нормально, по поводу пустой даты сейчас проверю
6 sqr4
 
19.06.13
12:32
Пустых дат нет. Даже если вручную проводить документы перемещения с датой на начало дня идут минуса по партиям, гдето в проведении я накосячил, как мне кажется
7 sqr4
 
20.06.13
11:23
В общем дело скорее всего в получении остатков на дату
Запрос.УстановитьПараметр("Период",Дата); как правильно получить остатки?
8 sqr4
 
20.06.13
12:53
в общем дело было в том что в параметр период я передавал значение дата, а надо было граница, со значением ВидГраницы.Включая, при проведении были не видны документы проведенные с таким же значением даты и выводил не те остатки.
9 Шапокляк
 
20.06.13
13:00
(0) Какой-то хитрозаколдованный у вас механизм. Почему бы не сделать проще: изначально все списывать с торговой точки, пусть даже в минус. В конце дня собрать все минусовые остатки и переместить их началом дня с подразделения, после чего перпровести дневное списание. Тогда не придется шариться запросом по документам, что не есть гуд, и в реализации попроще будет.
10 SanGvin
 
20.06.13
13:14
(3) жесть... остатки лучше выбирать на уровне запроса соеднинением, а потом проверять. То что ты написал проверку в цикле через объектную модель = запрос в цикле.
11 sqr4
 
02.07.13
11:13
Ну, прочитав пару книг) я понял что за веселый код я соорудил)