Имя: Пароль:
1C
1C 7.7
v7: Сложный отчет по Расходным накладным
0 anagk
 
20.06.17
13:21
Добрый день!
Давненько не писал, но не поверите на этом форуме, хоть матеряться и посылают - реально получается сделать если вдруг где-то остановился. Так вот, есть отчет по Расходным накладным. Реально выходные данные это: Контрагент, Дата (не отображается), ТМЦ, Цена, количество, сума.
Остановился я на том, что не могу сгруппировать отчет по ЦЕНЕ.
Задача: строки - Клиент, стоблики - ТМЦ (к-во, цена, сума).
Условие: группировка должна происходить по ЦЕНЕ, под каждым видом ТМЦ и напротив Контрагента.
Таким образом можно узнать, что ЦЕНА на ТМЦ менялась.
Вот собсвтенно код:
Перем Таб;
Перем Обновить;
Перем Расшифровка;
Перем тТ, тв, тИ, т, ит;

Процедура Сформировать()
    т = СоздатьОбъект("ТаблицаЗначений");
    т.НоваяКолонка("Дата","Дата");
    т.НоваяКолонка("Контрагент", "Справочник.Контрагенты");
    т.НоваяКолонка("ТМЦ", "Справочник.ТМЦ");
    т.НоваяКолонка("Кво", "Число", 16, 3);
    т.НоваяКолонка("Сумма", "Число", 16, 2);
    т.НоваяКолонка("Цена", "Число", 16, 3);
    
    д = СоздатьОбъект("Документ");
    д.ВыбратьДокументы(НачДата, КонДата);
    Пока д.ПолучитьДокумент() = 1 Цикл
        Если НЕ ((д.Вид() = "РасходнаяНакладная") или (д.Вид() = "ВозвратнаяНакладная")) Тогда
            Продолжить;
        КонецЕсли;
        Если д.Проведен() = 0  Тогда
            Продолжить;
        КонецЕсли;
        
        д.ВыбратьСтроки();
        Пока д.ПолучитьСтроку() = 1 Цикл
            Если д.ТМЦ.ВидТМЦ <> Перечисление.ВидыТМЦ.Продукция Тогда
                Продолжить;
            КонецЕсли;
            т.НоваяСтрока();
            т.Дата = д.ДатаДок;
            т.Контрагент = д.Контрагент;
            т.ТМЦ = д.ТМЦ;
            Если д.Вид() = "РасходнаяНакладная" Тогда
                т.Цена = д.ЦенаБезНДС;
                т.Кво = д.Кво;
                т.Сумма = д.СуммаСНДС;
            Иначе
                //возврат
                т.Цена = - д.ЦенаБезНДС;
                т.Кво = - д.Кво;
                т.Сумма = - д.СуммаСНДС;
            КонецЕсли;
            
            Если ВыбКонтрагент.Выбран() = 1 Тогда
                Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
                    Если д.Контрагент.ПринадлежитГруппе(ВыбКонтрагент) = 0 Тогда
                        Продолжить;
                    КонецЕсли;    
                Иначе
                    Если д.Контрагент.Код <> ВыбКонтрагент.Код Тогда
                        Продолжить;
                    КонецЕсли;    
                КонецЕсли;
            КонецЕсли;
            Если ВыбТМЦ.Выбран() = 1 Тогда
                Если ВыбТМЦ.ЭтоГруппа() = 1 Тогда
                    Если д.ТМЦ.ПринадлежитГруппе(ВыбТМЦ) = 0 Тогда
                        Продолжить;
                    КонецЕсли;    
                Иначе
                    Если д.ТМЦ.Код <> ВыбТМЦ.Код Тогда
                        Продолжить;
                    КонецЕсли;    
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    т.Свернуть("Контрагент, Цена,ТМЦ", "Кво, Сумма");
    т.Сортировать("Контрагент, Цена, ТМЦ");
    тИ = СоздатьОбъект("ТаблицаЗначений");
    т.Выгрузить(тИ);
    тИ.Свернуть("Контрагент,Цена, ТМЦ", "Кво, Сумма");
    тИ.Сортировать("Контрагент, Цена, ТМЦ");
    тТ = СоздатьОбъект("ТаблицаЗначений");                    //для вывода на печать только тех ТМЦ, что нужно
    т.Выгрузить(тТ);
    тТ.Свернуть("ТМЦ", "Кво, Сумма");
    квотТ = тТ.КоличествоСтрок();
    тТ.Сортировать("ТМЦ+");
    заг = "Реализация готовой продукции по ";
    Если ВыбКонтрагент.Выбран() = 1 Тогда
        заг = заг + ВыбКонтрагент.Наименование;
    Иначе
        заг = заг + "покупателям";
    КонецЕсли;
    Если фДни = 1 Тогда
        заг1 = "Дата";
    Иначе
        заг1 = "Покупатели";
    КонецЕсли;
    
    Если (ТипЗначенияСтр(Таб) <> "Таблица") или (Обновить = 0) Тогда
        таб = СоздатьОбъект("Таблица");
    Иначе
        таб.Очистить();
    КонецЕсли;    
    таб=СоздатьОбъект("Таблица"); //без этого не получится
    таб.ИсходнаяТаблица("Сформировать");
    Таб.ВывестиСекцию("Шапка|Вертикаль_1");
    тТ.ВыбратьСтроки();
    Пока тТ.ПолучитьСтроку() = 1 Цикл
        Таб.ПрисоединитьСекцию("Шапка|Вертикаль_2");
    КонецЦикла;
    тИ.ВыбратьСтроки();
    Пока тИ.ПолучитьСтроку() = 1 Цикл
        Таб.ВывестиСекцию("Строка|Вертикаль_1");
        стр = 0;    стртТ = 1;
        тек = тИ.Контрагент;
        стек = "Контрагент";
        Пока т.НайтиЗначение(тек, стр, стек) = 1 Цикл
            т.ПолучитьСтрокуПоНомеру(стр);
            послСтр = 0;
            
            Для ии=стртТ По квотТ Цикл
                тТ.ПолучитьСтрокуПоНомеру(ии);
                Если тТ.ТМЦ.Код <> т.ТМЦ.Код Тогда
                    Таб.ПрисоединитьСекцию("Строка|Конец");
                Иначе
                    Таб.ПрисоединитьСекцию("Строка|Вертикаль_2");
                    стртТ = тТ.НомерСтроки + 1;
                    послСтр = тТ.НомерСтроки;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            т.УдалитьСтроку(стр);
            стр = 0;
        КонецЦикла;
        Для иии=послСтр+1 По квотТ Цикл
            Таб.ПрисоединитьСекцию("Строка|Конец");
        КонецЦикла;
        Таб.ПрисоединитьСекцию("Строка|Вертикаль_2");
    КонецЦикла;
    Таб.ТолькоПросмотр(1);
    таб.Показать();//показываем таблицу
КонецПроцедуры
1 Ёпрст
 
гуру
20.06.17
13:36
(0) код конечно, полный ПЭ.
А так то да, зачет накладывать условия ПОСЛЕ того, как оне не нужны - т.е ты ужо добавил всё в свою ТЗ, ДО условий.
2 Ёпрст
 
гуру
20.06.17
13:37
вот это тоже нелепица:


  т.Свернуть("Контрагент, Цена,ТМЦ", "Кво, Сумма");
    т.Сортировать("Контрагент, Цена, ТМЦ");
    тИ = СоздатьОбъект("ТаблицаЗначений");
    т.Выгрузить(тИ);
    тИ.Свернуть("Контрагент,Цена, ТМЦ", "Кво, Сумма");
    тИ.Сортировать("Контрагент, Цена, ТМЦ");
3 Ёпрст
 
гуру
20.06.17
13:38
зачем сворачивать уже свёрнутую ТЗ ?
4 МихаилМ
 
20.06.17
13:42
подсказка
Ваш отчет называется кросс-таблица.


разделите вашу г.вно-процедуру на 3
1) получение данных
2) обработка данных (тз - кросс-таблица)
3) вывод данных.
5 Ёпрст
 
гуру
20.06.17
13:50
Короче, если хочешь делать штатно, то вот решение
http://catalog.mista.ru/public/14794/

если религия позволяет использовать ВК, то через индексированную таблицу твой отчет делается за пять минут или, еще лучше, сделать через Класс.ИтогиПоГруппировкам.
6 anagk
 
20.06.17
13:57
с нелепицей понятно, это остатки....крутил просто... это ведь не главное
7 anagk
 
20.06.17
13:58
именно с выводом данных и парюсь
8 anagk
 
20.06.17
14:01
уже получется вроде, не понятно почему растет таблица вправо пустыми, иногда не пустыми ячейками
9 anagk
 
20.06.17
14:02
данные вроде даже заходят верные
10 anagk
 
20.06.17
14:12
Перем Таб;
Перем Обновить;
Перем Расшифровка;
Перем тТ, тв, тИ, т, ит, квотТ;

Функция ЗапросТовара()
        т = СоздатьОбъект("ТаблицаЗначений");
    т.НоваяКолонка("Дата","Дата");
    т.НоваяКолонка("Контрагент", "Справочник.Контрагенты");
    т.НоваяКолонка("ТМЦ", "Справочник.ТМЦ");
    т.НоваяКолонка("Кво", "Число", 16, 3);
    т.НоваяКолонка("Сумма", "Число", 16, 2);
    т.НоваяКолонка("Цена", "Число", 16, 3);
    
    д = СоздатьОбъект("Документ");
    д.ВыбратьДокументы(НачДата, КонДата);
    Пока д.ПолучитьДокумент() = 1 Цикл
        Если НЕ ((д.Вид() = "РасходнаяНакладная") или (д.Вид() = "ВозвратнаяНакладная")) Тогда
            Продолжить;
        КонецЕсли;
        Если д.Проведен() = 0  Тогда
            Продолжить;
        КонецЕсли;
        
        д.ВыбратьСтроки();
        Пока д.ПолучитьСтроку() = 1 Цикл
            Если д.ТМЦ.ВидТМЦ <> Перечисление.ВидыТМЦ.Продукция Тогда
                Продолжить;
            КонецЕсли;
            т.НоваяСтрока();
            т.Дата = д.ДатаДок;
            т.Контрагент = д.Контрагент;
            т.ТМЦ = д.ТМЦ;
            Если д.Вид() = "РасходнаяНакладная" Тогда
                т.Цена = д.ЦенаБезНДС;
                т.Кво = д.Кво;
                т.Сумма = д.СуммаСНДС;
            Иначе
                //возврат
                т.Цена = - д.ЦенаБезНДС;
                т.Кво = - д.Кво;
                т.Сумма = - д.СуммаСНДС;
            КонецЕсли;
            
            Если ВыбКонтрагент.Выбран() = 1 Тогда
                Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
                    Если д.Контрагент.ПринадлежитГруппе(ВыбКонтрагент) = 0 Тогда
                        Продолжить;
                    КонецЕсли;    
                Иначе
                    Если д.Контрагент.Код <> ВыбКонтрагент.Код Тогда
                        Продолжить;
                    КонецЕсли;    
                КонецЕсли;
            КонецЕсли;
            Если ВыбТМЦ.Выбран() = 1 Тогда
                Если ВыбТМЦ.ЭтоГруппа() = 1 Тогда
                    Если д.ТМЦ.ПринадлежитГруппе(ВыбТМЦ) = 0 Тогда
                        Продолжить;
                    КонецЕсли;    
                Иначе
                    Если д.ТМЦ.Код <> ВыбТМЦ.Код Тогда
                        Продолжить;
                    КонецЕсли;    
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    т.Свернуть("Контрагент, Цена,ТМЦ", "Кво, Сумма");
    т.Сортировать("Контрагент, Цена, ТМЦ");
    тИ = СоздатьОбъект("ТаблицаЗначений");
    т.Выгрузить(тИ);
    тИ.Свернуть("Контрагент,Цена, ТМЦ", "Кво, Сумма");
    тИ.Сортировать("Контрагент, Цена, ТМЦ");
    тТ = СоздатьОбъект("ТаблицаЗначений");                    //для вывода на печать только тех ТМЦ, что нужно
    т.Выгрузить(тТ);
    тТ.Свернуть("ТМЦ", "Кво, Сумма");
КонецФункции    // ЗапросТовара

Процедура Сформировать()
    ЗапросТовара();
    тТ.Сортировать("ТМЦ+");
    квотТ = тТ.КоличествоСтрок();

    таб=СоздатьОбъект("Таблица"); //без этого не получится
    таб.ИсходнаяТаблица("Сформировать");
    Таб.ВывестиСекцию("Шапка|Вертикаль_1");
    тТ.ВыбратьСтроки();
    Пока тТ.ПолучитьСтроку() = 1 Цикл
        Таб.ПрисоединитьСекцию("Шапка|Вертикаль_2");
        КонецЦикла;
    тИ.ВыбратьСтроки();
    Пока тИ.ПолучитьСтроку() = 1 Цикл
        Таб.ВывестиСекцию("Строка|Вертикаль_1");
        стр = 0;    стртТ = 1;
        тек = тИ.Цена;
        стек = "Цена";
        Пока т.НайтиЗначение(тек, стр, стек) = 1 Цикл
            т.ПолучитьСтрокуПоНомеру(стр);
            послСтр = 0;
            
            Для ии=стртТ По квотТ Цикл
                тТ.ПолучитьСтрокуПоНомеру(ии);
                Если тТ.ТМЦ.Код <> т.ТМЦ.Код Тогда
                    Таб.ПрисоединитьСекцию("Строка|Конец");
                Иначе
                    Таб.ПрисоединитьСекцию("Строка|Вертикаль_2");
                    стртТ = тТ.НомерСтроки + 1;
                    послСтр = тТ.НомерСтроки;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            т.УдалитьСтроку(стр);
            стр = 0;
        КонецЦикла;
        Для иии=послСтр+1 По квотТ Цикл
            Таб.ПрисоединитьСекцию("Строка|Конец");
        КонецЦикла;
        Таб.ПрисоединитьСекцию("Строка|Вертикаль_2");
    КонецЦикла;
    
    Таб.ТолькоПросмотр(1);
    таб.Показать();//показываем таблицу
КонецПроцедуры
11 Злопчинский
 
20.06.17
20:05
(0)  сформирует плоскую таблицу без всяких группировок
И подсунь Ее в упомянутую http://catalog.mista.ru/public/14794/
Будут трудности стучись в районе 22часов сегодня в скайп Zlopun
12 anagk
 
21.06.17
16:52
так и сделал.... блин шо самое обидное, все так же и у меня получается, но чуть чуть где-то нет знаний с этими Циклами Для и тд....Всем спасибо.
Независимо от того, куда вы едете — это в гору и против ветра!