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

 

Что такое иерархический справочник

Иерархический справочник (или иерархическая таблица) - это представление данных, когда пользователь видит, что одни записи находятся внутри других записей.

Те записи, которые находятся внутри, называются элементами. Запись, которая содержит элементы, называется группой. Можно сказать, что элементы принадлежат группам. Каждый элемент, в свою очередь, может являться группой для других элементов.

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

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

 

Родословная

Иерархия в проводнике.Идея иерархического представления информации появилась очень давно. Еще Цезарь говорил: "Разделяй и властвуй", а библии зафиксированы иерархические "Колена израилевы". :)

В компьютерной технике широкое использование иерархий началось с файловой системы в Unix. Именно там появилась возможность создавать каталоги и помещать файлы внутрь этих каталогов.

Представление данных в виде иерархий тоже имеет давнюю историю. В свое время были развиты иерархические СУБД. Однако с появлением реляционных баз данных, иерархические СУБД были незаслуженно забыты.

Сейчас практически все СУБД являются реляционными. Реляционные СУБД, по определению хорошо работают с плоскими таблицами и плохо работают с иерархической информацией.

Соответственно, программы, построенные на базе реляционных СУБД, очень редко показывают данные в виде иерархических справочников. И наоборот, программы, работающие с древовидным представлением, редко основаны на реляционных СУБД. См. подробнее Какие сложности возникают при реализации иерархических справочников на реляционных СУБД.

На просторах СНГ массовое распространение иерархических справочников в учетных системах и в ERP-системах началось с 1С.

Иерархия в 1СВсе версии 1С, начиная с 2.0 ПРОФ, позволяли работать с иерархическими справочниками (раньше справочники назывались субконто). Поначалу количество уровней иерархии было ограничено 3 уровнями. В версии 7.0 количество уровней иерархии ограничено 10 уровнями, а, начиная с версии 8.0, можно работать с неограниченным количеством вложенности.

Теперь, когда клиенты спрашивают про иерархические справочники в Аксапте или Навижин, можно со 100% уверенностью утверждать, что они хотят "как в 1С".

 

Для чего нужна иерархия

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

 

Являются ли иерархические справочники удобными

С первого и со второго взгляда кажется, что иерархическое представление информации является очень удобным для пользователя. Пользователь создает группы, размещает элементы внутри групп, получает хорошо организованную структуру, где удобно ориентироваться и можно быстро искать информацию.

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

Прежде всего, иерархическое представление является удобным только для ОДНОГО пользователя. Так, если я сам создаю группы и сам размещаю в них элементы, то я действительно быстро найду необходимую мне информацию. Но если в моих папках начнет разбираться другой человек, то ему придется несладко.

Наиболее показательный пример - почтовые программы Outlook, Outlook Express, Bat или подобные. Все они умеют раскладывать почту по папкам, и практически все эту возможность используют.

Наверняка и вы пользуетесь папками в своей почтовой программе. Несомненно, вы легко ориентируетесь в СВОИХ папках. Скажите, у вас также легко получается ориентироваться в общих папках или в папках на чужом компьютере? Например, где бы вы стали искать новости Microsoft Business Solutions среди папок, показанных на скриншоте?

Т.е. для того, чтобы иерархическими справочниками одинаково удобно пользовались разные люди необходимо придумать правило размещения элементов в иерархии. Кроме того, необходимо, чтобы это правило было известно всем пользователям. Если правило размещения информацией пользователю не известно, то он, скорее всего, вообще не будет пользоваться иерархией. Так, в поисках новостей MSBS гораздо эффективнее просто запустить поиск по ключевым словам "новости news msbs" по всем папкам моей почтовой программы. Но это означает, что иерархия вам не помогла.

В каждой группе должно быть небольшое число элементов. Обычно в группе должно быть до 20-40 элементов. Иначе элементы не будут умещаться на экран и пользователю придется использовать поиск внутри группы. А иерархия вводится как раз для того, чтобы пользователь не тратил время на поиск, а сразу щелкал на нужный ему элемент.

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

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

Обратите внимание, что в подобном каталоге очень велика вероятность того что продавец не найдет нужного клиенту товара. Представьте очень типичный сценарий: вы ищете ноутбук с разрешением монитора 1400х1050 на базе Centrino и хотите уложится в $1500. Вам все равно, какой производитель будет у ноутбука, вам все равно какого цвета будет ваш ноубтук. Представьте, что продавец пользуется описанным выше иерархическим справочником. С типом товара продавец как правило определится очень быстро - ноутбук. А уже на втором уровне будут проблемы - вам как покупателю все равно какой производитель будет у ноутбука. В результате продавец будет вынужден просматривать все группы второго уровня. Или помнить где какой товар находится. Или пользоваться поиском. В любом случае, он НЕ будет пользоваться иерархией.

Если вы думаете, что пять-семь неудобных уровней иерархии получалось у непрофессионалов, попробуйте сами придумать иерархию для 10-50 тысяч позиций. Причем таким образом, чтобы в каждой группе было не очень большое число элементов (максимум 20-30) и чтобы любой запрос пользователя мог бы выполняться достаточно по иерархии (без дополнительного поиска). Попробуйте сами найти описанный выше ноутбук, например, на price.ru используя только иерархию.

Оцените масштабы проблемы для больших справочников.

 

Фильтрация и иерархия

Где решение? Прежде всего, надо понять, что иерархия это всего лишь способ фильтрации.

Все!

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

Пожалуйста, остановитесь на этом месте и подумайте!

 

Итак, когда пользователь щелкает по группе, то система, по сути, накладывает фильтр и показывает пользователю отфильтрованные данные.

Почему иерархия так эффективна? Пользователь не заморачивается с техническими деталями. Он просто видит элементы, щелкает, снова видит элементы, щелкает, наконец выбирает нужный. Как только пользователь не знает, куда надо щелкнуть или количество щелчков становится очень большим - иерархия становится неэффективной.

Как происходит фильтрация? Пользователь выбирает на какие поля надо наложить фильтр, пользователь решает какие фильтры надо наложить (это может быть очень нетривиальный процесс), система фильтрует записи, пользователь видит результат.

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

Как можно было бы найти упомянутый выше ноутбук при помощи фильтров? Продавец вводит фильтры в поля Товар=Ноутбук, Разрешение=1400х1050, Тип=Centrino, Цена=1400..1600. В результате система должна вернуть все записи, удовлетворяющие требованиям клиента.

Да действительно, пока иерархия эффективна, работа с фильтрами менее очевидна, чем работа с иерархией. Есть одно но: для большого числа записей иерархия становится неэффективной.

 

Как сделать фильтрацию более удобной, чем иерархия

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

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

Желательно, чтобы была возможность использовать выражения и метасимволы в фильтрах. Так, например, продавцу ноутбуков очень помогла бы возможность получить список всех ноутбуков, разрешение которых больше или равно 1400х1050, а цена находится в пределах $1500.

Выбор значения фильтра из списка
Выбор поля для фильтрации
 
Пример наглядных фильтров в модуле CRM

Желательно, чтобы была возможность группировать фильтруемые поля в наборы. Так, например, для ноутбуков фильтруются одни поля, для видеокарточек - другие, для КПК - третьи и т.п.

 

Как работают фильтры в Аксапте

Как работают фильтры в Аксапте можно посмотреть на скриншотах http://axapta.mazzy.ru/screenshots/common/search.html

Единственное неудобство фильтрации в Аксапте связано с тем, что наборы полей запоминаются одновременно со значениями фильтров.

В остальном - возможности фильтрации в Аксапте полностью покрывают возможности, которые предоставляют иерархические справочники.

 

Пример реализации наглядных фильтров в Аксапте

Как сделать механизм фильтрации еще более наглядным? В Аксапте есть пример реализации очень наглядной фильрации. Это форма деловых отношений в модуле CRM.

Обратите внимание, что на форме предусмотрено три независимых фильтра. Это значит, что пользователь может найти все деловые отношения либо по сотруднику, либо по типу отношения, либо по названию, либо использовать любые комбинации этих типов.

Обратите внимание, что на самом деле работает обычная Аксаптовская фильтрация. Это значит, что продвинутый пользователь сможет воспользоваться всеми богатыми возможностями обычной фильтрации.

Обратите также внимание, что в то же время, неподготовленный пользователь сможет без дополнительного обучения использовать очевидные возможности фильтрации при помощи этих трех полей на форме.

 

Пример реализации иерархических справочников на примере каталога Яндекса

Пример правильной реализации дает каталог Яндекса, Rambler'а, Yahoo и т.д.

Прежде всего, стоит задуматься а почему они не использовали дерево?

Иерархия в каталоге Яндекса Да, конечно дерево непросто отобразить при помощи убогого HTML'я. Но не это главное.

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

С каталогами работают неподготовленныме пользователи. Каталоги могут использовать только даже самые очевидные правила размещения информации. Поскольку пользователь скорее уйдет с каталога, нежели будет изучать сложные правила.

Так, каталог Яндекса позволяет использовать одновременно четыре независимых фильтра - по каталогизатору, по региону, по типу сайта, по энциклопедиям и гидам.

Обратите внимание, что каждый фильтр, в свою очередь, является иерархическим, но дерева нигде не видно. Почему?


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

 

Буду рад Вашим замечаниям и предложениям.
Мазуркин Сергей, mazzy@mazzy.ru.