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

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

Подскажите как осуществить отбор в уже выведенном на форму дереве значений?
Подумываю попробовать НайтиСтроки() но не уверен что это то что нужно.

(2) это не метод, но походу он для только таблицы значений; тогда +1 к условному оформлению, или есть еще вариант с переформированием дерева с уже отобранными данными

(0) А как ты себе вообще это представляешь?
Вот есть у тебя дерево — 3 уровня. Наложил отбор, ему соответствует только самая нижняя строка. Куда бежать, как отображать?

(9) Мне (и платформе, кстати, тоже) мало интересно, какое у тебя «там» дерево. В (8) конкретный пример — опиши, как должно выглядеть дерево после наложения отбора.
Ну и если дерево одноуровневое — может пора перестать стесняться и сделать его таблицей?

(11) Не стесняюсь, тупо лень)))
Там весь док переписывать прийдётся(
А выглядеть после наложения отбора так же могло бы)))
Но конечно случай единичный и годиться только для одноуровневого дерева.

(10) (7)
Добавляешь элемент условного оформления,
Оформление — Видимость = Ложь, Отображать = Ложь
Условие — при котором нужно скрыть неугодные строки,
Оформляемые поля — элементы формы — сама таблица и все ее колонки.

Однако возможна беда — иногда у вертикального скроллера срывает кукушку и он дико колбасится при скроллинге (по-моему появилась в 8.3).
Поэтому завести два дерева будет более стабильным решением.
Но смотри чтобы форму не порвало.

(15) Что то ругается «Недоступен в данных формах»
Это же реквизит дерева с типом «УсловноеОформление» или не туда полез?

(21) Как в СКД отчета.
— находишь элемент условного оформления через свойство управляемой формы УсловноеОформление.Элементы.
— в найденном элементе корячишь отборы через его свойство .Отбор.Элементы

(35) Док по типу установки цен в УТ 11
С возможностью добавления любого количества периодов (в виде колонок)
Вот теперь надо сделать ещё одну ТЧ (само собйо тупо на форме) в которой будут выводится сгруппированные контрагенты.
и при выделении нужного контрагента в левой части в правой показывается товар выписанный на него.

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

Читайте также:  Модульные картины абстракция дерево

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

Хотя таблица значений разумеется будет работать быстрее — всегда когда есть возможность лучше использовать таблицу вместо дерева.

(39) Элементарно!
При заполнении дерева вычисляется флажок Булево — скрывать или показывать ли эту строку дерева.
Соответственно строчка верхнего уровня скрывается если скрыты все подчиненные.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Трубка курительная дерево резная

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Интерактивный отбор дерева значений

  • Решение, теория:
    Так как, создатели 1С не предусмотрели отборов в дереве значений, то нам необходимо создать копию оригинального дерева, в которой будут хранится все данные, а в основном же дереве, мы будем удалять все строки не соответствующие отбору

    Читайте также:  Чем вывести побеги от деревьев

    Давай уже код:
    В начале (при создании на сервере), нам необходимо скопировать структуру оригинального дерева, вызываем процедуру СоздатьНовоеПустоеДеревоКопированием

    &НаКлиентеНаСервереБезКонтекста Функция ИмяКопииДереваЗаказа() Возврат "КопияДереваЗаказа"; КонецФункции &НаСервере Процедура СоздатьНовоеПустоеДеревоКопированием() Попытка Реквизит = ЭтаФорма[ИмяКопииДереваЗаказа()]; Возврат; // Дерево есть, создавать не надо Исключение КонецПопытки; // Так как возникло исключение и мы попалю сюда, то копии дерева нету ДеревоИсходник = РеквизитФормыВЗначение("ТаблицаЗаказа"); МассивДобавленныхРеквизитов = Новый Массив; НовоеДерево = Новый РеквизитФормы(ИмяКопииДереваЗаказа(), Новый ОписаниеТипов("ДеревоЗначений")); МассивДобавленныхРеквизитов.Добавить(НовоеДерево); Для Каждого ТекКол Из ДеревоИсходник.Колонки Цикл Колонка = Новый РеквизитФормы(ТекКол.Имя, ТекКол.ТипЗначения, ИмяКопииДереваЗаказа()); МассивДобавленныхРеквизитов.Добавить(Колонка); КонецЦикла; ИзменитьРеквизиты(МассивДобавленныхРеквизитов); ДеревоИсходник = Неопределено; КонецПроцедуры 

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

    &НаСервере Процедура СкопироватьДеревоЗаказа(ДеревоИсточник, ИмяРеквизитаНазначение) СоздатьНовоеПустоеДеревоКопированием(); ДеревоКопия = ДеревоИсточник.Скопировать(); ЗначениеВРеквизитФормы(ДеревоКопия, ИмяРеквизитаНазначение); КонецПроцедуры 

    Теперь добавляем команды которые будут отбирать значения. Сами команды кидаем на командную панель (так как только там работает «Пометка»). Этих команд отбора может быть несколько:

    &НаКлиенте Процедура ОтобратьНеУдовлетворенныйСпрос(Команда) УстановитьОтборДереваЗаказаНаКлиенте(Элементы.ТаблицаЗаказаОтобратьНеУдовлетворенныйСпрос); // Передаем элемент кнопки, которая вызвала данную команду КонецПроцедуры 

    Все эти команды отбора вызывают главное — процедуру отбора:

    &НаКлиенте Процедура УстановитьОтборДереваЗаказаНаКлиенте(Элемент) Элемент.Пометка = Не Элемент.Пометка; УстановитьОтборДереваЗаказа(); КонецПроцедуры &НаСервере Процедура УстановитьОтборДереваЗаказа() // Описываем возможные отборы СоответствиеОтборам = Новый Соответствие; СоответствиеОтборам.Вставить(Элементы.ТаблицаЗаказаОтобратьНеУдовлетворенныйСпрос, "ТолькоНеУдовлетворенныйСпрос"); // Элемент и текстовое представление (потребуется дальше). Если нужно несколько отборов, добавьте тут ещё строк Отборы = Новый Структура; ВключеноОтборов = 0; Для Каждого ЭлементОтбора Из СоответствиеОтборам Цикл Если ЭлементОтбора.Ключ.Пометка Тогда // Проходим по всем описанным элементам и проверяем, какие включены Отборы.Вставить(ЭлементОтбора.Значение); ВключеноОтборов = ВключеноОтборов + 1; КонецЕсли; КонецЦикла; // Надо снять отбор ДеревоКопия = РеквизитФормыВЗначение(ИмяКопииДереваЗаказа()); ДеревоЗаказа = РеквизитФормыВЗначение("ТаблицаЗаказа"); ДеревоЗаказа = ДеревоКопия.Скопировать(); // Замещаем основное дерево, данными из копии Если ВключеноОтборов  

    Завершение
    Вуаля! Отборы прекрасно работают и делают это достаточно быстро!
    И домашнее задание вам: Если вы предполагаете изменение дерева (когда установлен отбор), вам необходимо синхронизировать данные с копией дерева, которое хранит исходные данные (добавлять позиции или менять значения полей).

    Мозг + источники идей из разных мест

    Недостаточно рейтинга для добавления отрицательного голоса. Шаблон будет скрыт из ваших результатов поиска.

    Орфографическая ошибка в Вуаля: Вуаля

    Шаблоны кода 1С

    Секреты TurboConf

    Нейросети и AI

    Лайфхаки 1С

    Бубен админа

    1С не всерьез

    Комментарии

    Тут изучая список методов 1С, обнаружил для себя метод "КопироватьДанныеФормы", который можно использовать в данной задаче вместо РеквизитФормыВЗначение. Правда он доступен только на сервере и возможно, по факту делает тоже самое что и у меня код, но вы имейте ввиду.

    См. также

    sale

    fastcode_tg

    courses_fastcode

    courses_fastcode

    × Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (6К участников)
    Присоединиться

    Источник

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