Дерево значений в УФ и текущая строка
На форме есть дерево значений, у которого есть колонка «Документ». Есть реквизит формы, в который я периодически пихаю ссылку на документ. Как мне спозиционировать курсор на нужной мне строке, если я знаю значение колонки «документ», соответственно строку могу вычислить, но как?
Нужно получить идентификатор строки, как мне его получить зная значение одной из колонок?
Я чего то моз сломал.
Элементы.Дерево.ТекущаяСтрока=Ссылка
Элементы.Список.ТекущаяСтрока=Ссылка
Что сделать то нужно? Сформулируй как нибудь по другому.
Элементы.СписокЗаявокНаПродажу.ТекущаяСтрока = «Вот сюда нужно вставить ИдентификаторСтроки»
А вот как мне его получить, на клиенте или на сервере, думаю что на сервере, так как перебрать дерево значений на клиенте не представляется возможным.
Есть СписокЗаявокНаПродажуРеквизит с типом ДанныеФормыДерево, как в нем найти нужную мне строку, каким методом?
работает только с Таблицей формы, источник которой таблица базы данных, причем у Дин. списка установлена основная таблица
Если таблица формы — это произвольное именно дерево значений, а не иерархический список дин. списка с основной таблицей, то на
клиенте — получить идентифиактор строки можно только перебором
сервере — получить идентифиактор строки можно перебором или конвертаций данных формы дерева в значение дерева значений и поиска элемента методами Дз и последующим определением айди строки
(5) «клиенте — получить идентифиактор строки можно только перебором «, что нужно перебирать на клиенте, реквизит формы? Как? Он то заполнен, но там тип ДанныеФормыДерево
двоешники, где вы видели в сущностях
ДанныеФормыДерево — весь образ дерева на УФ
или
ДанныеФормыКоллекцияЭлементовДерева — узел(ветка) дерева на УФ
(12) получаю одну строку дерева, корень..
то есть СписокЗаявокНаПродажуРеквизит.ПолучитьЭлементы() получает только корневую строку с типом ДанныеФормыКоллекцияЭлементовДерева
(15) нет мань, ты точно ляпнул. в vmv все правильно сказал, уже разобрался, теперь надо плядское дерево перебирать в рекурсии(((
(18) истерики, упрямство, отсутствие логики, обидчивость — явно не мужкие черты.
Это элементарная дедукция)
(16) дурак чтоли. для активации строки дерево перебирать.
Я собствено говоря и написал — кто мешает найти строку методом, получить ее идентификатор и после этого использовать активацию.
тут влез педик, ты его поддержкал и решил делать рекурсию. пипец.
тырено с БСП специально для девочек
// Получает идентификатор (метод ПолучитьИдентификатор()) строки дерева значений для заданного значения поля строки дерева.
// Используется для позиционирования курсора в иерархических списках.
//
Процедура ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементовДерева, КлючСтроки, ПрекратитьПоиск) Экспорт
Для Каждого СтрокаДерева ИЗ КоллекцияЭлементовДерева Цикл
Если ПрекратитьПоиск Тогда
Возврат;
КонецЕсли;
Если СтрокаДерева[ИмяПоля] = КлючСтроки Тогда
Если КоллекцияЭлементов.Количество() > 0 Тогда
ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементов, КлючСтроки, ПрекратитьПоиск);
(20) еще раз спрашиваю метод НайтиСтроки() это метод какого объекта? С радостью его использую, если объяснишь как.
(23) дерева. с синтаксис помощником не дружишь?
(24) Где ж мне дерево взять? Есть Реквизит формы с типом ДанныеФормыДерево, как мне из него дерево вытянуть?
Источник
УФ, ДеревоЗначений как на сервере узнать, текущую выбранную на клиенте строку
&НаСервере
ДеревоФормы = РеквизитФормыВЗначение(«РеквизитФормыДеревоЗначений»);
//это Универсальные коллекции значений/Дерево значений
//.
//Изменения
ЗначениеВРеквизитФормы(ДеревоФормы, «РеквизитФормыДеревоЗначений»);
Вопрос — подскажите, пожалуйста, как на сервере получить строку, выбранную на клиенте .
>как на сервере получить строку, выбранную на клиенте
надо передать эту информацию с клинета в серверную процедуру в параметре
(1), (2) Если я на клиенте беру
ИндексСтроки=ТекущиеДанные.ПолучитьИдентификатор();
то получаю идентификатор в наборе строк текущего уровня и в нем не указано в каком узле все это творится. т.е., на сервере по идентификатору я пытаюсь по верхнему уровню набора строк этот идентификатор искать — не проходит.
у меня так:
УзелУровня1_1
|-УзелУровня2_1
|-УзелУровня2_2
|-УзелУровня2_3
Если меняю УзелУровня2_2 — на клиенте Идентификатор=1,
На сервере индекс не входит, т.к. там по дереву на верхнем уровне имеется только идентификатор [0]
(4) Т.е. делать все на клиенте. Но это неудобно — данные формы не позволяют обращаться к табличным частям и реквизитам объектов.
(6) я угуглился. связки между ЭлементФормыДеревоНоменклатура и Универсальные коллекции значений/Дерево значений — тупо нету.
И в описаниях от 1С прямо так и висит предупреждение об ограничениях при работе с Деревом значений.
В толстом клиенте такой ботвы нет — сам делал. Но там нет и разделения на Клиент и Сервер
(11) текст в указанной ссылке нашел в трёх источниках, буква в букву. И он не дает ответа как из формы передать на сервер дерево со строкой. При передаче — ошибка XDTO и описание у 1С о недоработанности работы с Деревьями в УФ.
И преобразованиях. Если дерево вернулось на клиент со структурой, отличающейся от структуры реквизита формы, будет ошибка.
Если бы была таблица, то можно получить идентификатор текущей строки, по нему — саму текущую строку, по ней ее индекс, затем преобразовать таблицу из реквизита формы в значение и по индексу выйти на нужную строку в таблице. В дереве же так нельзя сделать, потому что метод Получить(<Индекс>) работает только в коллекции строк от конкретного уровня от конкретного родителя и такого однозначного индекса, чтобы сразу попасть на нужную строку, в дереве нет. Поэтому возможны два пути, как ты можешь поступить:
1. Либо полностью делаешь добавление нужных строк на клиенте, и для каждой строки делаешь вызов сервера для данных, которых нет на клиенте.
2. Либо строишь полный путь текущей строки из массива индексов дерева и по нему уже ищешь на сервере, либо просто передавай на сервер ключевые поля строки, и по ним ищи в дереве текущую строку, которая оной являлась на форме.Индекс>
Источник
1С 8.3 Дерево значений — Программист 1С Минск. Автоматизация бизнеса.
Дерево Значений в 1С 8.3 — это иерархический динамически набор любого типа. По своим функциям и структуре (колонки и строки) очень схожа с Таблицей Значений, но есть виртуальная колонка «Родитель». Дерево значений рекомендуется использовать для работы именно с иерархической информацией . Каждая строка дерева значений имеет свойства «Родитель» и «Строки», а также может иметь любое количество подчиненных строк. Операции с помощью встроенного функционала (сортировка, раскраска строк, поиск, итоги, различные отборы ) могут производится с учетом подчиненных строк / уровней иерархии.
&НаСервере
Процедура ЗаполнениеРеквизитаФормыДеревоЗначений ()
// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );
// ДеревоЗначений = Новый ДеревоЗначений; — если без реквизита
ДЗ_Корень = ДеревоЗначений . Строки . Добавить ();
ДЗ_Корень . Наименование = «Самый верхний уровень» ;
ДЗ_1уровень = ДЗ_Корень . Строки . Добавить ();
ДЗ_1уровень . Наименование = «1-ая папка (группа)» ;
ЭлементДЗ_1 = ДЗ_1уровень . Строки . Добавить ();
ЭлементДЗ_1 . Наименование = «Первый (вложенный) элемент» ;
ДЗ_2уровень = ДЗ_Корень . Строки . Добавить ();
ДЗ_2уровень . Наименование = «2-ая папка (группа)» ;
ЭлементДЗ_1 = ДЗ_2уровень . Строки . Добавить ();
ЭлементДЗ_1 . Наименование = «Первый (вложенный) элемент» ;
ЭлементДЗ_2 = ДЗ_2уровень . Строки . Добавить ();
ЭлементДЗ_2 . Наименование = «Второй (вложенный) элемент» ;
// Преобразование ДеревоЗначений в реквизит формы (табличное поле)
ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» );
&НаСервере
Процедура ЗаполнениеРеквизитаФормыДеревоЗначенийИзЗапроса ()
Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| Материалы.Ссылка КАК Наименование
| Материалы.Родитель КАК Родитель
|ИЗ
| Справочник.Материалы КАК Материалы
|УПОРЯДОЧИТЬ ПО
| Наименование ИЕРАРХИЯ
|ИТОГИ ПО
| Родитель» ;
//Внимание! Если правильно не указать вид обхода результата выборки по запросу,
//то мы получим обычную таблицу значений
ДеревоЗначений = Запрос . Выполнить (). Выгрузить ( ОбходРезультатаЗапроса . ПоГруппировкамСИерархией );
// Заполнение дерева значений из результата запроса
// колонка «Материалы» – это элемент справочника, колонка «Родитель» – это группа
ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» ); // Преобразование в реквизит формы (табличное поле)
&НаСервере
Процедура ПоискСтрокиВДеревеЗначений () // найдём 1-ю строку со значением «Элемент №1» в дереве значений
// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );
// Поиск строки. (если строка не найдена, вернёт «Неопределено»)
НайденнаяСтрокаДЗ = ДеревоЗначений . Строки . Найти ( «Первый (вложенный) элемент» , «Наименование» , Истина);
// Анализ результата поиска
Если НайденнаяСтрокаДЗ = Неопределено Тогда
Сообщить ( «Строка не найдена» );
Иначе // вренёт первую найденную строку
Сообщить ( «Найдена: » + НайденнаяСтрокаДЗ . Наименование + » (» + НайденнаяСтрокаДЗ . Родитель . Наименование + «)» );
КонецЕсли;
&НаСервере
Процедура ПоискВсехСтрокВДеревеЗначений ()
// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );
// Создаем структуру для поиска (условие)
НаименованиеДляПоиска = «Первый (вложенный) элемент» ;
ПараметрыОтбора = Новый Структура ;
ПараметрыОтбора . Вставить ( «Наименование» , НаименованиеДляПоиска );
// Поиск всех строк содержащих наименование «Первый (вложенный) элемент»
МассивСтрок_ДЗ = ДеревоЗначений . Строки . НайтиСтроки ( ПараметрыОтбора , Истина);
// Проверка найдены ли строки
Если МассивСтрок_ДЗ . Количество () = 0 Тогда
Сообщить ( «Ни одной строкис наименованием » + НаименованиеДляПоиска + » не найдено!» );
КонецЕсли;
// Перебор строк
Для Каждого Строка_ДЗ Из МассивСтрок_ДЗ Цикл
Если Строка_ДЗ . Родитель = Неопределено Тогда
Сообщить ( «Корень дерева значений: » + Строка_ДЗ . Наименование );
Иначе
Сообщить ( Строка_ДЗ . Наименование + » — » + Строка_ДЗ . Родитель . Наименование );
КонецЕсли
&НаСервере
Процедура УдалениеСтрокиИзДереваЗначений ()
// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );
// С помощью данных методов возможно удаление конкретных строк
// Важно! При удалении либо очистки строки — все её подчинённые строки удалятся
// 1.Очистка всех строк
ДеревоЗначений . Строки . Очистить ();
// 2. Удаление по конкретному индексу
ДеревоЗначений . Строки . Удалить ( 0 );
// 3.Или удаление по конкретному наименованию
НайтиСтроку = ДеревоЗначений . Строки . Найти ( » Легированная сталь » , «Наименование» );
Если НЕ НайтиСтроку = Неопределено Тогда
ДеревоЗначений . Строки . Удалить ( НайтиСтроку );
КонецЕсли;
ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» ); // Преобразование в реквизит формы (табличное поле)
Источник