Эта статья предназначена для демонстрации возможностей фильтрации "ТаблицЗначений" с помощью процедуры "ФильтрТабы" и для облегчения формирования кода при выводе таблиц со сложными группировками, при необходимости получить итоги до перебора строк запроса 1С или просто при фильтрации "ТаблицЗначений" по одной или нескольким колонкам.
Сам код процедуры "ФильтрТабы" (приведен в конце статьи) сложился на основе конкурса по быстрейшему удалению строк ТЗ, и в принципе может быть оптимизирован, хотя и так работает отлично.
Сразу перейду к примеру.
Допустим имеется таблица "тзнДанные" с колонками "Контрагент", "Товар" и "Сумма".
Нам необходимо вывести общую сумму по контрагенту до перебора товаров, а также все товары по контрагенту с суммами.
И так по каждому контрагенту.
тзнДанные.Сортировать("Контрагент, Товар");
тзнКонтрагенты = СоздатьОбъект("ТаблицаЗначений");
тзнДанные.Выгрузить(тзнКонтрагенты, ,, "Контрагент");
тзнКонтрагенты.Свернуть( "Контрагент",);
3. Теперь пробежимся по всем контрагентам и выведем информацию:
тзнКонтрагенты.выбратьСтроки();
Пока тзнКонтрагенты.ПолучитьСтроку()=1 Цикл
текКонтрагент = тзнКонтрагенты.Контрагент;
тзнДанныеПоКонтрагенту = ФильтрТабы( тзнДанные, "Контрагент", текКонтрагент);
4. Здесь мы получили таблицу "тзнДанныеПоКонтрагенту" с суммами и товарами по одному контрагенту (из нашего списка). Можно брать из неё итоговые суммы или перебирать товары, всё в наших руках.
всегоПоКонтрагенту = тзнДанныеПоКонтрагенту.Итог("Сумма");
Сообщить( "Всего по Контрагенту """+текКонтрагент+""" = "+всегоПоКонтрагенту );
тзнДанныеПоКонтрагенту.выбратьСтроки();
Пока тзнДанныеПоКонтрагенту.ПолучитьСтроку()=1 Цикл
текТовар = тзнДанныеПоКонтрагенту.Товар;
текСуммаТовар = тзнДанныеПоКонтрагенту.Сумма;
Сообщить( "Сумма по товару """+текТовар+""" = "+текСуммаТовар );
КонецЦикла; //по товарам
КонецЦикла; //по контрагентам
Собственно вот и всё! Можно выводить таблицы, или просто обрабатывать данные, доработав этот шаблон до необходимого вам функционала.
С вертикальными группировками будет немного по другому, но не намного сложнее. Надо будет заранее сформировать список "столбцов" и выводить всегда все(!) столбцы, даже если они не попались в этой горизонтальной группировке.
Ниже приведёны код примера (без комментариев) и код процедуры "ФильтрТабы".
--------------------------------------------------------------------------------
тзнДанные.Сортировать("Контрагент, Товар");
тзнКонтрагенты = СоздатьОбъект("ТаблицаЗначений");
тзнДанные.Выгрузить(тзнКонтрагенты, ,, "Контрагент");
тзнКонтрагенты.Свернуть( "Контрагент",);
тзнКонтрагенты.выбратьСтроки();
Пока тзнКонтрагенты.ПолучитьСтроку()=1 Цикл
текКонтрагент = тзнКонтрагенты.Контрагент;
тзнДанныеПоКонтрагенту = ФильтрТабы( тзнДанные, "Контрагент", текКонтрагент);
всегоПоКонтрагенту = тзнДанныеПоКонтрагенту.Итог("Сумма");
Сообщить( "Всего по Контрагенту """+текКонтрагент+""" = "+всегоПоКонтрагенту );
тзнДанныеПоКонтрагенту.выбратьСтроки();
Пока тзнДанныеПоКонтрагенту.ПолучитьСтроку()=1 Цикл
текТовар = тзнДанныеПоКонтрагенту.Товар;
текСуммаТовар = тзнДанныеПоКонтрагенту.Сумма;
Сообщить( "Сумма по товару """+текТовар+""" = "+текСуммаТовар );
КонецЦикла; //по товарам
КонецЦикла; //по контрагентам