Имя: Пароль:
1C
 
ТЗ.Свернуть() работает некорректно
Ø
0 Mark
 
26.08.05
10:15
Господа первый раз за свою практику столкнулся с некорректной работой оператора ТЗ.Свернуть("Товар, Цена", "Количество"), не суммируются некоторые одинаковые позиции, они просто пропадают. Если кто сталкивался с подобным поделитесь. Релиз 25.
1 Денис2
 
26.08.05
10:16
Датышо!
Данные-та покажи!
2 Денис2
 
26.08.05
10:19
+1 Ваабче-та по Цене сворачивать несколько неприлично...
3 SnarkHunter
 
26.08.05
10:21
Наверняка колонки не типизированы...
4 Mark
 
26.08.05
10:21
Очень даже прилично, когда цены разные
5 Денис2
 
26.08.05
10:22
(4) Ага. А когда у тебя цена 1.3333 и 1.3334, а отображается 2 знака? Тогда и не свернётся, и (0) получится.
6 Mark
 
26.08.05
10:24
Я думал об этом :) уже типизированы Цена и Количество строго "Число".
7 Denk
 
26.08.05
10:24
Когда задаешь новые колонки в ТЗ, для числовых данных сразу задавай тип "Число" иначе при пустом значении они числом не станут
8 zzz
 
26.08.05
10:25
да 1С это лажа, там ваще ничё не работает. Тем более "Свернуть". Молодца Mark! Ты только знаешь как надо корректно! Покажи им!!
9 Mark
 
26.08.05
10:28
Да если бы не спорачивалась, но у меня:
Функция ОбщаяСумма()
Итог = 0;
ТЗ.ВыбратьСтроки()
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
 Итог = Итог + ТЗ.Цена*ТЗКоличество;
КонецЦикла;
Возврат Итог
ЦонецФункции
Ента функция выдаёт разные значения до и после свёртки!
10 Mark
 
26.08.05
10:30
(7) Ясно как божий день!
(8)Не издевайся, я долго тестировал, преже чем написать
11 ОДНик
 
26.08.05
10:31
(9) Как у тебя ваще эта функция что-то выдаёт??? Читаем: Цонецункции :-)))
12 Mark
 
26.08.05
10:32
(11)Просто в торопях ручками написал, мог бы и не заметить
13 Denk
 
26.08.05
10:33
А разрядность установлена? в продолжение в (7)
14 igork1966
 
26.08.05
10:34
(9)Екарный бабай. А с какого должно совпадать?
По округление слышал?
А если так:
Итог = Итог + ТЗ.Сумма;
15 Mark
 
26.08.05
10:36
Какое округление при деньгах и целом количестве без деления ?
16 Mark
 
26.08.05
10:38
Разрядность в количестве не поставил, но думаю это не фатально, у меня всё целое и числовое
17 Mark
 
26.08.05
10:41
Ладно господа издевающиеся, сталкнётесь и вы с таким, просто выходит 1С ке доверяй но проверяй, у меня этот механизм 2 месяца проработал, пока я дапёр куда товар пропадает!
18 igork1966
 
26.08.05
10:44
(15) А цена у тебя конечно целая, да? Копеек нет, верю!
19 Кортес
 
26.08.05
10:46
Чудес не бывает.
20 igork1966
 
26.08.05
10:46
(17) Не тупи, все нормально там со свертыванием. Проблема в тебе.
21 Mark
 
26.08.05
10:46
Копейки бывают, но это всего лишь до сотой, да и Цена типизирована и разрядность указана, это нормально
22 igork1966
 
26.08.05
10:48
(21) Ну вот, а чего ты теперь ждал?
"Копейки бывают, но это всего лишь до сотой"
23 Mark
 
26.08.05
10:49
(20)Ты бы свои высказывания объяснениями сопровождал...
24 Mark
 
26.08.05
10:51
(22)Марк, может и ты поделишься мыслями?
25 igork1966
 
26.08.05
10:59
(21) Я просмотрел что Количество а не Сумма у тебя свертыватся.
Но это неважно, проблемма в данных явно!
(20)
Часто работаю с таблицами, не разу не наблюдал каких-либо проблем.
Как заполняется таблица?
26 Митхун Чакраборти
 
26.08.05
11:02
(25) Категорически согласен. Сворачивал таблицы всяко разно, и по числам. Всё нормально работает. Проблема видимо в данных
27 Mark
 
26.08.05
11:06
ТЗ - визуальная таблица, типизированные строки, все данные заполнены.
Мы делаем:
ПромТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ПромТЗ);
ПромТЗ.Свернуть("Товар, Цена", "Количество");
после чего вышеописанная функция выдаёт разные значения
Зн1 = ОбщаяСумма(ТЗ)
Зн2 = ОбщаяСумма(ПромТЗ)
28 zzz
 
26.08.05
11:06
2(10) приведи пример десятка строк ТЗ, при котором возникают проблемы и полный код заполнения ТЗ и свёртки.
29 Mark
 
26.08.05
11:08
Думал что ошибка в выгрузке, но как убрал из алгаритма Свернуть(), всё стало работать Зн1 = Зн2
30 igork1966
 
26.08.05
11:12
(29) Кстати тип Число у Количества какой, сколько разрядов?
В курсе что тип в свернутой таблице будет как у исходной, а кол-ва увеличатся, соответственно большее число превратится в типа такого 9999.999
31 Mark
 
26.08.05
11:12
Ребята, данные попадают из ТСД в визуальную ТЗ, а потом я их из ТЗ загоняю в Документ, естесственно хочу перед этим свернуть, как написано выше, ПромТЗ как раз для документа. В течении раб.дня ТЗ пополняется строками, и при пополнении перезаполняется документ ПромТЗ (строки удаляются и снова формируются).
32 zzz
 
26.08.05
11:15
2(17) ТЗ как заполняешь?
33 android
 
26.08.05
11:15
(31) Покажи строки кода с текстом "НоваяКолонка()"
34 Mark
 
26.08.05
11:15
(30) Количество у меня щас без разрядов шпарит(но число), но всё работает (кроме Свернуть())
35 VZ
 
26.08.05
11:16
Кстати, ТЗ на форме и ТЗ как "СоздатьОбъект" - несколько отличаются...
36 Mark
 
26.08.05
11:18
для (32)
Процедура ЗагрузитьИзТСД(пар)
  ТоварыВКассу = СоздатьОбъект("ТаблицаЗначений");
  ТоварыВКассу.НоваяКолонка("Код");
  ТоварыВКассу.НоваяКолонка("Штрихкод");
  ТоварыВКассу.НоваяКолонка("Наименование");
  ТоварыВКассу.НоваяКолонка("Цена");
  ТоварыВКассу.НоваяКолонка("Количество");
  ТоварыВКассу.НоваяКолонка("Уровень");
  ТоварыВКассу.НоваяКолонка("Родитель");
  ТоварыВКассу.НоваяКолонка("Группа");
    Часы = 0;
  Минуты = 0;
  Секунды = 0;
  ТекущееВремя(Часы,Минуты,Секунды);
  Время = Строка(Часы)+":"+Строка(Минуты)+":"+Строка(Секунды);
  Терминал.FormNumber=0;
  Терминал.BeginReport();
  КоличествоЗаписей=Терминал.RecordCount;
  Если КоличествоЗаписей = 0 Тогда
   Предупреждение("Терминал пуст!!!");
    Возврат;
  КонецЕсли;
  КоличествоПолей=Терминал.FieldCount;
  ТЗСтрока = 0;
  Если ((Терминал.ResultCode=0) И (КоличествоЗаписей>0)) Тогда
    Для ТекЗапись=1 По КоличествоЗаписей Цикл
      Если Терминал.GetRecord()>=0 Тогда
        ТЗ.НоваяСтрока();
        Файл.Добавить();
        Если пар = "+" Тогда
         ТЗ.ПлюсМинус = 1;
          Файл.PM = 1;
        Иначе
         ТЗ.ПлюсМинус = 2;
          Файл.PM = 2;
        КонецЕсли;
        ТЗ.Время = Время;
        Файл.TIME = Время;
        ТЗ.ШтрихКод = Терминал.GetField(1);
        Файл.SKOD = Терминал.GetField(1);
        ТЗ.Количество = Терминал.GetField(2);
        Файл.KOL = Терминал.GetField(2);
        Если СпрЕд.НайтиПоРеквизиту("ШтрихКод",ТЗ.ШтрихКод,1) = 1 Тогда
          ПромТовар = СпрЕд.Владелец;
         ТЗ.Товар = ПромТовар;
          Файл.KOD = ПромТовар.Код;;
          СпрЦены.ИспользоватьВладельца(ПромТовар);
          СпрЦены.ИспользоватьДату(РабочаяДата());
          Если СпрЦены.НайтиПоРеквизиту("ТипЦен", Константа.РозничныйТипЦен,0) = 1 Тогда
           ТЗ.Цена = СпрЦены.Цена;
            //
            ТоварыВКассу.НоваяСтрока();
            ТоварыВКассу.Код = СокрЛП(ПромТовар.Код);
            ТоварыВКассу.Штрихкод = СокрЛП(ПромТовар.БазоваяЕдиница.Штрихкод);
            ТоварыВКассу.Наименование = СокрЛП(ПромТовар.ПолнНаименование);
            Если Число(ТЗ.Количество) > 0 тогда
              ТоварыВКассу.Цена = ТЗ.Цена;
            КонецЕсли;
            Если пар = "+" тогда
              ТоварыВКассу.Количество = ТЗ.Количество;
            ИначеЕсли пар = "-" тогда
              ТоварыВКассу.Количество = 0 - ТЗ.Количество;
            Иначе
              Предупреждение("Не задан признак у строки!");
              СтатусВозврата(0);
              Возврат;
            КонецЕсли;
         ТоварыВКассу.Уровень = ПромТовар.Уровень();
            ТоварыВКассу.Родитель = СокрЛП(?(ПромТовар.Родитель.Выбран()=1,ПромТовар.Родитель.Код,"0"));
          Иначе
            ТЗ.Цена = ПолучитьПустоеЗначение("Число");
            Сообщить("Не нашли цену товара "+ПромТовар+"!");
          КонецЕсли;
        Иначе
          ТЗ.Товар = ПолучитьПустоеЗначение("Справочник.Номенклатура");
          Сообщить("Не нашли товар со ШК "+ТЗ.ШтрихКод+" в количестве "+ТЗ.Количество+"!","!");
        КонецЕсли;
        Файл.Записать();
      КонецЕсли;
    КонецЦикла;
  Иначе Сообщить("Ошибка при работе с терминалом : "+Терминал.ResultDescription)
  КонецЕсли;
  Терминал.EndReport();
  // очистим ТСД
    Терминал.FormNumber = 0;
  Терминал.DeleteFormSetting();
  Если Терминал.LoadFormFromFile(КаталогИБ()+"ИнвЦияТСД.otf") = 0 тогда
  Иначе
    Сообщить("Не удалось загрузить файл ИнвЦияТСД.otf !","!");
  КонецЕсли;
  //добавим в документ
  ЗаполнитьСтрокиДокумента(ТоварыВКассу);
КонецПроцедуры
для (33)
  ТЗ.НоваяКолонка("Время",,,,,4,,2);
  ТЗ.НоваяКолонка("ШтрихКод",,,,"Штрих-код",6,,2);
  ТЗ.НоваяКолонка("Количество","Число",,,"Кол",3,,2);
  ТЗ.НоваяКолонка("Цена","Число",6,2,"Цена",3,,2);
  ТЗ.НоваяКолонка("Товар");
37 igork1966
 
26.08.05
11:18
(34) Тогда откуда уверенность что Количество целое?
38 Mark
 
26.08.05
11:20
(36) ТЗ нормально заполняется,
(37) у меня ТСД только штучный товар пересчитывает, значит количество целое, там аппаратно не введёшь 1.2 ...
39 Кортес
 
26.08.05
11:24
Вот, собсно и ответ...
40 android
 
26.08.05
11:24
(36) Перепиши "НоваяКолонка()" с указанием типа, например :
ТЗ.НоваяКолонка("Товар", "Справочник.Номенклатура");
41 zzz
 
26.08.05
11:26
2(36) ну покажи строки ТЗ, которые пропадают при сложении. Приведи пример числе в ТЗ, который приводит к ошибке сворачивания.
42 Mark
 
26.08.05
11:28
(40) Вариант попробовать, но не факт что панацея
43 Кортес
 
26.08.05
11:28
Кстати, что за ТСД? Почему не введешь 1.2?
44 0xFFFFFF
 
26.08.05
11:30
А вот так не пробовал?
ТоварыВКассу.НоваяКолонка("Цена", "Число", 15, 2);
ТоварыВКассу.НоваяКолонка("Количество", "Число", 15, 0);
Да с типами что то стопудов. И нефиг на таблицу грешить. Я тож в первый месяц работы в 1С тоже что ни попадя матом крыл, а позже понимал, что туплю не по божески.
  
45 Mark
 
26.08.05
11:31
(41)Извини, но мне щас сложновато их выковарить, механизм с утра работает без свёртси, свё нормально, результат моей ночной деятельности. Данные анализировал через отладчик и визуальную ТЗ.
46 VZ
 
26.08.05
11:33
"значит количество целое" - иначе говоря, раз так хачу, значит так на самом деле...
А вы мешаете... Советуете явно задать тип. Мешаете, в общем...
47 0xFFFFFF
 
26.08.05
11:33
Угу. Код просто супер!!!
ТоварыВКассу.НоваяСтрока();
.....
Если Число(ТЗ.Количество) > 0 тогда
 ТоварыВКассу.Цена = ТЗ.Цена;
КонецЕсли;
И ты хочешь, чтобы у тебя все красиво сворачивалось? Не смеши мои тапки...
48 Mark
 
26.08.05
11:33
(44) Дык три года практикую, а ты Товары в кассу не трогай, это вообще другая тема!
49 zzz
 
26.08.05
11:35
2(45) Извини, но ни при каких наборах данных у меня эта трабла не воспроизводится.
50 Mark
 
26.08.05
11:37
(47)Переобуйся, я тебе сказал не трогать.Товары в кассу, это совсем для другого. Я же не буду сидеть фильтровать процедуру, когда спрашиваете показать!
51 igork1966
 
26.08.05
11:38
(36) Чего-то мне это ненравится:
 Если Число(ТЗ.Количество) > 0 тогда
    ТоварыВКассу.Цена = ТЗ.Цена;
 КонецЕсли;
(36) В целом "мутный" какой-то код.
52 Дурочка 1С
 
26.08.05
11:39
>> ТЗ.Цена = ПолучитьПустоеЗначение("Число");
Очуметь!
53 Mark
 
26.08.05
11:39
zzz, у меня тоже всегда работала, будем считать это моим локальным глюком!
54 0xFFFFFF
 
26.08.05
11:41
(51) - см 47 (С) - ща и тебе скажут, что ТоварыВКассу не при чем.
(50) Извини, но просто первая глупость, которая кинулась в глаза - эт было товары в кассу...
55 Mark
 
26.08.05
11:41
(52) чего тут очумелого ?
56 zzz
 
26.08.05
11:42
2(53) значит проблемы нет? Зачем ветку заводил?
Потрать время - приведи проблемные данные. Если они есть.
57 Mark
 
26.08.05
11:43
(54) И ты извини, сказывается бессонная ночь :)
58 0xFFFFFF
 
26.08.05
11:43
(55) Слухай, а ты уверен, что все товары дешевле 1000.00 рублей?
59 KAPACb
 
26.08.05
11:44
одноэсники
мне б вашы проблемы
60 Mark
 
26.08.05
11:45
(58) Уверен, продукты
61 igork1966
 
26.08.05
11:46
(55) А что написать "ТЗ.Цена = 0" что-то мешает???
62 Denk
 
26.08.05
11:46
ТЗ.НоваяСтрока();
        
...
Если СпрЕд.НайтиПоРеквизиту("ШтрихКод",ТЗ.ШтрихКод,1) = 1 Тогда
          
...
Иначе
ТЗ.Товар = ПолучитьПустоеЗначение("Справочник.Номенклатура");
          Сообщить("Не нашли товар со ШК "+ТЗ.ШтрихКод+" в количестве "+ТЗ.Количество+"!","!");
КонецЕсли;
Если у тебя попадает в иначе то цена и количество не прописываются.
У тебя Сообщение из иначе высвечивается?
        
63 КонецЦикла
 
26.08.05
11:48
Все ниасилил... но фцелом смешна :)
Колонки лучше все же типизировать
НоваяКолонка("Сумма","Число");
64 Дурочка 1С
 
26.08.05
11:50
>> ТЗ.Количество = Терминал.GetField(2);
 
Чем задавать формат колонки, надежнее записывать в ячейки данные с гарантрированным форматом:
 
ТЗ.Количество = 0+Терминал.GetField(2);
ТЗ.Цена = 0+СпрЦены.Цена;
ТЗ.Цена = 0; (вместо идиотского ПолучитьПустоеЗначение("Число");)
65 Mark
 
26.08.05
11:51
Правильно, я ведь незнаю какой товар?
Но и
  Сообщить("Не нашли товар со ШК "+ТЗ.ШтрихКод+" в количестве "+ТЗ.Количество+"!","!");
выпадает крайне редко, а если выпадает, то это исключительная ситуация, у меня есть другие методы, они работают. Юзер видит на экране пустую строку в ТЗ и самостоятельно её заполняет!
66 Mark
 
26.08.05
11:54
(64) Есть просто функция Число()!
67 Mark
 
26.08.05
11:56
Господа, спасибо за живое обсуждение моей простой но наболевшей темы, мне кажется мы уже всё разжевали!
68 КонецЦикла
 
26.08.05
11:58
2(66) Попробуй все же типизировать колонки - хоть увидишь, что нули остались где неправильно заполнял... и к тому же не нужно писать будет:
ТЗ.Цена = 0;
Если совсем затупишь - выгрузи ТЗ в обработку и по клику будешь открывать и смотреть несвернувшееся или распечатай оттуда ее с полными кодами элементов
69 KAPACb
 
26.08.05
11:59
(66) ну и чо чшто есть?
куда проще писсать 0 + ..., или "" + ...
70 Mark
 
26.08.05
12:07
(69) КАРАСЬ, у нас демократия :)
71 Kroha
 
30.08.05
00:58
Господа, пусть вас это не удивляет, но у меня на 25 релизе была аналогичная ситуация. Все выше перечисленные методы были испробованы и не дали результата. Как ни странно ( и совершенно не объяснимо) помогло использование метода ТЗ.Свернуть с номерами колонок, а не их названиями. Мark, побробуйте заменить название колонок их номерами.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший