- 8.3 Отбор в дереве значений
- Работа с деревом значений в 1С
- Дерево значений
- Дерево значений на форме
- Заполнение дерева значений
- Обход дерева значений
- Как свернуть и развернуть дерево значений
- Как удалить строку и очистить дерево значений
- Запрос и дерево значений
- Дерево значений в таблицу значений и обратно
- Отбор в дереве значений
- Интерактивный отбор дерева значений
- Шаблоны кода 1С
- Секреты TurboConf
- Нейросети и AI
- Лайфхаки 1С
- Бубен админа
- 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С, обнаружил для себя метод "КопироватьДанныеФормы", который можно использовать в данной задаче вместо РеквизитФормыВЗначение. Правда он доступен только на сервере и возможно, по факту делает тоже самое что и у меня код, но вы имейте ввиду.
См. также
× Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (6К участников)
Присоединиться
Источник