Запрет автоматического сворачивания дерева значений. 1С 8.3
1С 8.3. Работаю с деревом значений на управляемых формах.
Заполняю дерево данными в иерархическом виде. По каждой строке можно вводить суммы, которые суммируются в общий итог. После, для записи данных из прикладного объекта в данные формы, использую процедуру ЗначениеВРеквизитФормы().
Так вот, после выполнения ЗначениеВРеквизитФормы(), дерево сворачивается. Как сделать так, чтобы дерево не сворачивалось, ну и позиционирование оставалась на прежнем месте.
вызвать что-то вроде Элементы.ДеревоНоменклатуры.Развернуть(0, Истина); после ЗначениеВРеквизитФормы().
Не понятно зачем в принципе использовать ЗначениеВРеквизитФормы(). Когда в форме должен быть реквизит с типом ДеревоЗначений, вот им и надо пользоваться. Реквизит1.ПолучитьЭлементы() — и так далее.
(3) Возможно я чего-то не до понимаю. Но ЗначениеВРеквизитФормы() использую для того, чтобы подсчитанные суммы отобразились на форме. Если есть другой способ, подскажите пожалуйста.
вызвать что-то вроде Элементы.ДеревоНоменклатуры.Развернуть(0, Истина); после ЗначениеВРеквизитФормы()
Да, так и сделал в итоге. Но теперь проблема с позиционированием текущей строки. То есть, после ввода некой суммы, курсор перескакивает на самый вверх. Частичном решением помог этот код:
Элементы.ДеревоЗначений.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор();
Нужная строка выделяется, но вместе с ней выделенным становится и самый верхний узел дерева.
Все эти операции я провожу в событии дерева «ПриОкончанииРедактирования()». Если вынести в отдельную. кнопку, с позиционированием проблем нет. Одним словом, как побороть эту проблему ?
У меня эта же проблема: То есть, после ввода некой суммы, курсор перескакивает на самый вверх. Как вы ее решили?
Нужно написать на клиенте, после вызова серверной процедуры:
Строка = Элементы.ДеревоЗначений.ТекущаяСтрока;
Элементы.ДеревоЗначений.Развернуть(Строка, Истина);
&НаСервере Процедура ОбновитьДанныеНаСервере() Дерево = ДанныеФормыВЗначение(ДП, Тип("ДеревоЗначений")); ПровестиВычисления(Дерево, . ); СинхронизироватьДеревоФормы(Дерево, ДП.ПолучитьЭлементы()); КонецПроцедуры &НаСервере Процедура СинхронизироватьДеревоФормы(ДеревоИсточник, ЭлементыДереваФормы); // если могли добавиться новые строки Пока ДеревоИсточник.Строки.Количество() > ЭлементыДереваФормы.Количество() цикл ЭлементыДереваФормы.Добавить(); КонецЦикла; // собственно перенос значений из расчётного дерева в форму для Ном = 0 по ДеревоИсточник.Строки.Количество()-1 цикл ЗаполнитьЗначенияСвойств(ЭлементыДереваФормы[Ном], ДеревоИсточник.Строки[Ном]); если ДеревоИсточник.Строки[Ном].Строки.Количество() > 0 тогда СинхронизироватьДеревоФормы(ДеревоИсточник.Строки[Ном], ЭлементыДереваФормы[Ном].ПолучитьЭлементы()); КонецЕсли; КонецЦикла; КонецПроцедуры
Скрыть и показать произвольную колонку Дерева значений после вызова ЗначениеВРеквизитФормы в моем случае помогло
Элементы.ДЗТоварыКоличество.Видимость = Ложь; Элементы.ДЗТоварыКоличество.Видимость = Истина;
Ну и свойство Начальное отображение дерева должно быть установлено в Раскрывать все уровни или Раскрывать верхний уровень
Источник
Работа с деревом значений
Доброе утро, у кого-то уже день. Сразу сто раз извиняюсь за глупые вопросы.
Как в дереве значений добавить колонку?
Пишу так:
Если ПолучатьЦены Тогда
ДеревоОстатков.Колонки.Добавить(«Номенклатура»);
СтрокаНоменклатуры = ДеревоОстатков.Строки.Добавить();
Пока ПолучисьЦенушка.Следующий() Цикл
ЗаполнитьПоляСумм(СтрокаСклад, ПолучисьЦенушка, СписокЦенОстатков, КурсыВалют);
Выдает ошибку — «Ошибка при вызове метода контекста «Добавить»»
(0)Сделать то что хочешь?
Обычные управляемые формы?
Дерево будешь фомировать или это режим отображения табличного поля?
И в догонку вопрос, как скрыть колонку дерева значений? Пишу
ДеревоОстатков.ХарактеристикаСклад.Видимость — Ложь;
Тоже выдает ошибку, что поле не обнаружено.
У меня выборка по складам идет. Раньше задача стояла — показывать плановую цену, только той номенклатуре которая есть на складе. Теперь нужно чтобы цена выходила на все.
Поэтому условие — если остатка на складе нет — то добавляем колонку — номенклатура в ней выводим номенклатуру и рядом цену, а колонку «Склад» прячем.
(12) Хорошо — пусть не видимость. Тогда вернемся к первому вопросу. Как создать столбец, т.е. колонку.
ДеревоЗначений (ValueTree)
Свойства:
Колонки (Columns)
Строки (Rows)
ВыбратьСтроку (ChooseRow)
Скопировать (Copy)
Используется для доступа к свойствам и методам дерева значений в целом.
Объект, представляющий собой древовидную структуру, обладает сходной функциональностью с таблицей значений, а также обладает возможностью добавлять подчиненные строки к какой-либо строке дерева.
Внимание! В толстом клиенте (обычное приложение) передача значений данного типа с клиента на сервер и обратно приводит к возникновению исключения.
Сервер, толстый клиент, внешнее соединение.
Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO: ValueTree
Пример:
ДеревоРезультатов = Новый ДеревоЗначений;
Для Каждого Колонка ИЗ ТаблицаРезультатов.Колонки Цикл
ДеревоРезультатов.Колонки.Добавить(Колонка.Имя);
КонецЦикла;
ДеревоЗначений, метод Скопировать
РезультатАнализаДанныхПоискАссоциаций, метод ВыгрузитьПравила
СтрокаДереваЗначений, метод Владелец
(15) На форме есть дерево значений — ОстаткиДляНовогоКлиента. В функции
Функция СоздатьКолонкиДереваОстатков(ТаблицаПоиска = Неопределено, ВсеТипыЦен = Ложь) Экспорт
ДеревоОстатков = Новый ДеревоЗначений;
МассивБазовыхТиповЦен = Новый Массив;
МассивРасчитываемыхЦен = Новый Массив;
СформироватьМассивБазовыхТиповЦен(ТаблицаПоиска, МассивБазовыхТиповЦен, МассивРасчитываемыхЦен, ВсеТипыЦен);
ДеревоОстатков.Колонки.Добавить(«ХарактеристикаСклад», Новый ОписаниеТипов(«СправочникСсылка.ХарактеристикиНоменклатуры,СправочникСсылка.Склады»));
//ДеревоОстатков.Колонки.Добавить(«Номенклатура», Новый ОписаниеТипов(«Строка»));
ДеревоОстатков.Колонки.Добавить(«ГВ», Новый ОписаниеТипов(«СправочникСсылка.ГодВыпуска»));
ДеревоОстатков.Колонки.Добавить(«МестоХранения» , Новый ОписаниеТипов(«Строка»));
ДеревоОстатков.Колонки.Добавить(«Общий» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
ДеревоОстатков.Колонки.Добавить(«Свободный» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
ДеревоОстатков.Колонки.Добавить(«СвободныйОжидаемый» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
ДеревоОстатков.Колонки.Добавить(«ВРезерве» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
// Тут колонки добавляются в том порядке в котором они идут в списке типов цен
Если МассивБазовыхТиповЦен.Количество() > 0 Тогда
// колонки для Каждого типа цены
Для Каждого Элемент Из МассивБазовыхТиповЦен Цикл
ПрефиксИмени = ОпределитьПрефиксИмениКолонки(ТаблицаПоиска, Элемент);
СоздатьКолонкиСуммДерево(ДеревоОстатков, ПрефиксИмени);
КонецЦикла;
Для Каждого Элемент Из МассивРасчитываемыхЦен Цикл
ПрефиксИмени = ОпределитьПрефиксИмениКолонки(ТаблицаПоиска, Элемент);
СоздатьКолонкиСуммДерево(ДеревоОстатков, ПрефиксИмени);
КонецЦикла;
Источник
Можно ли некоторые элементы дерева значений сделать не видимыми
Не смог понять по справке. Пытаюсь придумать где что хранить и как обрабатывать.
Дерево создал, часть элементов не имеют дочерних значений и по сути мне нужны для дальнейшей обработки, анализу так сказать.
Можно ли сделать их не видимыми?
Можно. Добавить колонку в которую проставить галочку «показывать/не показывать» и установить отбор.
Но сразу предупреждаю — вы не сможете добавить ни одной строчки, они сразу же будут скрываться по условиям отбора. Оно вам надо?
(2)Строго говоря строк добавлять не планирую, а вот с данными скрытых строк работать нужно будет, изменять их
Можно будет?
И еще — я хотел контекстное меню использовать на элементах формы, что то не увидел возможности добавить этот элемент
(14) Тема как называется? Так мы сейчас и до лечения геморроя доберемся. Ищи «Условное оформление управляемых форм», и крась что душе угодно.
ЭтотОбъект.УсловноеОформление.Элементы.Очистить(); // Видимость строк ЭлементУО = УсловноеОформление.Элементы.Добавить(); Отбор = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); //ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе; //Отбор = ГруппаОтбораРейс.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Прог_Дерево.ТипСтрокиСостава"); Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; Отбор.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Перечисления.ТипыСтрокСоставаСпецификации.Материал"); // Видимость строк: ОтборГрузополучатель Для Каждого Элемент Из ЭтотОбъект.Элементы.Прог_Дерево.ПодчиненныеЭлементы Цикл ПолеУО = ЭлементУО.Поля.Элементы.Добавить(); ПолеУО.Поле = Новый ПолеКомпоновкиДанных(Элемент.Имя); КонецЦикла; ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
Источник
Дерево значений
Создал дерево значений, мне необходимо добавить Иерархический вид, например по Номенклатуре. В моем случае идет создание строк по типо родитель-поле-поле-поле, а нужно в виде родитель-поле, родитель-поле. Как можно правильно настроить дерево и где, чтобы можно было строить дерево в таком виде? Т.е. нужна группировка по определенному полю, в этой группе может быть несколько строк, но при этом можно создавать несколько групп различных
МоеДерево = Новый ДеревоЗначений; МоеДерево.Колонки.Добавить("Номенклатура"); МоеДерево.Колонки.Добавить("ИмяРеквизита"); МоеДерево.Колонки.Добавить("ЗначениеРеквизита"); Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура; СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю СтрокаПодчиненная.Номенклатура = "-"; СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код; СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование; КонецЦикла;
МоеДерево = Новый ДеревоЗначений; МоеДерево.Колонки.Добавить("Номенклатура"); МоеДерево.Колонки.Добавить("ИмяРеквизита"); МоеДерево.Колонки.Добавить("ЗначениеРеквизита"); Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура; СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю СтрокаПодчиненная.Номенклатура = "-"; СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код; СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование; КонецЦикла;
Делайте программно. Это позволит избежать ограничений и условностей автоматически созданных деревьев, созданных, к примеру, из результата запроса.
— У дерева значений должна быть колонка с уникальными идентификаторами строк. Без него никак.
— Так же желательно иметь еще одну колонку, с глубиной уровня строки. Пригодится во многом, например — сл. пункт
— На различных уровнях вложенности часто нужно скрыть колонки. Тут хорошо работает условное оформление УФ. По значению в строке скрываете видимость колонки — в итоге у родителя видно наименование, а у подчиненных строк вместо наименования, в этой же колонке, можно показывать описание или дополнительную информацию
А в целом работа с ДЗ — тот еще гемор, поэтому в сложных коллекциях в для хранения значений используется обычная таблица значений, данные которой «красиво» отображаются на форме в отдельном объекте — дереве значений.
&НаСервере Процедура ПолучитьДеревоНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Родитель КАК Родитель, | Номенклатура.Ссылка КАК Номенклатура |ИЗ | Справочник.Номенклатура КАК Номенклатура |ИТОГИ ПО | Родитель"; ДеревоЗнач = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ЗначениеВРеквизитФормы(ДеревоЗнач, "ДЗ"); КонецПроцедуры &НаКлиенте Процедура ПолучитьДерево(Команда) ПолучитьДеревоНаСервере(); КонецПроцедуры
&НаКлиенте Процедура СформироватьДерево(Команда) СформироватьДеревоНаСервере(); КонецПроцедуры &НаСервере Процедура СформироватьДеревоНаСервере() Запрос = Новый Запрос( "ВЫБРАТЬ | Т.Ссылка КАК Ссылка, | Т.Родитель КАК Родитель |ИЗ | Справочник.Номенклатура КАК Т"); ТЗ = Запрос.Выполнить().Выгрузить(); ТЗ.Индексы.Добавить("Родитель"); ДобавитьСтрокиДереваРекурсивно(ТЗ, Дерево, Справочники.Номенклатура.ПустаяСсылка()); КонецПроцедуры &НаСервере Процедура ДобавитьСтрокиДереваРекурсивно(ТЗ, СтрокаДерева, Родитель) МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Родитель", Родитель)); Строки = СтрокаДерева.ПолучитьЭлементы(); Для Каждого Стр Из МассивСтрок Цикл НоваяСтрока = Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр); ДобавитьСтрокиДереваРекурсивно(ТЗ, НоваяСтрока, Стр.Ссылка) КонецЦикла; КонецПроцедуры
Источник