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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Создаю эффект старого дерева

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

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

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

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

Читайте также:  Строй дерево осташковское шоссе

Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа.
Фредерик Брукс-младший

Источник

Дерево значений ; Как по номеру строки получить строку

Господа.
Имеется управляемая форма.
На форме дерево значений.

Использую обработчик события Выбор()
ТаблицаДереваВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Второй параметр возвращает номер выбранной строки.
Теперь надо по этому номеру получить саму строку — ветвь дерева в которую ткнул пользователь.

Если сделать так
ТаблицаДерева.Строки[ВыбраннаяСтрока]
то получим строку нулевого уровня дерева, что не совпадает с тем куда он ткнул.

Вопрос : Как все таки получить строку выбранную пользователем.
Прошу подсказать

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

(0) если нужно получить именно значение колонки, куда щелкнул юзвер, то можно из Поле.Имя вычленить имя колонки нужной и через [] использовать. Может как то проще можно.

Если активирован множественный выбор, тогда да — массив идентификаторов выбранных строк обрабатывать.

Ключ к пониманию — что это не номер строки, а именно идентификатор. И нельзя его использовать как номер. Многие путают, потому что в обычной таблице после начального заполнения идентификаторы могут совпадать с номерами. И тогда это вообще плавающую ошибку дает. Хорошо что в дереве сразу на мине подорвало.

(11) Мне уже ничего не поможет.
Но для события выбора не надо анализировать выбранные строки. Вторым параметром сразу их массив прилетит.
А по ссылке не понял нафига ты так делал:

СтрокаКоллекции = Объект.СоставЗаказа.НайтиПоИдентификатору(Идентификатор); ИндексСтрокиКоллекции = Объект.СоставЗаказа.Индекс(СтрокаКоллекции); МассивВыделеннойНоменклатуры.Добавить(Объект.СоставЗаказа[ИндексСтрокиКоллекции].Номенклатура);
СтрокаКоллекции = Объект.СоставЗаказа.НайтиПоИдентификатору(Идентификатор); МассивВыделеннойНоменклатуры.Добавить(СтрокаКоллекции.Номенклатура);

(13) В случае дерева на форме «данные строки» — это и будет ссылка на строку дерева (т.е. собственно строка).

Источник

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