|
Программное перемещение товара с перепроведением документа расход | ☑ | ||
---|---|---|---|---|
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
|
Ну, прочитав пару книг) я понял что за веселый код я соорудил)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |