Имя: Пароль:
1C
1C 7.7
v7: Помогите с алгоритмом вывода на печ форму
0 zenon46
 
13.12.17
09:52
Доброго дня.
Есть две таблицы значений, в первой таблице значений много разных колонок, ключевая это Номенклатура, таблица отсортирована по этой колонке, а во вторая свернута по "номенклатуре" с просуммированными нужными колонками (итоги), суть дела вывода на форму, перебирая значения первой таблицы выводим в строку до тех пор пока следующий элемент в выборке будет отличаться от предыдущего, в этот момент выводим строку (итоги) из второй таблицы. Проблема заключается в том что при окончании перебора первой таблицы итоги из второй не выводятся.

        НомерСтроки = 1;
        НомПП = 1;
        ТекНоменлатура = ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура");
        Для НомерСтроки = 1 По ТаблицаЗапроса.КоличествоСтрок() Цикл            
            Если (ТекНоменлатура <> ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура")) Тогда
                НомСтроки  = "";
                ТаблицаЗапросаВременная.НайтиЗначение(ТекНоменлатура,НомСтроки,"Номенклатура");
                ПечИтогЦенаЗаЕдиницу      = ТаблицаЗапросаВременная.ПолучитьЗначение(НомСтроки,"СуммаНоменклаутры");
                ПечИтогСтоимостьДоставки = Окр(ТаблицаЗапросаВременная.ПолучитьЗначение(НомСтроки,"СуммаДоставки"),2);
                ПечИтогПроцентДоставки   = Окр(((ПечИтогСтоимостьДоставки/ПечИтогЦенаЗаЕдиницу)*100),2);
                Таб.ВывестиСекцию("ИтогПоНоенклатуре");
            КонецЕсли;
            /// вывод строк
            ТекНоменлатура       = ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура");
            ПечНомПП             = НомПП;
            НомПП = НомПП + 1;
            Таб.ВывестиСекцию("Строка");
        КонецЦикла;
1 Рэйв
 
13.12.17
09:53
в конце цикла выведи еще раз итоги, в чем проблема то?
2 zenon46
 
13.12.17
09:55
(1) да получается что там еще хранятся итоги от предыдущей "номенклатуры"
3 Рэйв
 
13.12.17
09:56
(2)Полностью блок выведи который у тебя в
Если (ТекНоменлатура <> ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура")) Тогда
4 zenon46
 
13.12.17
09:57
(3) он тут полностью
5 Рэйв
 
13.12.17
09:59
(2)А вообще это делается схематично так:

ЗначениеДо="!@#";
Для Каждого что Из Чего то Цикл
     Если ПроверяемоеЗначение<>ЗначениеДо Тогда
        //ищем итоги в тз итогов, выводим
     КонецЕсли;
     //выводим строку
     ЗначениеДо=ПроверяемоеЗначение;
Конеццикла;

//-----------
тогда итоги будут вначале и выведутся все
6 Рэйв
 
13.12.17
10:00
только сортировка должна быть обязательно по ПроверяемоеЗначение. Иначе фигню выведет
7 zenon46
 
13.12.17
10:01
(6) сортировка конечно есть, косяк в том что не выводится итоги по последней номенклатуре.
8 Рэйв
 
13.12.17
10:02
(7)Попробуй схему из (5) она стопудово рабочая. сто раз проверенная
9 Злопчинский
 
13.12.17
10:02
Возьми на ИС универсальную печать по ТЗ и не мучайся
Искать по NotaBene
10 zenon46
 
13.12.17
10:05
(9) дело не в мучайся, я хочу сделать и понять почему не работает моя схема.
11 zenon46
 
13.12.17
10:07
(8) блин да вроде моя схема точно такая же, убрал все для понимания

        НомерСтроки = 1;
        НомПП = 1;
        ТекНоменлатура = "";//ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура");
        Для НомерСтроки = 1 По ТаблицаЗапроса.КоличествоСтрок() Цикл            
            Если (ТекНоменлатура <> ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура")) Тогда
                Таб.ВывестиСекцию("ИтогПоНоенклатуре");
            КонецЕсли;
            ТекНоменлатура       = ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура");
            ПечНомПП             = НомПП;
            НомПП = НомПП + 1;
            Таб.ВывестиСекцию("Строка");
        КонецЦикла;
12 Злопчинский
 
13.12.17
10:08
Добавь в основную таблицу номенклатуры в конец пустую строку. При смене номенклатуры выводить все как обычно. Потом проверка если номенклатура пустая то прервать или на цикл продолжить.
13 zenon46
 
13.12.17
10:08
(12) во, это идея, сейчас попробую.
14 Злопчинский
 
13.12.17
10:09
Или после цикла просто напиши вывод итога по последней строке
15 Злопчинский
 
13.12.17
10:11
ТекНоменклатуру лучше инициализировать  пустымзначегием номенклатуры а не пустой строкой
И что за извраты с выборкой по тз
Напиши обычный цикл с выбрать строки и получитьстроку
16 Остап Сулейманович
 
13.12.17
10:12
(11) Ну все же просто
НомерСтроки = 1;
НомПП = 1;
...
Для НомерСтроки = 1 По ТаблицаЗапроса.КоличествоСтрок() Цикл            
...         Таб.ВывестиСекцию("Строка");
КонецЦикла;

//После основного цикла
Если ТаблицаЗапроса.КоличествоСтрок() > 0 Тогда
    Таб.ВывестиСекцию("ИтогПоНоенклатуре");
КонецЕсли;
17 Злопчинский
 
13.12.17
10:13
Код - авно
Итог будет выводиться для первой же строки
18 Злопчинский
 
13.12.17
10:14
(17) это автору
19 zenon46
 
13.12.17
10:21
(17) еще раз повторяю, итоги выводятся как нужно, если в первой строке номенклатура "А", а во второй "Б", итог выводится после первой же строки, если "А" "А" "Б" то после второй.
20 Остап Сулейманович
 
13.12.17
10:21
(17) Автор догадается получить нужную строку из таблицы. Я так думаю.
От сокращения кода примера суть не теряется. Я так думаю.
Возможно кому то нужно разжевать вплоть до положения точки с запятой, которые разделители операторов. Надеюсь, участники ветки в этом не нуждаются?
21 Злопчинский
 
13.12.17
10:27
(19) в твоём коде итог выведется на первой де строке номенклатуры, потому что она не совпадает с пустой номенклатурой.
Код авно
22 Остап Сулейманович
 
13.12.17
10:27
(19) В (5) вполне рабочая схема. Нужно только допилить первый вывод итогов.

Примерно так :
текШаблон = "";
Для поз = 1 По ТЧ.КоличествоСтрок() Цикл
    ТЧ.ПолучитьСтрокуПоНомеру(поз);
    Если (текШаблон <> ТЧ.ШаблонИзТЧ) И (ПустоеЗначение(текШаблон) = 0) Тогда
        //Выводим итог
        текШаблон = ТЧ.ШаблонИзТЧ;
    КонецЕсли;
КонецЦикла;
//выводим итог по последнему значению
//в текШаблон - значение по которому итог еще не выводился
23 Злопчинский
 
13.12.17
10:28
Догадаться про инициалы зимовать номенклатуру перед циклом значением номенклатуры из первой строки - влом?
24 Злопчинский
 
13.12.17
10:28
(22) ишшо один кудесник ;-)
25 Злопчинский
 
13.12.17
10:30
Перед циклом проинициализировать  значением из первой строки.
Далее обычный цикл вообще без извратов.
После цикла вывести итог по последней строке.
26 zenon46
 
13.12.17
10:30
(23) так там так и есть .
ТекНоменлатура = ТаблицаЗапроса.ПолучитьЗначение(НомерСтроки,"Номенклатура");
27 zenon46
 
13.12.17
10:34
Все сделал как в (12), добавил пустую строку, и просто ее не вывожу, а перед пустой есте-но выводится итог по последней номенклатуре.
28 HawkEye
 
13.12.17
10:38
(11) не увидел ДВУХ таблиц из (0)...
29 HawkEye
 
13.12.17
10:40
(27) не проще было в условие добавить И ТекНоменлатура <> "" ?
30 zenon46
 
13.12.17
10:45
(28) да лишнее понавырезал.
31 ikea
 
13.12.17
10:47
Индексированная таблица в помощь с потомками, и не надо будет огород городить.