Элемент управления "Дерево" штатными средствами платформы 1С:Предприятие 7.7

07.11.07

Разработка - Механизмы платформы 1С

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

Эти и многие другие задачи легко решить, представив некую информацию в структурированном древовидном виде.

Тому, как средствами платформы 1С:Предприятие 7.7 обеспечить такую возможность и посвящена данная статья.
Итак, приступим...

Для того, чтобы пользователь "увидел" дерево и смог управлять им необходимо решить следующие задачи:

1. Определить структуру хранения дерева в оперативной памяти.
2. Обеспечить механизм программного формирования дерева.
3. Реализовать алгоритм визуализации дерева.
4. Предоставить пользователю возмодность управлять деревом.

Начнем по порядку.

Структура хранения дерева в оперативной памяти и его программное формирование.

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

Задачу хранения дерева предлагается решить с помощью хорошо известного объекта платформы СписокЗначений.

Узел - это элемент списка значений, обладающий следующими атрибутами:
1. Идентификатор. Предназначен для именованного доступа к данным узла.
2. Представление. Видимое пользователю строковое представление узла.
3. Значение. Любое значение, хранимое в узле.
4. Знак. Определяет развернута или свернута ветка, определяемая данным узлом.
5. СписокУзлов. Список подчиненных узлов.
6. Родитель. Родительский узел.

Таким образом можно определить следующую функцию позволяющую максимально упростить процесс программного формирования дерева.

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


Функция возвращает вновь созданный узел.

Визуализация дерева.

Наибольшими изобразительными способностями среди доступных на платформе 1С:Предприятие 7.7 обладает объект Таблица. Вот с помощью данного объекта и будем визуализировать Наше дерево.

Приведем текст процедур визуализации дерева.

//Рекурсивная процедура визуализации дерева
Процедура ВывестиДерево(Знач Дерево, Уровень)
	Если Уровень > 0 Тогда
		Таблица.ВывестиСекцию("Пустая|Знак");
		
		Для СчУровней = 1 По Уровень - 1 Цикл
			Таблица.ПрисоединитьСекцию("Пустая|Знак");
		КонецЦикла;
	КонецЕсли;
	
	СписокУзлов = Дерево.Получить("СписокУзлов");
	КолУзлов = СписокУзлов.РазмерСписка();
	
	ID_Узла = ID_Узла + 1;
	СписокID.ДобавитьЗначение(Дерево,Строка(ID_Узла));
	
	ПредставлениеУзла = Дерево.Получить("Представление");
	
	Знак = Дерево.Получить("Знак");
	
	Если ПустоеЗначение(Знак) = 0 Тогда
		Если Уровень = 0 Тогда
			Таблица.ВывестиСекцию("Элемент|Знак");
		Иначе
			Таблица.ПрисоединитьСекцию("Элемент|Знак");
		КонецЕсли;
	Иначе
		Таблица.ПрисоединитьСекцию("Пустая|Знак");
	КонецЕсли;
	
	Таблица.ПрисоединитьСекцию("Элемент|Представление");
	
	Если Знак = "-" Тогда
		
		Уровень = Уровень + 1;
		
		Для Сч = 1 По КолУзлов Цикл
			Дерево = СписокУзлов.ПолучитьЗначение(Сч);
			ВывестиДерево(Дерево,Уровень);
		КонецЦикла;
		
		Уровень = Уровень - 1;
	КонецЕсли;
КонецПроцедуры

Процедура СформироватьТаблицу(Номер)
	Таблица.Очистить();
	
	СписокID.УдалитьВсе();
	ID_Узла = 0;
			
	ВывестиДерево(Дерево,0);
		
	Таблица.Показать();
КонецПроцедуры


Стоит особо отметить переменные СписокID и ID_Узла. Эти переменные должны быть глобальными по отношению к модулю обработки.

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

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

ID_Узла используется для доступа к данным узла в процедуре управления деревом.

Управление деревом.

Процедура ПолучитьКомпонентыАдресаЯчейки(Адрес, НомерСтроки, НомерКолонки)
	НомерСтроки  = Число(Сред(Адрес, Найти(Адрес, "R") + 1));
	НомерКолонки = Число(Сред(Адрес, Найти(Адрес, "C") + 1));
КонецПроцедуры

Процедура ОбработкаЯчейкиТаблицы(Значение,ФлагСтандОбраб,Таблица,Адрес)
      НомерСтроки = 0;
	НомерКолонки = 0;
	ПолучитьКомпонентыАдресаЯчейки(Адрес, НомерСтроки, НомерКолонки); 
	
	Если (Значение = "+") ИЛИ (Значение = "-") Тогда
		ID = Строка(Таблица.Область(НомерСтроки,НомерКолонки + 2).Расшифровка());
		Узел = СписокID.Получить(ID);
		
		
		НовыйЗнак = ?(Значение = "+", "-","+");
			
		Узел.Установить("Знак",НовыйЗнак);
			
		СформироватьТаблицу(Дерево);
	КонецЕсли;		
КонецПроцедуры


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

В качестве примера можно посмотреть мою разработку
//infostart.ru/profile/1999/projects/442

Пользуйтесь...

См. также

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

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

28.11.2021    1828    user707242_Gold_karas    18    

5

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

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7780    Vortigaunt    5    

11

Механизмы платформы 1С Программист Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10456    Vortigaunt    26    

5

Механизмы платформы 1С Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    95863    Serginio    116    

188

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    44803    95    kitminsk    18    

20

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    24217    tomvlad    5    

14

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

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

02.07.2012    18940    maxpiter    62    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. OlegTor 169 04.09.06 17:38 Сейчас в теме
Смотрим, комментируем, высказываем пожелания и рейтинг плюсуем.
2. пользователь 04.09.06 21:10
Сообщение было скрыто модератором.
...
3. OlegTor 169 05.09.06 09:53 Сейчас в теме
2 Maniac.
Согласен, красивее - это звучит объективно. Но вот насчет простоты - дело субъективное. Каждый сам решает, что ему проще, а что нет. Не любой программист будет связываться с внешними компонентами. Особенно это относится к тем, кто кроме 1С никаким инструментом не владеет.
4. CheBurator 2712 05.09.06 12:15 Сейчас в теме
Было бы замечательно, если бы автор выложил в качестве примера не свою обработку, а вариант типовой обработки в ТиС "Дерево документов" (структура подчиненности).
ЗЫ: Удалось ли решить проблему отрисовки таблицы не всей при свертке/развертке, а "сдвигом" секций?
5. OlegTor 169 05.09.06 12:37 Сейчас в теме
На "Дерево документов" пока нет времени.
По той же причине решением проблемы оптимизации визуализации дерева пока не занимался.
6. АЛьФ 05.09.06 15:28 Сейчас в теме
Пара скриншотов не помешала бы...
7. CheBurator 2712 05.09.06 19:41 Сейчас в теме
Альф, а можно как-то считать область таблицы и вывести ее допустим на 5 строк ниже и на 2 столбца левее не поячеечно, а типа "куском"? было бы ок... допустим кликаем на роазворот узла - перед выводом всегда можно постиать сколько строк займет - всеь вывод от этого узла все что ниже сдвигаем на это кол-во строк а в свободное место выводим данные узла... типа так....
или не стоит заморачиваться?
8. CheBurator 2712 05.09.06 19:42 Сейчас в теме
Да, +1 обработку смотрел, понравилось...
Надо xltkfnm чтоб узлы были с разворотом по горизонтали и вертикали - типа как у "новейшего отчета"
9. 06.09.06 03:39 Сейчас в теме
Для меня более привлекательным оказалось использование ТаблицыЗначений вместо списка. Отлично смотрится на форме и более производительно.

2Maniac: Избавте меня от таскания всяких-там компонент по машинам пользователей.
Мне понравилась чья-то фраза: "Ограниченноясть языка 1С - в ограниченности разроботчика".
10. пользователь 06.09.06 15:09
Сообщение было скрыто модератором.
...
11. orefkov 1152 07.09.06 14:11 Сейчас в теме
> Избавте меня от таскания всяких-там компонент по машинам пользователей.
КаталогИБ не напрягает таскать?
12. CheBurator 2712 07.09.06 16:50 Сейчас в теме
Спасибо. Посмеялсо. ;-)
13. karat60 07.09.06 19:57 Сейчас в теме
+1, на первый взгляд весьма привлекательно - дальше покажет жизнь
14. Natalia 257 01.05.09 22:38 Сейчас в теме
Спасибо за идею и красивую реализацию.
Пару раз уже успела позаимствовать в разных разработках.
Например, полуфабрикатное производство.
Конструкторы сначала "пищали от восторга" - потому что красиво,
а потом "схватились за головы" - потому что наглядно увидели свои недочеты ))
15. AS108 151 19.07.09 02:57 Сейчас в теме
Спасибо за ваши труды! Успехов!
Оставьте свое сообщение