Дерево таблица значений методы

2.4. Список, таблица и дерево значений

ЭлементСписка = СписокСотрудников[Инд]; ЭлементСписка = СписокСотрудников.Получить(Инд); Сотрудник = ЭлементСписка.Значение; Представление = ЭлементСписка.Представление; Пометка = ЭлементСписка.Пометка; Картинка = ЭлементСписка.Картинка;

Для Каждого ЭлементСписка Из СписокСотрудников Цикл Сообщить(ЭлементСписка.Значение); КонецЦикла; СтаршийИндекс = СписокСотрудников.Количество() — 1; Для Сч = 0 по СтаршийИндекс Цикл Сообщить(СписокСотрудников[Сч].Значение); КонецЦикла;

СписокСотрудников.Удалить(0); Индекс = СписокОбъектов.Количество() — 1; Пока Индекс >= 0 Цикл Если ТипЗнч(СписокОбъектов[Индекс].Значение) = Тип(«Число») Тогда СписокОбъектов.Удалить(Индекс); КонецЕсли; Индекс = Индекс — 1; КонецЦикла;

ТаблицаЗначений = Новый ТаблицаЗначений; // Создать нужные колонки. ТаблицаЗначений.Колонки.Добавить(«Фамилия»); ТаблицаЗначений.Колонки.Добавить(«Возраст»);

ТаблицаЗначений.Колонки.Добавить(«Номенклатура», Новый ОписаниеТипов(«СправочникСсылка.Номенклатура»));// Добавить новую строку и задать значения в колонках таблицы. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.Фамилия = «Иванов»; НоваяСтрока.Возраст = 23; // Добавить новую строку и задать значения в колонках таблицы. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока[«Фамилия»] = «Иванов»; НоваяСтрока[«Возраст»] = 23;

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение, «Поставщик, Покупатель»); // Сформировать структуру отбора. СтруктураПоиска = Структура(«Сотрудник», ИскомоеЗначение); // Найти строки. МассивНайденныхСтрок = ТаблицаЗначений.НайтиСтроки(СтруктураПоиска);

Для Каждого ТекущаяСтрока Из ТаблицаСотрудников Цикл Сообщить(ТекущаяСтрока.Сотрудник); КонецЦикла; СтаршийИндекс = ТаблицаСотрудников.Количество() — 1; Для Сч = 0 по СтаршийИндекс Цикл Сообщить(СписокСотрудников[Сч].Сотрудник); КонецЦикла;

ТаблицаЗначений.Удалить(УдаляемаяСтрока); ТаблицаЗначений.Удалить(0); ТаблицаЗначений.Колонки.Удалить(УдаляемаяКолонка); ТаблицаЗначений.Колонки.Удалить(0); СтаршийИндексКолонок = ТаблицаЗначений.Колонки.Количество() — 1; Индекс = ТаблицаЗначений.Количество() — 1; Пока Индекс > = 0 Цикл Для Сч = 0 По СтаршийИндексКолонок Цикл Если ТипЗнч(ТаблицаЗначений[Индекс][Сч]) = Тип(«Число») Тогда ТаблицаЗначений.Удалить(Индекс); Прервать; КонецЕсли; КонецЦикла; Индекс = Индекс — 1; КонецЦикла;

НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока[ИмяКолонки] = Значение;

ТаблицаПолучатель = ТаблицаИсходная.Скопировать(); Для Каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл НоваяСтрока = ТаблицаПолучатель.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсходнойТаблицы); КонецЦикла; ОдноименныеКолонки = Новый Массив(); Для Каждого Колонка Из ИсходнаяТаблица.Колонки Цикл СовпадающаяКолонка = ТаблицаПолучатель.Колонки.Найти(Колонка.Имя); Если СовпадающаяКолонка <> Неопределено Тогда // Получить свойства колонки. Индекс = ТаблицаПолучатель.Колонки.Индекс(СовпадающаяКолонка); Имя = Колонка.Имя; ТипЗначения = Колонка.ТипЗначения; Заголовок = Колонка.Заголовок; Ширина = Колонка.Ширина; // Заменить колонки в таблице-получаетеле. ТаблицаПолучатель.Колонки.Удалить(Индекс); ТаблицаПолучатель.Колонки.Вставить(Индекс, Имя, ТипЗначения, Заголовок, Ширина); // Добавить очередное имя совпадающих колонок в массив. ОдноименныеКолонки.Добавить(Колонка.Имя); КонецЕсли; КонецЦикла; // Цикл перебора строк исходной таблицы. Для Каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл // Добавить новую строку в таблицу-получатель. НоваяСтрока = ТаблицаПолучатель.Добавить(); // Заполнить значения в совпадающих ячейках. Для Каждого ИмяКолонки Из ОдноименныеКолонки Цикл НоваяСтрока[ИмяКолонки] = СтрокаИсходнойТаблицы[ИмяКолонки]; КонецЦикла; КонецЦикла;

Читайте также:  Кухня прага белое дерево модульная

// Создать пустые ссылки. ПустоеОприходование = Документы.ОприходованиеТоваров.ПустаяСсылка(); ПустойВозврат = Документы.ВозвратТоваровОтПокупателя.ПустаяСсылка(); // Выполнить запрос. Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | Ссылка |ИЗ | Документ.ПоступлениеТоваровУслуг | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ ПЕРВЫЕ 0 | &ПустойДокументОприходование | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ ПЕРВЫЕ 0 | &ПустойДокументВозврат |»; Запрос.УстановитьПараметр(«ПустойДокументОприходование», ПустоеОприходование); Запрос.УстановитьПараметр(«ПустойДокументВозврат», ПустойВозврат); // Выгрузить в таблицу значений. ТаблицаСсылок = Запрос.Выполнить().Выгрузить();

Процедура ЗаполнениеДерева(Кнопка) Дерево.Колонки.Очистить(); Дерево.Колонки.Добавить(«ИмяКолонки»); // Создать первую строку. Правильнее сказать создать элемент // коллекции. Он помещается в переменную «СтрокаВерхнегоУровня». СтрокаВерхнегоУровня = Дерево.Строки.Добавить(); // В колонку «ИмяКолонки» записать значение «Старшая». СтрокаВерхнегоУровня.ИмяКолонки = «Старшая»; // Создать строку подчиненную «Старшей». ПодчиненнаяСтрока =СтрокаВерхнегоУровня.Строки.Добавить(); ПодчиненнаяСтрока.ИмяКолонки = «Первая подчиненная»; ПодчиненнаяВторогоУровня = ПодчиненнаяСтрока.Строки.Добавить(); ПодчиненнаяВторогоУровня.ИмяКолонки = «Первая нижняя»; ПодчиненнаяВторогоУровня = ПодчиненнаяСтрока.Строки.Добавить(); ПодчиненнаяВторогоУровня.ИмяКолонки = «Вторая нижняя»; ПодчиненнаяСтрока = СтрокаВерхнегоУровня.Строки.Добавить(); ПодчиненнаяСтрока.ИмяКолонки = «Вторая подчиненная»;

// Использование метода позволит увидеть результат работы // с деревом значений в табличном поле. ЭлементыФормы.Дерево.СоздатьКолонки(); КонецПроцедуры Процедура ОткрытиеВетки(Кнопка) // Сделать текущим именно элемент коллекции «Строки». РезультатПоиска = Дерево.Строки.Найти(«Первая нижняя», «ИмяКолонки», Истина); Если РезультатПоиска <> Неопределено Тогда ЭлементыФормы.Дерево.ТекущаяСтрока = РезультатПоиска; КонецЕсли; КонецПроцедуры

// С деревом значений проблема в том, что по сути это массив строк с данными,// каждая строка в котором может иметь свой массив строк, а может и не иметь.// Ниже приведен пример функции, которая возвращает строку, найденную по определенному условию// Получаем искомую строку вызвав функцию, в функцию передаем строки дерева значений на первом уровне:ОписаниеМетаданныхЗагрузки = НайтиОтмеченноеЗначениеВДеревеЗначений(ДеревоМетаданных.Строки);// Эта функция осуществляет поиск строки// Если строка найдена, возвращает найденною строку дерева// Если строка не найдена, возвращает неопределеноФункция НайтиОтмеченноеЗначениеВДеревеЗначений(СтрокиДерева) // пробежимся по всем строкам (по всем строкам одного уровня, которые были переданы!) Для каждого Строка из СтрокиДерева Цикл // Вот наше условие, значение Выгружать у строки равно 1: Если Строка.Выгружать = 1 Тогда // Если условие сработало, возвращаем строку Возврат Строка; КонецЕсли; КонецЦикла; // Если не нашли строку, смотрим под-строки каждой строки Для каждого Строка из СтрокиДерева Цикл // Здесь осуществляется рекурсивный вызов НайденнаяСтрока = НайтиОтмеченноеЗначениеВДеревеЗначений(Строка.Строки); Если НайденнаяСтрока <> неопределено Тогда // Если нашли, возвращается строка Возврат НайденнаяСтрока; КонецЕсли; КонецЦикла; // Не нашли строку по условию, возвращаем неопределено Возврат неопределено;КонецФункции

Читайте также:  Как правильно выровнять дерево

Источник

Работа с деревом значений в 1С

В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.

Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».

Дерево значений

Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.

Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».

Дерево значений на форме

Визуальное представление дерева значений обеспечивает элемент «Табличное поле».

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

Заполнение дерева значений

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

Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.

Небольшой пример программного заполнения таблицы значений для управляемых форм:

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

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

Как свернуть и развернуть дерево значений

Сворачивается и разворачивается дерево значений очень просто.

Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).

Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.

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

Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.

Точно также можно очистить от подчиненных элементов другую другую строку.

Удалить строку дерева значений не сложнее — нужно только знать ее индекс:

Запрос и дерево значений

Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».

Читайте также:  Фотосессия возле дерева позы

Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:

Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.

Дерево значений в таблицу значений и обратно

Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.

Отбор в дереве значений

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

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

Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.

Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.

Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.

На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

УжасноПлохоНеплохоХорошо Отлично(оценок: 36, средняя оценка: 4,64 из 5)

Источник

Оцените статью