1с при активизации строки дерева

Как активизировать ячейку дерева значений на управляемой форме ?

Делаю программный ввод строки первого уровня (стандартная кнопка добавить добавляет только 1 строку первого уровня и потом добавляет в сроки в выделенного родителя а мне надо несколько строк первого уровня) в ДеревоЗначений (Колонки Номеклатура,Количесво) в управляемой форме

&НаКлиенте
Процедура ДобавитьКомплект(Команда)
НоваяСтрока= ДеревоКомплектов.ПолучитьЭлементы();
ПодСтрк=НоваяСтрока.Добавить();
Элементы.ДеревоКомплектов.ТекущийЭлемент=Элементы.ДеревоКомплектов.ПодчиненныеЭлементы.ДеревоКомплектовНоменклатура;
ОбновитьОтображениеДанных();
КонецПроцедуры

После этого в ДЗ вводиться строка но в режим редактирования поля не входит.

Делал Элементы.ДеревоКомплектов.ИзменитьСтроку() тоже не срабатывает.

Как сделать так что бы после программного ввода строки активизировалась последняя введенная строка и входила сразу в режим редактирования поля Номенклатура (на форме ДеревоКомплектовНоменклатура)?

Неужели никто не сталкивался с вводом данных в дерево значений в управляемой форме! Может есть идеи как ввести несколько строк первого уровня , т.К. проблема заключается в том что привязанная кнопка Добавить в командной панели добавляет только одну строку первого уровня и потом все нажатия на эту кнопку приводят К вводу строк привязанных е выбранному Родителю?

Попробовал. Не становиться активной. Когда нажимаю на кнопку (ввожу первую строку), даже таблица не становиться активной — то есть первая строка появляется в ней, но курсор на первую строку не встает. И при вводе последующих строк тоже строки на первом уровне появляются. но курсор ни на одну не встает. Если вручную кликаеш на строку, вы строка выделяется, но если кнопку ввода нажимаешь курсор остается на той строке которую вручную выделил.

(5) он делает строку 2 уровня
(4) Элементы.ДеревоКомплектов.ТекущийЭлемент=НоваяСтрока.ПолучитьИдентификатор() так пробни.

Так, дело пошло 🙂 Сделал
НоваяСтрока= ДеревоКомплектов.ПолучитьЭлементы();
ПодСтрк=НоваяСтрока.Добавить();
Элементы.ДеревоКомплектов.ТекущаяСтрока = ПодСтрк.ПолучитьИдентификатор();

курсор поствился на текущую строку а дальше дело техники 🙂

&НаКлиенте
Процедура ДобавитьКомплект(Команда)
НоваяСтрока= ДеревоКомплектов.ПолучитьЭлементы();
ПодСтрк=НоваяСтрока.Добавить();
Элементы.ДеревоКомплектов.ТекущаяСтрока = ПодСтрк.ПолучитьИдентификатор();
Элементы.ДеревоКомплектов.ИзменитьСтроку();
КонецПроцедуры

В итоге по нажатию кнопки вводиться новая строка первого уровня (без родителя) становиться активной и входит в режим редактирования первой колонки

Источник

УФ: Установить текущую строку дерева значений

Всем привет! Суть задачи в следующем
Имеется механизм назначения на смену, в определенный цех исполнителей(бригад). Бригада состоит из сотрудников. В течении смены можно менять состав бригады(а не бригаду).
Создана форма подбора бригад и сотрудников(типо слева дерево бригад,где на верхем уровне — статус(свободна/занята), а на нижнем — сама бригада, при выборе бригады справа заполняется таблица значений, где перечисляется состав бригады). При открытии в нее передается текущая бригада(справочник.ссылка).
Возможно ли, после заполнения дерева бригад установить текущую строку по переданной текущей бригаде?
Что дерево бригад, что таблица её состава — реквизиты формы

Читайте также:  Какие деревья обрабатывают медным купоросом

(1) То есть на сервере, после выгрузки результата запроса в дерево, получить строку по текущей бригаде. А на клиенте уже установить её текущей?

Обходом находишь строку дерева с нужной бригадой и потом
Элемент.ТекущаяСтрока = СтрокаДерева.ПолучитьИдентификатор()

(3) Сделал что-то подобное.
&НаКлиенте
Процедура ОбновитьБригады()
СтрокаБригады = неопределено;
ОбновитьБригадыНаСервере(СтрокаБригады);
Элементы.Бригады.ТекущаяСтрока = СтрокаБригады;//Бригады.НайтиПоИдентификатору(СтрокаБригады.ПолучитьИдентификатор());
КонецПроцедуры

Процедура ОбновитьБригадыНаСервере передает в СтрокаБригады — найденную строку дерева. Только возникает ошибка
«Отсутствует отображение для типа ‘СтрокаДереваЗначений'» — похоже, нужно создавать реквизит формы «СтрокаБригады» и передавать это значение через ЗначениеВРеквизитФормы() — но как-то стремно выглядит

получается, что строка дерева значений доступна нам на сервере. А метод, устанавливающий текущую строку — на клиенте.

НайденнаяСтрокаБригады = Неопределено; Для Каждого СтрокаСтатуса Из Дерево.ПолучитьЭлементы() Цикл Для Каждого СтрокаБригады Из СтрокаСтатуса.ПолучитьЭлементы() Цик Если СтрокаБригады.Бригада = ИскомаяБригада Тогда НайденнаяСтрокаБригады = СтрокаБригады; Прервать; КонецЕсли; КонецЦикла; Если НайденнаяСтрокаБригады <> Неопределено Тогда Прервать; КонецЕсли; КонецЦикла; Элементы.Дерево.ТекущаяСтрока = НайденнаяСтрокаБригады.ПолучитьИдентификатор();

(11) На клиенте дерева значений нет. Оно трансформируется в ДанныеФормыДерево, у которого узлами ДанныеФормыЭлементДерева. Забей это в СП и посмотри свойства/методы.

Для всех древовидных объектов реализовал универсальные функции получения адреса (Дерево_ПутьСтрокойЛкс) и нахождения по этому адресу строки дерева (Дерево_НайтиПоПутиСтрокойЛкс).
Правда для тонкого клиента не расставлял экранирование недоступных типов.
В частности задачу (0) можно решить так
1. Найти в дереве значений на сервере нужную строку например через ДеревоЗначений.НайтиСтроки(Отбор, Истина)
2. Найти ту же строку в проекции этого дерева в реквизит формы. НайденнаяСтрока = Дерево_НайтиПоПутиСтрокойЛкс(ДеревоФормы, «», Дерево_ПутьСтрокойЛкс(СтрокаДерева, «»))
3. Элементы.Дерево.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор()

// Параметры:
// ИмяКолонки — Строка — если задать пустое значение, то будет использован индекс строк дерева
// ИгнорироватьПростойПервыйУровень — Булево — если на первом уровне только одна строка, то игнорировать ее
Функция Дерево_ПутьСтрокойЛкс(СтрокаДерева, ИмяКолонки = «Имя», ИгнорироватьПростойПервыйУровень = Ложь, Разделитель = «.», Дерево = Неопределено, Исключения = Неопределено) Экспорт

Читайте также:  Декор коряг от деревьев

