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

17.08.10

Разработка - Разработка внешних компонент

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ДеревоПлюсТаблица.ert
.ert 8,50Kb
254
254 Скачать (1 SM) Купить за 1 850 руб.

Довольно часто в системе 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

//infostart.ru/public/74313/

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

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

//infostart.ru/public/73774/

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

//infostart.ru/public/71084/

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

//infostart.ru/public/22202/

См. также

Разработка внешних компонент Системный администратор Программист Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Платформа 1С v8.1 Россия Платные (руб)

Аддон "Структура Обмена" (ExchangeStruc) - это компонента, которая обеспечивает доступ к разделяемым процессом структурам, аналогичным структурам 1С. Обеспечивает прозрачную передачу данных примитивных типов, в том числе Двоичных данных, в режиме Реального времени между разными контекстами (формами) или потоками одного процесса. В перспективе функционал будет расширен для обмена между процессами, даже разных версий платформ. Совместим с версиями Windows рабочих станций и серверов, с платформами 1С разных версий и релизов в режиме Native начиная с 8.2, и в режиме COM начиная с версий 7.7. По скорости чтения и записи лишь немногим уступает стандартной структуре 1С. НОВОЕ: Добавлен функционал регистрации компоненты COM в качестве OLE Auto (COMОбъект) для поддержки её работы в серверах старых версий 1С: 8.0 и 8.1, где работа с компонентами исключена. Теперь можно коммуникацию с Фоновыми заданиями на этих версиях проводить.

7200 руб.

19.04.2023    5332    1    0    

3

Разработка внешних компонент WEB-интеграция Программист Платформа 1С v7.7 Конфигурации 1cv7 Платные (руб)

Компонента HttpSrv7 позволяет создавать веб-сервисы в среде 1С 7.7 и даже, используя файлы HTML, несложные веб-сайты. С помощью нее можно обеспечить доступ к данным 1С 7.7 из браузера. Дополнительно используя компоненту HTTP_Async или синхронный клиент HTTP для 1С 7.7 (публикация № 1152364) можно наладить обмен данными между удаленными информационными базами. С помощью компоненты HTTP_Async можно сначала послать несколько запросов к сайтам, веб-сервисам (в т.ч. к HttpSrv7), а затем обрабатывать данные по мере их поступления. Компонента GISMT в дополнение к HTTP_Async имеет функцию цифровой подписи и, таким образом, имеет все возможности для работы с API ГИС МТ "Честный знак" непосредственно из среды 1С 7.7.

2000 руб.

27.05.2022    9082    23    17    

34

Разработка внешних компонент Программист Платформа 1С v7.7 Платные (руб)

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

1200 руб.

02.12.2021    6308    2    19    

4

Разработка внешних компонент Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Эта внешняя компонента Base64.dll предназначена для платформы 1С версии 7.7. Используется для преобразования файлов из/в кодировку Base64 из встроенного языка 1С Предприятие. Компонента тестировалась на базе конфигурации Бухгалтерский учет для Казахстана, редакции 7.70.257.

10 стартмани

06.04.2021    10107    14    softmaker    13    

5

Разработка внешних компонент Защита ПО и шифрование Программист Платформа 1С v7.7 Абонемент ($m)

Цифровые подписи, шифрование, просмотр сертификатов ключей ЭЦП, работа с различными криптопровайдерами (в т.ч. КриптоПРО ГОСТ 2012) в 1С 7.7.

1 стартмани

08.06.2020    9491    28    mdbruyfn    10    

9

Разработка внешних компонент Программист Платформа 1С v7.7 Абонемент ($m)

Обмен сообщениями и небольшими файлами по протоколу UDP с 1С и внешними приложениями в локальной сети или сети VPN.

1 стартмани

23.05.2020    7657    7    mdbruyfn    0    

6

Разработка внешних компонент WEB-интеграция Программист Платформа 1С v7.7 Абонемент ($m)

Компонента позволяет использовать различные веб-сервисы интернет-ресурсов, например работать с онлайн-кассой через API, предоставленное ее разработчиком. Тестировалась на платформе 1С релиза 7.70.027.

1 стартмани

14.11.2019    19460    108    mdbruyfn    105    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ёпрст 1065 13.08.10 17:21 Сейчас в теме
А по мне, дерево красившее, если это активикс..
:))
4. iov 407 14.08.10 11:53 Сейчас в теме
(1) А запостить как и с чем? Очень интересная тема... Как говорится - ждемс..
2. Свой 164 13.08.10 18:28 Сейчас в теме
дает ли в показанном виде дерево распечатать ? чтобы не скриншотить
или надо будет самому рисовать таблицу
3. venger 2124 13.08.10 18:50 Сейчас в теме
(2) Нет, распечатать не дает, насколько я знаю.
Свой; +1 Ответить
6. CheBurator 2689 16.08.10 05:26 Сейчас в теме
(2) на Исе есть хорошая разработочка по дереву в печатной форме...
7. venger 2124 17.08.10 15:53 Сейчас в теме
(2),(6) Вот и мой вариант печати Дерево+Таблица появился на Исе:
http://infostart.ru/public/74313/

Ибо проще написать, чем найти и разобраться, что там к чему и где;-)
abrafaks; +1 Ответить
5. kompas-dm 781 14.08.10 11:56 Сейчас в теме
(0) Хорошая, краткая статья. Чаще бы видеть на портале такие работы ... :idea:
8. romanuil 17.03.12 00:28 Сейчас в теме
Спасибо, доступно описано.
9. ROM_1C 692 24.10.13 23:06 Сейчас в теме
А как вставить строку в дереве? Обичное Тз.Новаястрока(номерстроки) - не катить!
10. venger 2124 25.10.13 12:19 Сейчас в теме
(9) Давно это все было, забывать начал;-) Обновить дерево, после вставки пробовали?
11. ROM_1C 692 25.10.13 16:40 Сейчас в теме
(10)Да, обновляю. Получаеться вставить только строку на верхнем уровне. А как добавить подчиненную второго или больше уровня - никак не получается. Пробовал и активировать перед добавлением, чтобы получить тек. строку и там уже добавлять - то ошибку издает...
Помогите пожалуйста. Очень нужная вещь!
12. venger 2124 25.10.13 18:06 Сейчас в теме
(11) Ну так посмотрите в процедуру "Выполнить()" в этой статье, там же и добавляются новые строки в подчиненные узлы... Подчиненные узлы в поле "Ветка" содержат обычную 1С-совску ТЗ...
13. pisarevEV 8 20.11.13 06:58 Сейчас в теме
приветствую! столкнулся с такой проблемой: дерево большое (сотни документов и >100 узлов), так вот при попутке развернуть все узлы - все длится неприемлемо долго (уже минут 15 разворачивает), эта проблема имеет решение?
14. pisarevEV 8 21.11.13 11:07 Сейчас в теме
15. Иваныч 23 22.11.13 15:16 Сейчас в теме
Начинаю реализовывать у себя. Заранее плюсую.
16. merlin1975 2 02.10.19 21:38 Сейчас в теме
Никак не пойму, как по вышеприведенному коду перебрать всю структуру какого-либо справочника? Ведь уровней много.. подскажете?
17. Slypower 3 03.10.19 17:24 Сейчас в теме
(16) как я понял из описания, то запросом создать ТЗ с группировками. А потом уже формекс перехватит эту тз и сделает это дерево
18. victuan 4278 21.02.23 07:05 Сейчас в теме
"Значок" пишется через "о", а не через "ё".
Оставьте свое сообщение