Имя: Пароль:
1C
1С v8
Ошибка в расчете остатков при перепроведении документа
0 Meskon
 
01.09.11
14:45
Платформа 8.2.11.236
Конфигурация Комплексная автоматизация, редакция 1.1 (1.1.1.1)
Есть проведенное Перемещение товаров, которое списывает некий товар из резерва и перемещает его на другой склад. Если в проведенном документе нажать ОК или провести, то при расчете резервов считает что резервы уже списаны. Получаем что то вроде КСнятиюСРезерва=100, Врезерве=0 и перемещение не проводится. Если проводить непроведенный документ, никаких проблем не возникает. Расчет происходит в общем модуле контроля остатков. Вопрос.. Это косяк релиза? И как лучше исправить подобную ситуацию? Переписывать модуль контроля остатков не очень бы хотелось. Аналогичные проблемы возникают в реализации из резерва и еще некоторых документах.
1 Рэйв
 
01.09.11
14:49
В модуль контроля остатков скорее всего передается параметром момент или дата на которую идет проверка. Скорее всего док включает свои движения. Сделай чтобы передавалась граница из момента времени дока с видом "Исключая"
2 Meskon
 
01.09.11
15:08
В сам модуль передается структура, в которой есть дата. Но в самом условии в запросе даты нет. Привожу текст запроса:


ВЫБРАТЬ // Запрос, контролирующий остатки на складах
   Док.Номенклатура                                        КАК Номенклатура,
   Док.Номенклатура.Представление                          КАК НоменклатураПредставление,
   Док.Номенклатура.ЕдиницаХраненияОстатков.Представление  КАК ЕдиницаХраненияОстатковПредставление,
  Док.ХарактеристикаНоменклатуры                                КАК ХарактеристикаНоменклатуры,
   ПРЕДСТАВЛЕНИЕ(Док.ХарактеристикаНоменклатуры)                КАК ХарактеристикаНоменклатурыПредставление,
  &ПустаяСерия                                        КАК СерияНоменклатуры,
   ПРЕДСТАВЛЕНИЕ(&ПустаяСерия)                        КАК СерияНоменклатурыПредставление,
   Док.ДокументРезерва                                        КАК ДокументРезерва,
  Сумма(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15,3)))                                    КАК ДокументКоличество,
  &Склад                                                  КАК Склад,
   ЕСТЬNULL(МАКСИМУМ(Резервы.КоличествоОстаток), 0)        КАК РезервыКоличество
ИЗ
   Документ.ПеремещениеТоваров.Товары КАК Док

ЛЕВОЕ СОЕДИНЕНИЕ
   РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(,Склад = &Склад И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) И (Номенклатура, ДокументРезерва) В (
   ВЫБРАТЬ
       Док.Номенклатура КАК Номенклатура, Док.ДокументРезерва КАК ДокументРезерва
   ИЗ
       Документ.ПеремещениеТоваров.Товары КАК Док
   ГДЕ
       Док.Ссылка = &ДокументСсылка
       И НЕ Док.Номенклатура.Комплект
       И Док.ДокументРезерва НЕ в (&МассивПустыхСсылок)
И (Док.ДокументРезерва ССЫЛКА Документ.ЗаказПокупателя
ИЛИ Док.ДокументРезерва ССЫЛКА Документ.ВнутреннийЗаказ  ИЛИ Док.ДокументРезерва ССЫЛКА Документ.МаршрутныйЛист ИЛИ Док.ДокументРезерва ССЫЛКА Документ.ЗаказНаПроизводство ИЛИ Док.ДокументРезерва ССЫЛКА Документ.ПриходныйОрдерНаТовары)
)) КАК Резервы
ПО
   Резервы.Номенклатура = Док.Номенклатура
  И Резервы.ДокументРезерва = Док.ДокументРезерва    
  //СОЕДИНЕНИЕ_Характеристика_Остатки// И Резервы.ХарактеристикаНоменклатуры = Док.ХарактеристикаНоменклатуры
  //СОЕДИНЕНИЕ_Серия_Остатки// И (Резервы.СерияНоменклатуры = Док.СерияНоменклатуры ИЛИ (НЕ ЕстьNull(ВЫРАЗИТЬ(Док.ДокументРезерва КАК Документ.ЗаказПокупателя).ДоговорКонтрагента.ОбособленныйУчетТоваровПоЗаказамПокупателей,ложь)))

ГДЕ
   Не Док.Номенклатура.Комплект
   И Док.Ссылка  =  &ДокументСсылка
   И Док.ДокументРезерва НЕ в (&МассивПустыхСсылок)
И (Док.ДокументРезерва ССЫЛКА Документ.ЗаказПокупателя
ИЛИ Док.ДокументРезерва ССЫЛКА Документ.ВнутреннийЗаказ  ИЛИ Док.ДокументРезерва ССЫЛКА Документ.МаршрутныйЛист ИЛИ Док.ДокументРезерва ССЫЛКА Документ.ЗаказНаПроизводство ИЛИ Док.ДокументРезерва ССЫЛКА Документ.ПриходныйОрдерНаТовары)
СГРУППИРОВАТЬ ПО

   Док.Номенклатура,
  Док.ХарактеристикаНоменклатуры,
  &ПустаяСерия,
   //Сгруппировать_Серия
   Док.ДокументРезерва
ИМЕЮЩИЕ ЕСТЬNULL(МАКСИМУМ(Резервы.КоличествоОстаток), 0) < Сумма(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15,3)))
ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки // Блокирующие чтение таблицы остатков регистра для разрешения коллизий многопользовательской работы
3 catena
 
01.09.11
15:12
Остатки берутся на текущую дату. А у документа, видимо, не стоит "удалять движения"
4 Рэйв
 
01.09.11
15:12
ууу...
Только оперативная проверка остатков.  В сове время я на  долго плевался в УПП. Пришлось выинуть на помойку всю эту проверку и прикрутить сбоку свою.  Если работаете задним числом - советую сделать так же.
5 Meskon
 
01.09.11
15:38
>Остатки берутся на текущую дату. А у документа, видимо, не стоит "удалять движения"

Именно так

>ууу...
Только оперативная проверка остатков.  В сове время я на  долго плевался в УПП. Пришлось выинуть на помойку всю эту проверку и прикрутить сбоку свою.  Если работаете задним числом - советую сделать так же.

Можете свою привести в пример?
6 Рэйв
 
01.09.11
15:49
(5)я б с удовольствием, но под рукой нету.

принцип могу рассказать.

1.Снимаешь два остатка. На момент документа и на тек. дату
2. Берешь минимальный из них.
3. По этому минимальному проверяешь хватает ли остатков для списания.

при такой схеме никогда в минус не уйдешь и все будет четко и правильно работать
7 Meskon
 
01.09.11
15:51
Спасибо, попробую
Основная теорема систематики: Новые системы плодят новые проблемы.