Если Не ЗначениеЗаполнено(ИмяКолонки) Тогда
Родитель = РодительСтрокиДереваЛкс(СтрокаДерева, Дерево);
Если Ложь
Или ТипЗнч(Родитель) = Тип(«ДеревоЗначений»)
Или ТипЗнч(Родитель) = Тип(«СтрокаДереваЗначений»)
Тогда
Результат = Родитель.Строки.Индекс(СтрокаДерева);
ИначеЕсли Ложь
Или ТипЗнч(Родитель) = Тип(«ОтборКомпоновкиДанных»)
Или ТипЗнч(Родитель) = Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»)
Или ТипЗнч(Родитель) = Тип(«ДоступныеПоляКомпоновкиДанных»)
Или ТипЗнч(Родитель) = Тип(«ДоступноеПолеКомпоновкиДанных»)
Или ТипЗнч(Родитель) = Тип(«ДоступноеПолеОтбораКомпоновкиДанных»)
Тогда
Результат = Родитель.Элементы.Индекс(СтрокаДерева);
ИначеЕсли Ложь
Или ТипЗнч(Родитель) = Тип(«ДанныеФормыДерево»)
Или ТипЗнч(Родитель) = Тип(«ДанныеФормыЭлементДерева»)
Тогда
Результат = Родитель.ПолучитьЭлементы().Индекс(СтрокаДерева);
Иначе
ВызватьИсключение «Неподдерживаемый тип элемента дерева — » + ТипЗнч(Родитель);
КонецЕсли;
Иначе
Если Исключения <> Неопределено Тогда
Для Каждого Структура Из Исключения Цикл
Если СравнитьЗначенияСвойствЛкс(СтрокаДерева, Структура, Структура.СвойстваДляСравнения) Тогда
Результат = Структура[ИмяКолонки];
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Результат = Неопределено Тогда
Результат = СтрокаДерева[ИмяКолонки];
КонецЕсли;
КонецЕсли;
Попытка
Родитель = СтрокаДерева.Родитель;
Исключение
Родитель = СтрокаДерева.ПолучитьРодителя();
КонецПопытки;
Если Родитель = Неопределено Тогда
Если Истина
И ИгнорироватьПростойПервыйУровень
И СтрокаДерева.Владелец().Строки.Количество() = 1
Тогда
Результат = Неопределено;
КонецЕсли;
Иначе
РезультатСверху = Дерево_ПутьСтрокойЛкс(Родитель, ИмяКолонки, ИгнорироватьПростойПервыйУровень, Разделитель, Дерево, Исключения);
Если РезультатСверху <> Неопределено Тогда
Результат = РезультатСверху + Разделитель + Результат;
КонецЕсли;
КонецЕсли;
Возврат XMLСтрока(Результат);

// Параметры:
// ИмяКолонки — Строка — если задать пустое значение, то будет использован индекс строк дерева
// ИгнорироватьПростойПервыйУровень — Булево — если на первом уровне только одна строка, то игнорировать ее
Функция Дерево_НайтиПоПутиСтрокойЛкс(СтрокаДерева, ИмяКолонки = «Имя», Путь, ИгнорироватьПростойПервыйУровень = Ложь) Экспорт

Если Истина
И ИгнорироватьПростойПервыйУровень
И ТипЗнч(СтрокаДерева) = Тип(«ДеревоЗначений»)
И СтрокаДерева.Строки.Количество() = 1
Тогда
Возврат Дерево_НайтиПоПутиСтрокойЛкс(СтрокаДерева.Строки[0], ИмяКолонки, Сред(Путь, 2));
КонецЕсли;
ТекущийУровень = ПервыйФрагментЛкс(Путь);
Если Не ЗначениеЗаполнено(ТекущийУровень) Тогда
Возврат СтрокаДерева;
КонецЕсли;
ОстальнойПуть = Сред(Путь, СтрДлина(ТекущийУровень) + 2);
Если Не ЗначениеЗаполнено(ИмяКолонки) Тогда
ЗначениеИндекса = Число(ТекущийУровень);
Если Ложь
Или ТипЗнч(СтрокаДерева) = Тип(«ДеревоЗначений»)
Или ТипЗнч(СтрокаДерева) = Тип(«СтрокаДереваЗначений»)
Тогда
Если СтрокаДерева.Строки.Количество() > ЗначениеИндекса Тогда
ТекущаяСтрока = СтрокаДерева.Строки[ЗначениеИндекса];
КонецЕсли;
ИначеЕсли Ложь
Или ТипЗнч(СтрокаДерева) = Тип(«ОтборКомпоновкиДанных»)
Или ТипЗнч(СтрокаДерева) = Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»)
Или ТипЗнч(СтрокаДерева) = Тип(«ДоступныеПоляКомпоновкиДанных»)
Или ТипЗнч(СтрокаДерева) = Тип(«ДоступноеПолеКомпоновкиДанных»)
Или ТипЗнч(СтрокаДерева) = Тип(«ДоступноеПолеОтбораКомпоновкиДанных»)
Тогда
Если СтрокаДерева.Элементы.Количество() > ЗначениеИндекса Тогда
ТекущаяСтрока = СтрокаДерева.Элементы[ЗначениеИндекса];
КонецЕсли;
ИначеЕсли Ложь
Или ТипЗнч(СтрокаДерева) = Тип(«ДанныеФормыДерево»)
Или ТипЗнч(СтрокаДерева) = Тип(«ДанныеФормыЭлементДерева»)
Тогда
Если СтрокаДерева.ПолучитьЭлементы().Количество() > ЗначениеИндекса Тогда
ТекущаяСтрока = СтрокаДерева.ПолучитьЭлементы()[ЗначениеИндекса];
КонецЕсли;
Иначе
ВызватьИсключение «Неподдерживаемый тип элемента дерева — » + ТипЗнч(СтрокаДерева);
КонецЕсли;
Иначе
Если Ложь
Или ТипЗнч(СтрокаДерева) = Тип(«ДанныеФормыДерево»)
Или ТипЗнч(СтрокаДерева) = Тип(«ДанныеФормыЭлементДерева»)
Тогда
ТекущаяСтрока = Неопределено;
ДочерниеЭлементы = СтрокаДерева.ПолучитьЭлементы();
Для Каждого ДочернийЭлемент Из ДочерниеЭлементы Цикл
Если ДочернийЭлемент[ИмяКолонки] = ТекущийУровень Тогда
ТекущаяСтрока = ДочернийЭлемент;
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
ТекущаяСтрока = СтрокаДерева.Строки.Найти(ТекущийУровень, ИмяКолонки);
КонецЕсли;
КонецЕсли;
Если ТекущаяСтрока <> Неопределено Тогда
Возврат Дерево_НайтиПоПутиСтрокойЛкс(ТекущаяСтрока, ИмяКолонки, ОстальнойПуть);
Иначе
Возврат СтрокаДерева;
КонецЕсли;

Читайте также:  Граф является деревом тогда

Источник

Вывод дерева группы номенклатуры

Хочется сделать так, чтобы отражалось место выбранной карточки в иерархии группы Номенклатуры. Например, для чашек петри PL90-A3 – это «Прочий пластик». Сейчас наоборот – выбираю группу в дереве, левая часть столбца отфильтровывается, а при выборе конкретной карточки в «номенклатуре» дерево не раскрывается. А должно быть так (Фото).

Данный обьект — обработка. Там есть ссылка на общий модуль «ПодборТоваровКлиент».
Но данный код как раз при инициализации группы выводит список карточек.
А наоборот — понимаю уже подобной опции в модулях нет. Как реализовать можно данную идею?

Я правильно понимаю, что вы хотите сделать:
при активизации строки дерева (справа) происходит фильтрация объектов в списке (слева), а при активизации строки списка (слева) происходит программная активация строки дерева (справа)?
В таком случае у вас будет зацикливание при активизации строк списка и дерева. Необходимо будет завести переменные, которые будут контролировать искать ли группу (или фильтровать ли записи в списке) при активации строки.
Что касается поиска группы в дереве, то необходимо будет при активизации строки в списке вызывать процедуру поиска в дереве по родителю если я правильно понял (можно на клиенте) с рекурсивным вызовом. И при нахождении делать текущую строку активной и прекращать поиск.

(2)
да, все верно Вы поняли.
существует ли вообще на этом сервисе подобная чья-то разработка, вдруг знаете? так как с программным кодом пока не совсем разобрался.

(3)
Я тут недавно зарегистрировался, возможно что-то есть. В своей практике с таким сталкивался один раз, но задача стояла немного другая. В типовых решениях в последнее время копаюсь мало, но тоже не помню, чтобы такое было.

Добавляем флажок на форму Фильтр, он будет отвечать за реакцию. При снятом флажке в обработчике активации строки в левом списке будем позиционировать на нужную группу кодом

СписокИерархииНоменклатуры.ТекущаяСтрока = Номенклатура.Родитель;

При установленном флажке наоборот при выборе строки дерева устанавливаем фильтр на список номенклатуры

Источник

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