1с управляемые формы текущая строка дерева значений

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

На форме есть дерево значений. В серверной процедуре мне необходимо определять текущие данные. Отрабатывает нормально, но только до тех пор, пока стока не станет подчинённой. Например у меня 5 строк, а в первой строке ещё несколько строк. И у вложенной первой строки переменная ТекущаяСтрока = 8. И тогда Текущие данные будет = Неопределено. Это неправильно. Помогите разобраться.

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

(1) Текущую строку надо получать на клиенте и передавать идентификатор на сервер. А на сервере уже обрабатывать.

(8) При передачи с клиента на контекстный серверный вызов происходит передача всего контекста формы на сервер. Что там будет с текущей строкой и как она связана именно с текущей строкой, который ты видишь? Так что получай идентификатор строки на клиенте и передавай его на сервер.

(13) Попробовал передать с клиента на сервер. На клиенте тот же самый идентификатор строки = 8. Хотя строк всего 8, должны быть идентификаторы от 0 до 7.

(18) Да я вот уже выяснил, что идентификатор строки никак не связан с её номером и количеством строк)

(1) Все прекрасно работает. Может у вас конфликт пространств имен или еще какая-нить чехарда. Попробуйте поменять имена переменных для начала и на простейшей тестовой обработке попробуйте воспроизвести проблему.

ТекущиеДанные = Элементы.МоеДерево.ТекущиеДанные

(6) Из текущих данных получай идентификатор строки и ищи на сервере. Но ты так и не ответил, откуда берешь данные для построения дерева.

(9) Данные берутся из базы данных в процедуре ПриСоздании на сервере. А вопрос связан уже совсем с другим с событием ПриАктивизацииСтроки (другого дерева), но это и не должно быть важно.
Так вот, по идентификатору строки не сервере и не получается. Он находит идентификатор текущей строки = 8, но такой строки не существует. То есть МоеДерево.НайтиПоИдентификатору(ИдентификаторСтроки) будет равно Неопределено.

(10) Возможно, чертовщина происходит из-за того, что делаете контекстный серверный вызов в событии ПриАктивизацииСтроки.

(11) Как избавиться от этой чертовщины? Должен же быть способ получить на сервере данные текущей строки, имея весь контекст формы.

(15) Подключить обработчик ожидания с последующим контекстным серверным вызовом. И как сказал (13), идентификатор лучше получать на клиенте. Его можно сохранять в клиентскую переменную модуля.

Согласен. Только реквизит формы МоеДерево надо перед этим превратить в значение. Ну а после манипуляций — обратно.

Читайте также:  Тумба акватон дакота 80 выбеленное дерево

(12) Пока не определишься из каких данных строишь дерево и что хочешь изменить, программировать бессмысленно и невозможно.

Если бы вы в дереве создали и заполнили уникальными значениями реквизит «КлючСтроки» (условно), то у вас не было бы проблем найти строку по этому ключу хоть на клиенте, хоть на сервере.

(17) Интересное решение. А не будет ли это велосипедом? Может получить текущую строку всё-таки можно как-то с помощью платформы? Или хотя бы через БСП? Интуиция подсказывает, что такая простая задача как «Получить текущие данные» уже избита и должна решаться простым способом.

(19) Кажется, это стандартный велосипед, если дерево хранится в табличной части документа. Чтобы такую табличную часть отобразить в виде дерева нужны 2 реквизита КлючСтроки и КлючСвязи. Функции работы с деревом можно поместить в общий модуль с флагами Клиент, Сервер. Например,

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

Источник

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.Или удаление по конкретному наименованию
НайтиСтроку = ДеревоЗначений . Строки . Найти ( » Легированная сталь » , «Наименование» );
Если НЕ НайтиСтроку = Неопределено Тогда
ДеревоЗначений . Строки . Удалить ( НайтиСтроку );
КонецЕсли;

ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» ); // Преобразование в реквизит формы (табличное поле)

Источник

Дерево значений в УФ и текущая строка

На форме есть дерево значений, у которого есть колонка «Документ». Есть реквизит формы, в который я периодически пихаю ссылку на документ. Как мне спозиционировать курсор на нужной мне строке, если я знаю значение колонки «документ», соответственно строку могу вычислить, но как?
Нужно получить идентификатор строки, как мне его получить зная значение одной из колонок?

Читайте также:  Чайное дерево от соплей

Я чего то моз сломал.
Элементы.Дерево.ТекущаяСтрока=Ссылка
Элементы.Список.ТекущаяСтрока=Ссылка

Что сделать то нужно? Сформулируй как нибудь по другому.

Элементы.СписокЗаявокНаПродажу.ТекущаяСтрока = «Вот сюда нужно вставить ИдентификаторСтроки»

А вот как мне его получить, на клиенте или на сервере, думаю что на сервере, так как перебрать дерево значений на клиенте не представляется возможным.

Есть СписокЗаявокНаПродажуРеквизит с типом ДанныеФормыДерево, как в нем найти нужную мне строку, каким методом?

работает только с Таблицей формы, источник которой таблица базы данных, причем у Дин. списка установлена основная таблица

Если таблица формы — это произвольное именно дерево значений, а не иерархический список дин. списка с основной таблицей, то на

клиенте — получить идентифиактор строки можно только перебором
сервере — получить идентифиактор строки можно перебором или конвертаций данных формы дерева в значение дерева значений и поиска элемента методами Дз и последующим определением айди строки

(5) «клиенте — получить идентифиактор строки можно только перебором «, что нужно перебирать на клиенте, реквизит формы? Как? Он то заполнен, но там тип ДанныеФормыДерево

двоешники, где вы видели в сущностях

ДанныеФормыДерево — весь образ дерева на УФ
или
ДанныеФормыКоллекцияЭлементовДерева — узел(ветка) дерева на УФ

(12) получаю одну строку дерева, корень..
то есть СписокЗаявокНаПродажуРеквизит.ПолучитьЭлементы() получает только корневую строку с типом ДанныеФормыКоллекцияЭлементовДерева

(15) нет мань, ты точно ляпнул. в vmv все правильно сказал, уже разобрался, теперь надо плядское дерево перебирать в рекурсии(((

(18) истерики, упрямство, отсутствие логики, обидчивость — явно не мужкие черты.

Это элементарная дедукция)

(16) дурак чтоли. для активации строки дерево перебирать.
Я собствено говоря и написал — кто мешает найти строку методом, получить ее идентификатор и после этого использовать активацию.
тут влез педик, ты его поддержкал и решил делать рекурсию. пипец.

тырено с БСП специально для девочек

// Получает идентификатор (метод ПолучитьИдентификатор()) строки дерева значений для заданного значения поля строки дерева.
// Используется для позиционирования курсора в иерархических списках.
//
Процедура ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементовДерева, КлючСтроки, ПрекратитьПоиск) Экспорт

Для Каждого СтрокаДерева ИЗ КоллекцияЭлементовДерева Цикл

Если ПрекратитьПоиск Тогда
Возврат;
КонецЕсли;

Если СтрокаДерева[ИмяПоля] = КлючСтроки Тогда

Если КоллекцияЭлементов.Количество() > 0 Тогда

ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементов, КлючСтроки, ПрекратитьПоиск);

(20) еще раз спрашиваю метод НайтиСтроки() это метод какого объекта? С радостью его использую, если объяснишь как.

(23) дерева. с синтаксис помощником не дружишь?

(24) Где ж мне дерево взять? Есть Реквизит формы с типом ДанныеФормыДерево, как мне из него дерево вытянуть?

Источник

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