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

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

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

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

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

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

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

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

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

Читайте также:  Сколько живут самые долгоживущие деревья

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

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

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

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

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

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

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Секреты TurboConf

    Нейросети и AI

    Лайфхаки 1С

    Бубен админа

    1С не всерьез

    Комментарии

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

    См. также

    sale

    fastcode_tg

    courses_fastcode

    courses_fastcode

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

    Источник

    ДеревоЗначений.Строки
    Метод НайтиСтроки()

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

    Описание

    Метод НайтиСтроки() осуществляет поиск всех строк в коллекции строк дерева значений, соответствующих заданному условию поиска.

    Внимание! Метод эффективно использовать для выборки неуникальных значений. Для поиска уникальных значений лучше воспользоваться методом ДеревоЗначений.Строки.Найти()

    Доступность

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

    Пример использования

    Пример кода с использованием метода НайтиСтроки() :

    //создание нового дерева значений ДеревоЗначений = Новый ДеревоЗначений; //добавим колонки ДеревоЗначений.Колонки.Добавить("Наименование"); ДеревоЗначений.Колонки.Добавить("КодТовара"); // //заполнение дерева // //определение параметров поиска ПараметрыПоиска = Новый Структура; ПараметрыПоиска.Вставить("Наименование", "Стол деревянный"); //поиск строк мНайдСтроки = ДеревоЗначений.Строки.НайтиСтроки(ПараметрыПоиска, Истина); Если мНайдСтроки.Количество() = 0 Тогда Сообщить("Ничего не найдено!", СтатусСообщения.Важное); КонецЕсли; 

    Читайте также:

    Источник

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