gifts2017

[Обучаловка] Знакомство с объектом «Дерево+Таблица» внешней компоненты «FormEx»

Опубликовал Александр Венгер (venger) в раздел Программирование - Практика программирования

Ликбез для «штатных» программистов по объекту «Дерево+Таблица» внешней компоненты «FormEx»

Довольно часто в системе 1С:Предприятие 7.7 у разработчика возникает потребность использовать на форме контрол, который бы давал возможность представить данные для пользователя в виде дерева. Штатные возможности системы таким функционалом не располагают, но внешняя компонента «FormEx», дает возможность разработчику это реализовать с помощью объекта «Дерево+Таблица», с которым мы сейчас и познакомимся.

Скачаем внешнюю компоненту с сайта http://www.dorex.ru.  Последнюю стабильную сборку можно взять тут: http://www.dorex.ru/files/?formex_t.zip. Из скачанного архива нужно распаковать файл «formex.dll» в папку конфигурации или в папку «Bin» платформы 1С 7.7.

Затем создадим в какой-нибудь конфигурации для экспериментов обработку и на ее форму закинем обычную «ТаблицуЗначений», зададим ей идентификатор -«ТЗ». Это, впоследствии, и будет наше дерево. Кнопки «Выполнить» и «Закрыть», которые появляются при создании новой обработки, оставим на будущее, также как и пустую процедуру «Выполнить()» в модуле формы обработки. Т.е. в конфигураторе она будет выглядеть примерно так, см. рис.:


Далее будем писать код в модуле формы нашей обработки. Определим две глобальные переменные, они нам понадобятся для манипулирования деревом:

Перем гАтрФормыТЗ, гСтруктураТЗ;

И затем в процедуре «ПриОткрытии()» запишем код загрузки внешней компоненты «FormEx»:

Процедура ПриОткрытии()
    Если ЗагрузитьВнешнююКомпоненту("formex.dll")=0 Тогда
        Предупреждение("Не удалось загрузить внешнюю компоненту FormEx.",10);
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры  // ПриОткрытии

А в теле модуля, т.е. после процедур и функций модуля формы обработки, заполним и сохраним в глобальную переменную модуля структуру «ТаблицыЗначений»:

ТЗ.НоваяКолонка("Ветка");
ТЗ.НоваяКолонка("Значек");
ТЗ.НоваяКолонка("ИмяВетки",,,,"Узлы");
гСтруктураТЗ=ЗначениеВСтрокуВнутр(ТЗ);

После чего в процедуре «ПослеОткрытия()», эта предопределенная процедура работает, если загружен «FormEx», напишем код, который преобразует нашу «ТаблицуЗначений» в дерево:

Процедура ПослеОткрытия()
    гАтрФормыТЗ = СоздатьОбъект("АтрибутФормы");
    гАтрФормыТЗ.УстановитьАтрибут(Форма,"ТЗ");
    гАтрФормыТЗ.ПерехватитьТаблицуЗначений();
    гАтрФормыТЗ.ОпцииДерева(0,0);
КонецПроцедуры  // ПослеОткрытия

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

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

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

Процедура Выполнить()
    ТЗ.УдалитьСтроки();
    Для Сч=1 По 10 Цикл
        ТЗ.НоваяСтрока();
        ТЗ.ИмяВетки="Уровень номер "+НРег(СокрЛП(Формат(1,"ЧП")))+
            ", узел номер "+НРег(СокрЛП(Формат(Сч,"ЧП")));
        ТЗ.Ветка=ЗначениеИзСтрокиВнутр(гСтруктураТЗ);
        Для Сч2=1 По 5 Цикл
            ТЗ.Ветка.НоваяСтрока();
            ТЗ.Ветка.ИмяВетки="Уровень номер "+НРег(СокрЛП(Формат(2,"ЧП")))+
                ", узел номер "+НРег(СокрЛП(Формат(Сч2,"ЧП")));
            ТЗ.Ветка.Ветка=ЗначениеИзСтрокиВнутр(гСтруктураТЗ);
        КонецЦикла;
    КонецЦикла;
    гАтрФормыТЗ.ОбновитьДерево();
КонецПроцедуры

Итак, весь код модуля формы нашей обработки таков:

Перем гАтрФормыТЗ, гСтруктураТЗ;

Процедура Выполнить()
    ТЗ.УдалитьСтроки();
    Для Сч=1 По 10 Цикл
        ТЗ.НоваяСтрока();
        ТЗ.ИмяВетки="Уровень номер "+НРег(СокрЛП(Формат(1,"ЧП")))+
            ", узел номер "+НРег(СокрЛП(Формат(Сч,"ЧП")));
        ТЗ.Ветка=ЗначениеИзСтрокиВнутр(гСтруктураТЗ);
        Для Сч2=1 По 5 Цикл
            ТЗ.Ветка.НоваяСтрока();
            ТЗ.Ветка.ИмяВетки="Уровень номер "+НРег(СокрЛП(Формат(2,"ЧП")))+
                ", узел номер "+НРег(СокрЛП(Формат(Сч2,"ЧП")));
            ТЗ.Ветка.Ветка=ЗначениеИзСтрокиВнутр(гСтруктураТЗ);
        КонецЦикла;
    КонецЦикла;
    гАтрФормыТЗ.ОбновитьДерево();
КонецПроцедуры  // Выполнить

Процедура ПриОткрытии()
    Если ЗагрузитьВнешнююКомпоненту("formex.dll")=0 Тогда
        Предупреждение("Не удалось загрузить внешнюю компоненту FormEx.",10);
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры  // ПриОткрытии

Процедура ПослеОткрытия()
    гАтрФормыТЗ = СоздатьОбъект("АтрибутФормы");
    гАтрФормыТЗ.УстановитьАтрибут(Форма,"ТЗ");
    гАтрФормыТЗ.ПерехватитьТаблицуЗначений();
    гАтрФормыТЗ.ОпцииДерева(0,0);
КонецПроцедуры  // ПослеОткрытия

ТЗ.НоваяКолонка("Ветка");
ТЗ.НоваяКолонка("Значек");
ТЗ.НоваяКолонка("ИмяВетки",,,,"Узлы");
гСтруктураТЗ=ЗначениеВСтрокуВнутр(ТЗ);

В итоге, запустив обработку в режиме предприятия и нажав кнопку выполнить, мы увидим примерно такую картину:

Щелкая мышкой по плюсикам/минусикам (слева), можно разворачивать и сворачивать узлы, наслаждаясь полученным эффектом.

Естественно, это далеко не весь функционал и особенности, которые есть у этого объекта, к этой публикации прилагается внешний отчет/обработка «ДеревоПлюсТаблица.ert». Там усложнен приведенный пример – рекурсивное заполнение дерева любым количеством уровней (задается пользователем), рекурсивный обход дерева с разворачиванием и сворачиванием всех узлов, есть дополнительный столбик с данными для узлов (в примере, просто порядковый номер), а также возможность редактировать ячейки дерева двойным щелчком мыши на ячейке. См. скрин.

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

Печать объекта Дерево+Таблица внешней компоненты FormEx

http://infostart.ru/public/74313/

И привожу ссылки на реальные проекты, где использовался этот объект в реальных условиях, в обработках для настройки тех или иных подсистем:

Универсальная подсистема «Подписи/согласования документов»

http://infostart.ru/public/73774/

Универсальная подсистема «Фабрика событий» + «Доп. права документов» + «Сканы документов»

http://infostart.ru/public/71084/

Универсальная подсистема «Дополнительные права для документов»

http://infostart.ru/public/22202/

Скачать файлы

Наименование Файл Версия Размер
ДеревоПлюсТаблица.ert 241
.ert 8,50Kb
13.08.10
241
.ert 8,50Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Епрст (Ёпрст) 13.08.10 17:21
А по мне, дерево красившее, если это активикс..
:))
2. Андрей (Свой) 13.08.10 18:28
дает ли в показанном виде дерево распечатать ? чтобы не скриншотить
или надо будет самому рисовать таблицу
3. Александр Венгер (venger) 13.08.10 18:50
(2) Нет, распечатать не дает, насколько я знаю.
Свой; +1 Ответить
4. Александр Зубцов (iov) 14.08.10 11:53
(1) А запостить как и с чем? Очень интересная тема... Как говорится - ждемс..
5. Дмитрий Литовченко (kompas-dm) 14.08.10 11:56
(0) Хорошая, краткая статья. Чаще бы видеть на портале такие работы ... :idea:
6. Сергей (Che) Коцюра (CheBurator) 16.08.10 05:26
(2) на Исе есть хорошая разработочка по дереву в печатной форме...
7. Александр Венгер (venger) 17.08.10 15:53
(2),(6) Вот и мой вариант печати Дерево+Таблица появился на Исе:
http://infostart.ru/public/74313/

Ибо проще написать, чем найти и разобраться, что там к чему и где;-)
8. romanuil romanuil (romanuil) 17.03.12 00:28
Спасибо, доступно описано.
9. ROM (ROM_1C) 24.10.13 23:06
А как вставить строку в дереве? Обичное Тз.Новаястрока(номерстроки) - не катить!
10. Александр Венгер (venger) 25.10.13 12:19
(9) Давно это все было, забывать начал;-) Обновить дерево, после вставки пробовали?
11. ROM (ROM_1C) 25.10.13 16:40
(10)Да, обновляю. Получаеться вставить только строку на верхнем уровне. А как добавить подчиненную второго или больше уровня - никак не получается. Пробовал и активировать перед добавлением, чтобы получить тек. строку и там уже добавлять - то ошибку издает...
Помогите пожалуйста. Очень нужная вещь!
12. Александр Венгер (venger) 25.10.13 18:06
(11) Ну так посмотрите в процедуру "Выполнить()" в этой статье, там же и добавляются новые строки в подчиненные узлы... Подчиненные узлы в поле "Ветка" содержат обычную 1С-совску ТЗ...
13. Евгений Писарев (pisarevEV) 20.11.13 06:58
приветствую! столкнулся с такой проблемой: дерево большое (сотни документов и >100 узлов), так вот при попутке развернуть все узлы - все длится неприемлемо долго (уже минут 15 разворачивает), эта проблема имеет решение?
14. Евгений Писарев (pisarevEV) 21.11.13 11:07
15. Иваныч Иванов (Иваныч) 22.11.13 15:16
Начинаю реализовывать у себя. Заранее плюсую.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа