Имя: Пароль:
1C
 
v7: Задваиваются остатки по некоторым группам товаров
Ø
0 Павиандырь
 
04.02.05
00:30
У меня едет крыша. Хочется верить, что я не первый или туплю.
Итак, в "отчете по остаткам ТМЦ" обычной торговли итоги считаются неправильно. То есть, итог по группе, состоящей из нескольких подгрупп, не равен сумме итогов этих самых подгрупп. Релиз 21 dbf.
 ТИ с пересчетом остатков и последовательность восстанавливать не предлагать, ибо уже. Конечно, безрезультатно.
 Путем наблюдений выяснено, что "виноваты" не все группы, а только некоторые. Если их исключать из обработки в МФ, то результат уменьшается на сумму, вдвое большую реального итога по исключенной группе.
 Что бы это могло быть, господа?
1 Добрый дядя
 
04.02.05
00:39
Сам напиши отчет по остаткам и проверь рабочий, или используй отчет по регистрам из unireps
2 Павиандырь
 
04.02.05
00:49
(1) Это да. И это, видимо, таки случится, если я всё же первый на этой поляне граблей.
 Списать ошибки на глюк алгоритма соблазнительно, но не верится, что тогда они впервые за более чем год работы проявились именно сегодня. Но думать на движок хочется ещё меньше, да и страннее это. Вообще думать уже не хочется... %-( Наверное, до утра оставлю.
3 leshik
 
04.02.05
05:15
а могло быть то, что вы изменили уровни вложенности номенклатуры, и в этом случае он остатки по группам считает не корректно...
//Added by Vaicartana
//{
Процедура РассчитатьИтогиПоГруппам(СписокСкладов)
  ТЗГрупп=СоздатьОбъект("ТаблицаЗначений");
  
  ТЗ.Выгрузить(ТЗГрупп);
  ТЗ.НоваяКолонка("НомерСтрокиГруппы");
  ТЗГрупп.УдалитьСтроки();
  
  ТЗ.ВыбратьСтроки();
  МаксимальныйУровень=0;
  Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Если ТЗ.ТекРасшифровка.ЭтоГруппа()=1 Тогда
      ТЗГрупп.НоваяСтрока();
      ТЗГрупп.ТекРасшифровка = ТЗ.ТекРасшифровка;
      ТЗГрупп.Родитель = ТЗ.Родитель;
      ТЗГрупп.Уровень = ТЗ.Уровень;
      
      Если МаксимальныйУровень<ТЗ.Уровень Тогда
        МаксимальныйУровень=ТЗ.Уровень;
      КонецЕсли;
    Иначе
      //Заполняется первый родитель
      Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
        Сумма=ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,"Сумма"+Сч)+ТЗГрупп.ПолучитьЗначение(ТЗГрупп.НомерСтроки,"Сумма"+Сч);
        ТЗГрупп.УстановитьЗначение(ТЗГрупп.НомерСтроки, "Сумма" + Сч, Сумма);
      КонецЦикла;
    КонецЕсли;
    ТЗ.НомерСтрокиГруппы=ТЗГрупп.НомерСтроки;
  КонецЦикла;
  
  //Заполняются все остальные уровни
  Для Уровень=1 По МаксимальныйУровень Цикл
    //однозначно по группам цикл будет быстрее!
    ТЗГрупп.ВыбратьСтроки();
    Пока ТЗГрупп.ПолучитьСтроку()=1 Цикл
      //каждый уровень заполняем только один раз!
      Если Уровень=1 Тогда
        Стр=0;
        Если ТЗ.НайтиЗначение(ТЗГрупп.ТекРасшифровка,Стр,"ТекРасшифровка")=1 Тогда
          Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
            Сумма=ТЗГрупп.ПолучитьЗначение(ТЗГрупп.НомерСтроки,"Сумма"+Сч);
            ТЗ.УстановитьЗначение(Стр, "Сумма" + Сч, Сумма);
          КонецЦикла;
        КонецЕсли;
        //Здесь нужно собрать все итоги в строку с уровнем 12
        Стр=0;
        Если ТЗ.НайтиЗначение(12,Стр,"Уровень")=1 Тогда
          Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
            Сумма=ТЗ.ПолучитьЗначение(Стр,"Сумма"+Сч)+ТЗГрупп.ПолучитьЗначение(ТЗГрупп.НомерСтроки,"Сумма"+Сч);
            ТЗ.УстановитьЗначение(Стр, "Сумма" + Сч, Сумма);
          КонецЦикла;
        КонецЕсли;
      КонецЕсли;
      Если Уровень=ТЗГрупп.Уровень Тогда
        Стр=0;
        Если ПустоеЗначение(ТЗГрупп.Родитель)=1 Тогда
          Продолжить;
        КонецЕсли;
        Если ТЗ.НайтиЗначение(ТЗГрупп.Родитель,Стр,"ТекРасшифровка")=1 Тогда
          ТЗ.ПолучитьСтрокуПоНомеру(Стр);
          Для Сч = 1 По СписокСкладов.РазмерСписка() Цикл
            Сумма=ТЗ.ПолучитьЗначение(Стр,"Сумма"+Сч)+ТЗГрупп.ПолучитьЗначение(ТЗГрупп.НомерСтроки,"Сумма"+Сч);
            ТЗ.УстановитьЗначение(Стр, "Сумма" + Сч, Сумма);
            ТЗГрупп.УстановитьЗначение(ТЗ.НомерСтрокиГруппы, "Сумма" + Сч, Сумма);
          КонецЦикла;
        КонецЕсли;
      КонецЕсли;
    КонецЦикла;
  КонецЦикла;
КонецПроцедуры
//}
//Added by Vaicartana
16)Между строчками:
==Если КопияТЗ.Родитель = ТЗ.ТекРасшифровка Тогда==
и:
==Если (ТЗ.Уровень <> 12) И (ТЗ.Уровень <= КопияТЗ.Уровень) Тогда==
Вставил ==Если Уровень <> ТЗ.Уровень Тогда Продолжить КонецЕсли;===
Вот что на форуме пробегало.
Огромный респект автору :-)
4 Павиандырь
 
04.02.05
10:05
(3) Сдаётся мне, что вы вполне правы, но проверить сейчас не могу. :-(
Ибо действительно, в справочнике было 6 уровней. В типовой же afair 5. Спасибо и тебе, и Вайкартане!
5 Павиандырь
 
04.02.05
12:57
(4) И ведь заработало!
 Теперь остаётся догадаться, где ещё могут всплыть последствия...
6 Anton R
 
04.02.05
13:04
Насколько я помню в последней торговле такого глюка нет
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс