![]() |
|
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
|
так и сделал.... блин шо самое обидное, все так же и у меня получается, но чуть чуть где-то нет знаний с этими Циклами Для и тд....Всем спасибо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |