Как сдвинуть группу строк дерева значений 1с
Столкнулся с необходимостью поменять местами строки дерева значений. В таблице значений для этого есть метод Сдвинуть(). а в ДЗ? Разве никак? И индекс строки никак не получить? Пытаюсь заменить строки по индексу (индексы не получал, указал явно) — «Индексированное значение доступно только для чтения». Собственно — как быть?
переприсваивать родителя
удалить,вставить
ДФКЭД = ТвоеДеревоЗначений.ПолучитьЭлементы();
Инд = ДФКЭД.Индекс(ТекДанные);
Есть в дереве значений метод «Сдвинуть»
КоллекцияСтрокДереваЗначений (ValueTreeRowCollection)
Сдвинуть (Move)
Синтаксис:
Тип: Число; СтрокаДереваЗначений.
Индекс строки, которую надо сдвинуть, либо сама сдвигаемая строка.
(обязательный)
Тип: Число.
Количество строк, на которые необходимо сдвинуть строку. Положительное смещение обозначает увеличение текущего индекса (сдвиг к концу коллекции), отрицательное — уменьшение текущего индекса (сдвиг к началу коллекции).
Описание:
Сдвигает строку на указанное количество позиций в коллекции строк данного уровня дерева значений.
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:
// сдвинем первую строку на следующую позицию
СтрокиСостава.Сдвинуть(0, 1);
// сдвинем вторую строку на предыдущую позицию
СтрокиСостава.Сдвинуть(1, -1);
Дерево значений 1с. Описание и примеры использования
ДеревоЗначений — это программный объект встроенного языка, позволяющий строить произвольные иерархические наборы данных в памяти компьютера, отображать их в табличном и\или древовидном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать строки).
Как и таблица значений, дерево состоит из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Однако, в отличие от таблицы значений, строки дерева значений могут иметь подчиненные строки любой глубины вложенности.
Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.
Дерево значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками дерева, добавляя и удаляя их, но и колонками.
Дерево значений может использоваться явно при создании в коде необходимого количества переменных типа ДеревоЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с деревом значений.
Создание дерева значений
Как и большинство объектов встроенного языка, новая дерево значений может быть создано с помощью оператора Новый :
дз = Новый ДеревоЗначений;
Свойства и методы дерева значений
| Имя | Тип | Описание |
|---|---|---|
| Свойства | ||
| Колонки | КоллекцияКолонокДереваЗначений | содержит коллекцию колонок дерева значений |
| Строки | КоллекцияСтрокДереваЗначений | содержит коллекцию корневых строк дерева значений |
| Методы | ||
| ВыбратьСтроку() | СтрокаДереваЗначений | открывает диалог для интерактивного выбора строки дерева значений |
| Скопировать() | ДеревоЗначений | создает новый объект копированием текущего (копируются все колонки и строки) |
Колонки дерева значений
Прежде чем начать работу с деревом значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:
| Имя | Тип | Описание |
|---|---|---|
| Имя | Строка | символьный идентификатор колонки, по которому к ней можно обращаться из кода. Может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания |
| Заголовок | Строка | строковое представление колонки на форме. Может содержать произвольные символы |
| ТипЗначения | ОписаниеТипов | тип значения содержимого ячеек в этой колонке. Свойство ограничивает пространство доступных значений, которые можно указать в данной колонке |
| Ширина | Число | ширина колонки на форме (выражается в количестве символов) |
Доступ к колонкам производится через свойство Колонки объекта ДеревоЗначений . Для добавления новой колонки используется метод Колонки.Добавить():
дз.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); дз.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); дз.Колонки.Добавить("Свойство");//можно хранить произвольные данные
Для того, чтобы определить наличие колонки с нужным именем используется метод Колонки.Найти():
найдКолонка = дз.Колонки.Найти("Наименование"); Если найдКолонка = Неопределено Тогда Сообщить("Колонка не найдена!"); Иначе Сообщить("Индекс колонки color: red;">+ дз.Колонки.Индекс(найдКолонка)); КонецЕсли;
Перебор колонок выполняется следующим образом:
Для каждого Колонка Из дз.Колонки Цикл Сообщить(Колонка.Имя + ": " + Колонка.ТипЗначения); КонецЦикла; //Результат: // Наименование: Строка // Количество: Число // Свойство:
Для удаления колонки используется метод Колонки.Удалить():
найдКолонка = дз.Колонки.Найти("Свойство"); Если НЕ найдКолонка = Неопределено Тогда дз.Колонки.Удалить(найдКолонка); КонецЕсли;
Методы коллекции колонок дерева значений
| Вставить() | Вставляет новую колонку в указанную позицию коллекции |
| Добавить() | Добавляет новую колонку в конец коллекции |
| Индекс() | Возвращает индекс колонки в коллекции колонок |
| Получить() | Возвращает колонку по ее индексу |
| Количество() | Возвращает количество колонок в коллекции |
| Найти() | Ищет колонку в коллекции по имени |
| Очистить() | Удаляет все колонки из коллекции |
| Сдвинуть() | Сдвигает колонку влево или вправо |
| Удалить() | Удаляет колонку из коллекции |
Строки дерева значений
С колонками разобрались. Давайте теперь разберемся со строками. Строки дерева значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.
В отличие от таблицы значений, доступ к строкам дерева значений производится через свойство Строки объекта ДеревоЗначений или объекта СтрокаДереваЗначений . Каждая строка является узлом иерархии, поэтому обладает следующими свойствами и методами:
| Имя | Тип | Описание |
|---|---|---|
| Свойства | ||
| Родитель | СтрокаДереваЗначений | ссылается на строку верхнего уровня. Для корневой строки имеет значение Неопределено |
| Строки | КоллекцияСтрокДереваЗначений | содержит коллекцию подчиненных строк |
| Методы | ||
| Владелец() | ДеревоЗначений | возвращает ссылку на дерево значений, которому принадлежит строка |
| Уровень() | Число | возвращает уровень вложенности строки в иерархии дерева. Для строки, не имеющей родителя, уровень будет равен 0 (верхний уровень или корневой уровень). Подчиненная ей строка будет иметь уровень 1 и т.д. |
Добавление и удаление строк
Для добавления новой строки используется метод Строки.Добавить(). Метод возвращает объект СтрокаДереваЗначений , с которым доступны дальнейшие манипуляции:
СтрокаДЗ = дз.Строки.Добавить();
И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:
СтрокаДЗ.Наименование = "Стул деревянный"; СтрокаДЗ.Количество = 1; СтрокаДЗ.Свойство = ТекущаяДата();
Для удаления строки используется метод Строки.Удалить(). Строку можно удалить передав методу либо саму строку, либо ее индекс:
//удаление строки дз.Строки.Удалить(СтрокаДЗ); //удаление по индексу ИндексСтроки = дз.Строки.Индекс(СтрокаДЗ); дз.Строки.Удалить(ИндексСтроки); //безопасное удаление НайдСтрока = дз.Строки.Найти("Стул деревянный", "Наименование"); Если НЕ НайдСтрока = Неопределено Тогда дз.Строки.Удалить(НайдСтрока); КонецЕсли;
Перебор строк дерева значений
Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :
Для Каждого СтрокаДЗ Из дз.Строки Цикл ИндСтроки = дз.Строки.Индекс(СтрокаДЗ); Сообщить("Строка[" + ИндСтроки + "]: " + СтрокаДЗ.Наименование); КонецЦикла; //в редких случаях Для ИндСтроки = 0 По дз.Строки.Количество() - 1 Цикл СтрокаДЗ = дз.Строки.Получить(ИндСтроки); Сообщить("Строка[" + ИндСтроки + "]: " + СтрокаДЗ.Наименование); КонецЦикла;
Поиск строк
Поиск в дереве значений можно выполнять не только по значению в колонке (в этом случае будет возвращена первая найденная строка), но и по набору свойств (в этом случае возвращается массив строк).
//удаление первой найденной строки НайдСтрока = дз.Строки.Найти("Стул деревянный", "Наименование"); Если НЕ НайдСтрока = Неопределено Тогда дз.Строки.Удалить(НайдСтрока); КонецЕсли; //удаление всех найденных строк ПараметрыПоиска = Новый Структура("Наименование", "Стул деревянный"); мНайдСтроки = дз.Строки.НайтиСтроки(ПараметрыПоиска); Для каждого НайдСтрока Из мНайдСтроки Цикл дз.Строки.Удалить(НайдСтрока); КонецЦикла;
Поиск возможен даже среди вложенных строк. Внимательно изучите документацию к методам Строки.Найти() и Строки.НайтиСтроки().
Все методы коллекции строк дерева значений:
| Вставить() | Вставляет строку на указанное место коллекции строк |
| ВыгрузитьКолонку() | Выгружает значения ячеек указанной колонки из текущей коллекции строк в массив значений |
| Добавить() | Добавляет новую строку в коллекцию строк |
| ЗагрузитьКолонку() | Загружает значения из массива в ячейки указанной колонки коллекции строк |
| Индекс() | Возвращает индекс строки дерева значений в коллекции |
| Итог() | Возвращает просуммированный итог по колонке дерева значений |
| Количество() | Возвращает количество строк в коллекции строк |
| Найти() | Выполняет поиск строки по значению |
| НайтиСтроки() | Выполняет поиск строк по указанным параметрам |
| Очистить() | Удаляет все строки из текущей коллекции строк |
| Получить() | Возвращает строку по ее индексу |
| Сдвинуть() | Сдвигает строку вверх или вниз по коллекции строк |
| Сортировать() | Выполняет сортировку строк в коллекции по указанным колонкам |
| Удалить() | Удаляет строку из коллекции строк |
Иерархию свойств и типов значений, связанных с деревом значений, схематически можно представить в виде дерева:
Дерево значений в управляемой форме
Дерево значений в 1С (тип значения «ДеревоЗначений») – это Универсальная коллекция значений в системе 1С, где Элементы упорядочены по Индексу (нумерация начинается с 0). Каждое значение Элемента содержит в себе Коллекцию подчиненных Строк, где у каждой Строки коллекции указывается Родитель – Элемент, находящийся на уровень выше. У корневого Элемента (элемент первого уровня) Родитель отсутствует. Доступ к Элементам осуществляется через Индекс, по номеру которого можно получить доступ к значению Элемента и коллекции подчиненных ему Строк. Описание из Синтакс-помощника: используется для доступа к свойствам и методам дерева значений 1С в целом. Объект, представляющий собой древовидную структуру, обладает сходной функциональностью с таблицей значений, а также обладает возможностью добавлять подчиненные строки к какой-либо строке дерева. Внимание! В толстом клиенте (обычное приложение) передача значений данного типа с клиента на сервер и обратно приводит к возникновению исключения. Доступность: сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер. Сериализуется: данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO: ValueTree.
2. Как создать дерево значений в 1C 8.3

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

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

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

*Пример преобразования:

** Пример работы «преобразование-запись-преобразование»:

Развернутое дерево значений по своей сути напоминает Результат запроса с группировками, где чем больше группировок, тем больше совокупное количество строк. Поэтому если требуется результат запроса (где данные сгруппированы) загрузить в ДЗ, необходимо:
1. (необязательно) преобразовать из реквизита формы; 2. загрузить результат; 3. преобразовать в реквизит формы.

При необходимости загрузки данных в ДЗ из табличной части 1С можно воспользоваться несколькими способами:
1. Запись с помощью циклов: тут нужно помнить, что есть строки «корневые», и надо их каким-то образом найти, чтобы правильно построить связь Корень-Подчиненный.
2. Загрузить с помощью Запроса (и здесь есть два варианта):
a. выгрузить табличную часть 1С во временную переменную, передать ее как параметр, сформировать результат с использованием иерархии и загрузить результат в дерево;

b. сформировать запрос, в который передаем как параметр ссылку принятого к обработке документа в 1С 8.3, после чего формируем результат с использованием иерархии и загружаем его в дерево.
*Варианты 2а и 2b кажутся похожими. Однако разница между ними есть. Она заключается в производительности, которая зависит от контекста использования (количество данных, количество пользователей, нагрузка на сервер и другое). С одной стороны, при использовании директивы НаСервере у нас уже есть табличная часть 1С (конечно, на стороне сервера, но она уже загружена), которую мы можем без потерь и других действий передать в Запрос и выполнить его. С другой стороны, обращаясь по ссылке в результате выполнения Запроса, система повторно обратится к БД, но, возможно, сделает это быстрее, чем в первом случае. Этот момент требует исследования уже на конкретной БД. Для записи данных в табличную часть 1С или Таблицу значений потребуется построить цикл, который будет выполнять запись в Приемник по следующим правилам:
1. обход дерева выполняется от Корня к Подчиненным до последнего уровня вложенности;
2. если у Корня есть Подчиненные элементы, то количество результирующих строк в Таблице высчитывается по формуле:
, где n – количество элементов на заданном уровне, m — количество уровней (глубина вложенности дерева);
3. рекомендуется записывать Корень – Подчиненный элемент, в связи с этим требуется запись рекурсивным методом. Пример рекурсивной записи из ДЗ в Табличную часть Товары: 

Для чтения данных все немного проще: читать можно как НаКлиенте, так и НаСервере. Разница только в том, что для директивы НаКлиенте потребуется сначала вызвать метод ПолучитьЭлемент(), чего не требуется для серверной директивы. Внимание! Не забудьте, что чтение в процедуре/функции с директивой НаКлиентеНаСервереБезКонтекста компилируется одновременно на клиенте и на сервере, а это значит, что описав Чтение как для клиента при вызове исполнения из процедуры/функции с директивой сервера, программа выдаст исключение (и наоборот). При необходимости вызова чтения как НаКлиенте, так и НаСервере рекомендуется создавать обработчики с соответствующими директивами. Кроме всего прочего, ДЗ можно использовать в особо изощренном способе работы. Допустим, поставили задачу, что необходимо иметь на форме две таблицы, таблица слева – дерево, в котором есть все уровни, кроме последнего; справа – таблица, в которой отображаются данные последнего уровня вложенности. Таким образом активация строки в Дереве приведет к отображению всех подчиненных элементов.
Реализованный пример такой задачи:
*Естественно, текущие данные тестовые. Задачей предполагалось, что корневых уровней может быть до 15, второй уровень – примерно так же, а вот на последнем уровне может быть до 50 строк. В такой компоновке удобно видеть все элементы нижнего уровня, переключаясь между Родителями. Использование Дерева значений — это достаточно нетривиальный и филигранный способ, который имеет свои плюсы (особенно когда группы товаров можно сворачивать). Использовать его для больших таблиц (где более 100 строк) можно, но важно исследовать производительность в каждом конкретном случае.
Специалист компании ООО «Кодерлайн» Каплин Иван Александрович
Дерево Значений
помогите. если создавать програмно и с кучей циклов, то это как то не интерестно.
По теме из базы знаний
- Программное копирование узла/строки дерева значений на управляемой форме (УФ, ДанныеФормыДерево, ДанныеФормыЭлементДерева) в вариантах на клиенте и на сервере
- Загрузка JSON в дерево значений
- JSON -> Дерево значений
- Преобразование Структуры в Дерево значений и Дерева значений в Структуру. Управляемые формы
- Программное добавление колонки в дерево значений на управляемой форме в расширении
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
2. Kom-off 13.01.12 11:46 Сейчас в теме
(1) Не надо кучи циклов. Одна рекурсивная функция в которой на основании исходных данных получаются необходимые.
3. Severwolf 38 13.01.12 11:55 Сейчас в теме
(2) Kom-off, вот я построил дерево, потом иду с рекурсивной функцией и перебираю все строки и формирую новое дерево уже программным путем.
Или я выгружаю результат запроса в таблицу и потом уже рекурсивной функцией заполняю программно берево.
если есть пример напишите.
6. Sam13 326 13.01.12 12:12 Сейчас в теме
(1) Severwolf, Мне кажется алгоритм будет такой:
-изменяем тип первой колонки (включаем типы тех колонок, данные которых будем в ней отражать)
-обходим дерево. При этом соблюдаем принцип: номер уровня соответствует номеру колонки, которая будет переноситься в первую
к0 111 (ур0) ничего не переносим к0 к1 111-222 (ур1) Уровень1. Переносим значение колонки 1 к0 к1 к2 111-222-999 (ур2) Уновень2. Переносим значение колонки 2 к0 к1 111-333 (ур1) Уровень1. Переносим значение колонки 1 к0 к1 111-444 (ур1) Уровень1. Переносим значение колонки 1
к0 к1 к2 ------------------------------- 111 222 222 999 222 999 333 333 444 444
4. maker 13.01.12 12:00 Сейчас в теме
Не очень понятно, что вы хотите добиться? В Запросе у вас несколько полей, а в результате выгрузки вы хотите получить дерево с одной колонкой?
5. NoxiD 13.01.12 12:06 Сейчас в теме
Видимо с 1 колонкой
7. maker 13.01.12 12:17 Сейчас в теме
Sam13, у человека выборка с иерархией. Поэтому не факт, что на втором уровне надо брать значений колонки 2, а не значение колонки 1.
8. Sam13 326 13.01.12 12:21 Сейчас в теме
(7) maker, какая разница с иерархией или без? дерево само по себе иерархия.
Я так понимаю здесь речь идет о том, что не нужно лишних колонок.
Первая строка в колонке 0 имеет значение 111 и все подчиненные ей строки тоже имеют значение 111 в колонке 0. А автору хочется, чтобы там ниже колонка 0 использовалась как-то по другому. Чтобы в колонке 0 было 222 333 999 в зависимости от уровня.
9. maker 13.01.12 12:31 Сейчас в теме
У человека явно прописано «ПоГруппировкамСИерархией», а в запросе «ИТОГИ ПО <Имя поля>ИЕРАРХИЯ». Если элемент 111 является группой для элемента 222, то ваш алгоритм не подходит.
Поэтому либо человек бездумно поставил «ПоГруппировкамСИерархией» вместо «ПоГруппировкам» и тогда в самом простом случае ваш алгоритм ему подойдёт, либо алгоритм усложнится. И по мне во втором случае нагляднее будет не использовать рекурсивную функцию.Имя>
10. Sam13 326 13.01.12 12:52 Сейчас в теме
(9) maker, Вы считаете, что дерево он построил по группировкой с иерархией, а хочет получить просто по группировкам? Это нонсенс.
11. maker 13.01.12 12:54 Сейчас в теме
Я предполагаю, что он хочет получить дерево значений с одной колонкой.
12. Severwolf 38 13.01.12 13:16 Сейчас в теме
))) я наверно не правильно выразился.
мне нужно дерево значений с колонками как и было, только чтобы небыло повторяющихся записей в сгрупированных строках по колонке группировки.
13. Yarik.69 13.01.12 13:24 Сейчас в теме
(12) Severwolf, попробуй выгрузить все в таблицу значений, а после в цикле просто обрабатывать полученный результат руками. Т.е. заполнять колонки значениями которые тебе нужны.
14. maker 13.01.12 13:27 Сейчас в теме
Severwolf, так в запросе у вас тип итогов какой: «Элементы», «Элементы и иерархия» или «Только иерархия»?
16. Sam13 326 13.01.12 14:04 Сейчас в теме
(14) maker, какая разница? Человек дерево обрабатывает, а не запрос.
17. Severwolf 38 13.01.12 14:07 Сейчас в теме
(14) maker, Как понять какой тип? обычные итоги
. |ИТОГИ | СУММА(ВыполненоБУ), | . | . | . | СУММА(РазницаБюджет) |ПО | ОБЩИЕ |(15) Sam13, чет плохо читается код, вставте в тэг пожалуйста.
15. Sam13 326 13.01.12 14:00 Сейчас в темеВот пример кода:
Поясняю: в форме 2 табличный поля (дерево значений): ТабличноеПоле1 и ТабличноеПоле2. по нажатию кнопки выполняется обработчикПроцедура КнопкаВыполнитьНажатие(Кнопка) Запрос = Новый Запрос; Запрос.УстановитьПараметр("ГруппаНоменклатуры",Справочники.Номенклатура.НайтиПоКоду("65990")); Запрос.УстановитьПараметр("ДатаОкончания",ТекущаяДата()); Если Истина Тогда //Текст запроса Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Склад КАК Склад, | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОкончания, Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)) КАК ТоварыНаСкладахОстатки | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстатки.Склад, | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток |ИТОГИ | СУММА(КоличествоОстаток) |ПО | Склад"; КонецЕсли; Результат = Запрос.Выполнить(); Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Дерево1 = Дерево.Скопировать(); ЭлементыФормы.ТабличноеПоле1.Значение = Дерево; ЭлементыФормы.Табличноеполе1.СоздатьКолонки(); Колонка0Удалить = Дерево1.Колонки[0]; ИмяКолонки0 = Колонка0Удалить.Имя; Колонка0Удалить.Имя = ИмяКолонки0+"_Удалить"; Колонка0 = Дерево1.Колонки.Добавить(ИмяКолонки0,Новый ОписаниеТипов(Колонка0Удалить.ТипЗначения,"СправочникСсылка.Номенклатура")); ИзменитьКолонкиДерева(Дерево1.Строки,Колонка0.Имя); Дерево1.Колонки.Сдвинуть(Колонка0,-(Дерево1.Колонки.Количество()-1)); ЭлементыФормы.ТабличноеПоле2.Значение = Дерево1; ЭлементыФормы.Табличноеполе2.СоздатьКолонки(); КонецПроцедуры Процедура ИзменитьКолонкиДерева(_Строки,_ИмяПриемника) ОбработкаПрерыванияПользователя(); Для Каждого Строка Из _Строки Цикл УровеньСтроки = Строка.Уровень(); ИндексКопируемойКолонки = УровеньСтроки; Строка[_ИмяПриемника] = Строка[ИндексКопируемойКолонки]; ИзменитьКолонкиДерева(Строка.Строки,_ИмяПриемника); КонецЦикла; КонецПроцедурыТип значения у существующей колонки изменить нельзя, поэтому приходится добавлять новую колонку.
Впоследствии колонки, которые уже не нужны можно удалить (в коде этого нет)18. maker 13.01.12 14:11 Сейчас в теме
Sam13, а вот теперь скажи:
Если ты запрос пишешь такой "ПО Склад", а не "ПО Склад ИЕРАРХИЯ", то зачем ты пишешь Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией), когда у тебя только иерархия элементов? Отличие ОбходРезультатаЗапроса.ПоГруппировкам от ОбходРезультатаЗапроса.ПоГруппировкамСИерархией ты понимаешь?19. Sam13 326 13.01.12 14:14 Сейчас в теме
(18) maker, Да мне без разницы что у него в запросе было. Задача стоит по обработке дерева. Зачем смешивать?
20. maker 13.01.12 14:16 Сейчас в теме
Затем, что в одном случае ты заведомо знаешь количество уровней группировки, а в другом нет.
21. Sam13 326 13.01.12 14:32 Сейчас в теме(20) maker, Зачем мне знать количество уровней группировки, если обработка ведется в рекурсии? Если в запросе итог по иерархии, то то мы будем знать количество уровней дерева?
23. Sam13 326 13.01.12 14:36 Сейчас в теме
(20) maker, Мне кажется ты прав. Я видимо что-то не догоняю. Сейчас разберемся.
22. Severwolf 38 13.01.12 14:33 Сейчас в теме
Вот сейчас у меня типо такого
Должно быть точно также, только без повторений "Склад поляна", "Масло кремлевское"
p.s рисунок не мой
24. maker 13.01.12 14:42 Сейчас в теме
Разница в том, что не будет работать алгоритм привязки уровня к номеру колонки. На определённом уровне ты не будешь точно знать какую колонку очистить, а какую нет.
26. Sam13 326 13.01.12 14:55 Сейчас в теме
(24) maker, Все, понял. При иерархических данных в дереве не всегда значение строки в колонке0 равно значению родительской строки в колонке0. От уровня к уровню значение колонки0 может изменяться. Поэтому да, мой метод не будет работать.
25. Severwolf 38 13.01.12 14:54 Сейчас в теме
приведу пример из нэтаПроцедура ОсновныеДействияФормыЗаполнить(Кнопка) Дерево.Колонки.Добавить("Должность", Новый ОписаниеТипов("Строка")); Дерево.Колонки.Добавить("ФИО"); ГенДир = Дерево.Строки.Добавить(); ГенДир.Должность = "Генеральный директор"; ГенДир.ФИО = "ЛилиПутин Владимир Владимирович"; ФинДир = ГенДир.Строки.Добавить(); ФинДир.Должность = "Финансовый директор"; ФинДир.ФИО = "Ленин Владимир Ильич"; КоммДир = ГенДир.Строки.Добавить(); КоммДир.Должность = "Коммерческий директор"; КоммДир.ФИО = "Троцкий Федор"; ГлБух = ФинДир.Строки.Добавить(); ГлБух.Должность = "Главный бухгалтер"; ГлБух.ФИО = "Сорокин Сергей Алексеевич"; ЭлементыФормы.Дерево.СоздатьКолонки(); КонецПроцедуры
вот я вижу чтобы дабится такого, надо брать результат запроса, помащеть в ТЗ, потом ее парсить по группировкам, кучу циклов и так далее, считать итоги, и потом уже по алгоритму запихивать в дерево на подобии вышеуказанного в посте кода.

