1с вывести дерево значений на обычную форму

Вывод результат запроса как дерево значений на обычную форму

Создал на форме деревозначений.

Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КА_ОборотыБюджетовФОТ.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
| КА_СтатьиБюджетаФОТ.Ссылка КАК СтатьяБюджетаФОТ,
| ВЫРАЗИТЬ(«»»» КАК СТРОКА(100)) КАК ОбщаяКолонка,
| СУММА(КА_ОборотыБюджетовФОТ.СуммаУпр) КАК СуммаУпр
|ИЗ
| РегистрНакопления.КА_ОборотыБюджетовФОТ КАК КА_ОборотыБюджетовФОТ
| ПОЛНОЕ СОЕДИНЕНИЕ Справочник.КА_СтатьиБюджетаФОТ КАК КА_СтатьиБюджетаФОТ
| ПО КА_ОборотыБюджетовФОТ.СтатьяБюджетаФОТ = КА_СтатьиБюджетаФОТ.Ссылка
|
|СГРУППИРОВАТЬ ПО
| КА_ОборотыБюджетовФОТ.ПодразделениеОрганизации,
| КА_СтатьиБюджетаФОТ.Ссылка
|ИТОГИ ПО
| ПодразделениеОрганизации ИЕРАРХИЯ,
| СтатьяБюджетаФОТ ИЕРАРХИЯ»;

ОбойтиСтроки(Дерево.Строки);
//Дерево.Строки.Удалить(0);
Дерево.Колонки.Удалить(0);
Дерево.Колонки.Удалить(0);
ТабличноеПоле1 = Дерево;
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

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

Первая строка кстати тоже не понятно откуда берется, там полный перечень группировок справочников из которых состоят данные. Но она вроде нормально удаляется Дерево.Строки.Удалить(0);

В общем как мне получить правильно дерево значений?

Тип: Произвольный.
Идентификатор строки таблицы.
Описание:

Сворачивает узел в указанной строке дерева.

Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).

Источник

Программирование в 1С для всех

Дерево значений 1С – это универсальная коллекция значений, в которой данные можно расположить в иерархическом порядке в виде дерева. По сути, дерево значений в 1С 8.3 — это таблица значений, где у строк могут быть подчиненные строки. Одна строка дерева значений может иметь несколько подчиненных строк, но в тоже время она может иметь только одну строку, которой подчинена, строку-родителя, или не иметь родителя вообще. Строка без родителя – это строка верхнего уровня, или первая строка.

В программном модуле дерево значений создается при помощи конструктора Новый.

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

То есть, такой код, при выполнении на тонком клиенте, работать не будет:

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

Колонки дерева значений 1С

Само по себе дерево значений не имеет смысла, для того, чтобы можно было с ним работать у этого дерева нужно создать колонки. Для этого, нужно использовать свойство дерева значений Колонки, которое имеет тип КоллекцияКолонокДереваЗначений, у объекта данного типа имеется ряд методов, с которыми вы можете познакомиться в синтакс-помощнике, а нас конкретно интересует метод Добавить. Этот метод добавляет новые колонки в дерево значений. Он имеет следующий синтаксис:

Где Имя – это имя колонки (уникальное в рамках этого дерева); Тип – в этом параметре описывают возможные типы колонки, делается при помощи объекта ОписаниеТипов; Заголовок – название колонки и Ширина — ширина колонки в символах.

Например, добавим нашему дереву регионов три колонки:

Мы добавили три колонки, две из которых имеют тип строка, а одна имеет тип число.

Строки дерева значений 1С

Строки дерева значений 1С бывают двух видов. Это строки верхнего (или первого) уровня. Те строки, у которых нет ни каких родителей, и которые ни кому не подчинены. И подчиненные строки – это строки более низких уровней. У подчиненных строк заполнено свойство Родитель, в котором указывается родительская строка, т.е. та строка, которой подчинена эта текущая строка (у строк верхнего уровня свойство Родитель пустое). Для того, чтобы создать строку верхнего (или первого) уровня, нужно воспользоваться свойством Строки дерева значений. Это свойство имеет тип КоллекцияСтрокДереваЗначений. И у объекта этого типа есть метод Добавить, который создает новую строку верхнего (первого) уровня. Причем, этот метод является функцией, которая возвращает строку дерева значений. А у этой строки мы, как к свойствам, можем обращаться к колонкам дерева значений.

В этом коде добавлено две строки верхнего уровня дерева регионов.

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

Например, так мы создаем две строки второго уровня:

А так, мы создаем строки третьего уровня (две для Удмуртии и одну для Татарстана):

Обход дерева значений 1С

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

Поскольку свойство Строки дерева значений является коллекцией, то к ней применим цикл Для Каждого Цикл. Где в значении очередного элемента коллекции находится строка верхнего уровня (первого) дерева значений, у этой строки можно обращаться к колонкам как к свойствам.

Если нам нужно обойти строку следующего уровня, то в этот раз следует уже циклом Для каждого Цикл обходить свойство Строки текущей строки дерева значений.

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

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

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

1

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

2

Дерево значений 1С на управляемой форме

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

3

Само по себе такое дерево бессмысленно. Нужно добавить ему колонки. Если мы хотим дереву значений на форме добавить колонку, то необходимо сначала выделить дерево на форме, а потом нажать на кнопку «Добавить колонку реквизита».

4

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

5

В моей учебной конфигурации имеется справочник Регионы, который является иерархическим (иерархия элементов).

6

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

Заполнить это дерево можно несколькими способами. В первом способе, мы в рекурсивной процедуре обходим выборку из запроса, и если у этой выборки имеется выборка вложенных записей, то вызываем эту же процедуру.

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

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

7

Также с деревом значений на форме можно работать напрямую. Дерево значений на управляемой форме конвертируется в объект ДанныеФормыДерево, который моделирует работу дерева на управляемой форме. Для того, чтобы обратиться к элементам верхнего уровня этого объекта нам необходимо воспользоваться методом ПолучитьЭлементы(), который возвращает объект имеющий тип ДанныеФормыКоллекцияЭлементовДерева, этот тип является коллекцией, и как любую коллекцию его можно обойти циклом и получить элемент этой коллекции, а уже у элемента этой коллекции посредством метода ПолучитьЭлементы() можно получить подчиненные ему строки и т.д.

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

8

Статьи о других универсальных коллекциях значений в 1С

Более подробно о работе с другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»

1C %D0%B2 %D0%B6%D0%B5%D0%BB%D1%82%D0%BE%D0%BC %D1%86%D0%B2%D0%B5%D1%82%D0%B5 3D

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

1 %D0%B2 %D0%B6%D0%B5%D0%BB%D1%82%D0%BE%D0%BC %D1%86%D0%B2%D0%B5%D1%82%D0%B5 3D %D0%BC%D0%B0%D0%BB%D0%B5%D0%BD%D1%8C%D0%BA%D0%B0%D1%8F

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

Промо-код на скидку в 15% — 48PVXHeYu


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

Источник

Дерево значений в 1С 8.3

reklama http

Дерево значений — это универсальная коллекция 1С, которая позволяет хранить данные в иерархическом виде. Данная коллекция похожа на таблицу значений, но в дереве каждая строка может иметь подчиненные строки.

Поиск, сортировка и получение итогов могут выполняться как только по одному уровню иерархии, так и включая подчиненные строки.

В толстом клиенте нельзя передавать дерево значений с клиента на сервер. На тонком клиенте дерево значений не доступно.

Создание дерева значений

Создать новое дерево значений можно с помощью конструктора:

У дерева значений есть свойства Колонки и Строки. Для добавления новых строк сначала нужно добавить колонки дерева:

Теперь через свойство Строки можно добавлять строки дерева:

Новые строки будут добавлены на первый уровень иерархии. Чтобы добавить к существующей строке подчиненные строки нужно обратиться к свойству Строки существующей строки дерева значений:

В результате у строки с номенклатурой «Системный блок» будет 2 подчиненных строки с процессором и оперативной памятью.

Рассмотрим другие операции с деревом значений:

Колонки дерева значений

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

Итоги по дереву значений

Для получения итога по числовой колонке дерева значений можно использовать метод Итог:

Поиск по дереву значений

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

Источник

Просто о дереве значений

Для того, чтобы работать с этим объектом, нужно понимать, для чего он нужен. Он удобен, в первую очередь, для представления иерархических объектов – таких, как справочник Номенклатура. Мне встречалась также задача по представлению в виде дерева разнотипных подчинённых объектов, например ЗаказовПокупателя и Номенклатуры в Маршрутном Листе.

Дерево Значений = Таблица Значений + колонка Родитель

24f725123411a3539ef8615b3aec9637

Иерархия или подчинённость отражается в 1С с помощью дополнительного реквизита – Родитель. Именно наличие такого реквизита отличает объект ДеревоЗначений от объекта ТаблицаЗначений. Это первое, что нужно запомнить для работы с Деревом – ДеревоЗначений это ТаблицаЗначений с дополнительной колонкой Родитель.

Дерево Значений = работа с одним уровнем иерархии

8dd07119313dfaf1075f6ef00fb24d6b

Второй важный момент – при работе с деревом на Сервере, в отличие от ТаблицыЗначений, у которой можно получить произвольное количество строк методом НайтиСтроки(), получаемые строки ограничены текущим уровнем иерархии, то есть значением колонки Родитель. Во время первого обращения к объекту метод Строки() возвращает коллекцию (не массив, как в ТЗ) строк корневого уровня – строк с пустым значением колонки Родитель. В зависимости от типа иерархии таких строк может быть как одна, так и несколько. Далее вся работа с Деревом сводится к перебору циклом «Для Каждого Из» колллекции, полученной методом Строки(). Для каждого элемента коллекции метод Строки() возвращает коллекцию подчинённых строк – тех, у которых значение колонки Родитель равно данному элементу. Таким образом организуется рекурсивный обход дерева – примеры функций также есть в других статьях. Остальные методы работы с деревом аналогичны методам работы с таблицей значений (см. синтакс-помощник). Иначе говоря, коллекция строк дерева с одинаковым значением колонки Родитель представляет собой таблицу значений.

ДеревоЗначений на Сервере = ДанныеФормыДерево на Клиенте

Третий момент – передача данных Дерева между Клиентом и Сервером. На Клиенте объекту типа ДеревоЗначений соответствует объект ДанныеФормыДерево.

2e21319764a467dbf9f567a1753b8d31

Для работы с Деревом Значений в клиент-серверном режиме необходимо использовать функции платформы – РеквизитФормыВЗначение (ДанныеФормыВЗначение) для передачи изменений с клиента на сервер и ЗначениеВРеквизитФормы (ЗначениеВДанныеФормы) для передачи с сервера на клиент. Эти функции облегчают жизнь разработчику, поскольку обрабатывают весь объект целиком, а не только один уровень иерархии, как это вынужден делать разработчик.

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

Пример клиентской функции поиска значения:

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

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

Источник

Управляемая форма 1С 8.2 (8.3) – работа с деревом значений и таблицей значений. Часть I (Основы)

В данной статье речь пойдет о программном создании дерева значений (таблицы значений) на управляемой форме в управляемом приложении 1С 8.2. Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все то же самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть, так это СоздатьКолонки(). В управляемом приложении 1С 8.2 сделать это не так просто, как кажется на первый взгляд.

Обращаю внимание, что ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы, связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример, и все встанет на свои места.

Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.

Создаем новую внешнюю обработку, добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с выбрать файл управляемое приложение
  • 1с выбор файла обычные формы