Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

1С: Обмен опытом. Выпуск №8.


Выпуск №8 от 11 сентября 2006 года.

Архив рассылки.

Посоветуйте рассылку друзьям и знакомым. Для этого просто перешлите это письмо.
Подписаться на рассылку можно на сайте рассылки.
Каждый из Вас может поделиться своим опытом с читателями. Для этого присылайте свои статьи и разработки на адрес, указанный внизу выпуска.

Здравствуйте, уважаемые читатели!

В этом выпуске речь пойдет о таблице значений. Точнее - об одном из способов свертки таблицы значений.

Свертка нечисловых колонок таблицы значений.

Начнем с предислловия ;).

Появление объекта "Таблица значений" в версии 7.7 воспринялось на "Ура!" всеми разработчиками, и ими же объект стал активно использоваться чуть ли не в каждом модуле. Действительно, объект очень полезный и удобный, и без него было очень трудно обходиться раньше. Таблица значений часто используется для накопления и последующего подведения итогов количественно-суммовых значений по каким-либо измерениям. Подведение итогов производится методом Свернуть(). В результате получается таблица значений с итогами по заданным измерениям.

А теперь к делу!

Случилось тут мне писать один отчет. Не буду вдаваться в подробное описание самого отчета, но скажу лишь, что пришлось использовать таблицу значений (как вы и сами догадались ;)). Так вот, в итоге от этой таблицы значений я хотел получить следующее: чтобы итоги были свернуты не только по числовым колонкам, ни и по колонке, которая содержала список значений, т.е. чтобы список значений "вбирал в себя" значения сворачиваемых строк. К этому моменту я уже знал, что методом Свернуть() этого не добиться, и пришлось писать специальную процедуру.

Во время написания процедуры пришла догадка о том, что на практике может понадобится сворачивать колонку не только со списком значений, но и с текстом и т.п. Так что я задался целью реализовать универсальную процедуру для сворачивания таблицы по колонкам с нечисловыми типами.

Итак, расскажу вам о том, какой алгоритм мне пришлось изобрести.

Пусть будет некая процедура свертки таблицы значений, параметрами которой будут:

1. таблица значений, над которой нужно произвести операцию свертывания;
2. колонки, по которым группировать данные;
3. колонки, по которым суммировать данные.

Алгоритм процедуры сродни алгоритму метода Свернуть(): по мере обхода строк таблицы значений, при одинаковых значениях группировочных колонок текущей строки и предыдущей строки, суммируются все значения по суммируемым колонкам, а результат записывается в первую строку из одинаковой группы строк.

Чтобы избежать лишних операций, вначале процедуры нужно отсортировать таблицу по группировочным колонкам, пропускать числовые колонки в процессе свертывания, а в конце применить метод Свернуть(), который сделает суммирование по числовым колонкам.

Так как суммируемые колонки могут быть не только числовыми, то нужно их разбить на группы по типам, чтобы в дальнейшем определять вхождение суммируемой колонки к группе типов и выполнять нужный алгоритм.

Далее идет цикл по строкам таблицы значений. В этом цикле выполняются следующие действия:

1. сравнивается текущая и предыдущая строки;
2. идет перебор групп типов;
3. в хранилище значений нечисловых типов добавляем информацию из текущей строки, и колонки, принадлежащей к текущей группе типов.

В конце процедуры таблица значений сворачивается и сортируется, а колонки нечисловых типов заполняются соответствующими значениями из хранилища.

Реализацию алгоритма вы можете увидеть в обработке, скачав ее с сайта рассылки. Работает просто: в качестве параметра передаете список значений, содержащий таблицу значений для свертки, строку с группировочными колонками и строку с суммируемыми колонками. На выходе получаете обработанную таблицу значений. Или же просто скопируйте процедуру свертки таблицы значений в свой модуль.

Ваши вопросы, идеи и предложения присылайте мне.

Удачи!


В избранное