Управляемые формы дерево значений загрузить

ДеревоЗначений.Строки
Метод ЗагрузитьКолонку()

Метод ЗагрузитьКолонку() копирует значения в колонку коллекции строк дерева значений из массива. Значения из массива загружаются в порядке следования индексов.

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Пример использования

Пример кода с использованием метода ЗагрузитьКолонку() :

мЗначения = Новый Массив; мЗначения.Добавить("Стол деревянный"); мЗначения.Добавить("Стул деревянный"); //создание нового дерева значений ДеревоЗначений = Новый ДеревоЗначений; //добавляем колонки ДеревоЗначений.Колонки.Добавить("Наименование"); ДеревоЗначений.Колонки.Добавить("КодТовара"); //метод ЗагрузитьКолонку не добавляет строки //поэтому перед заполнением добавим строки в коллекцию Для Инд = 0 По мЗначения.ВГраница() Цикл ДеревоЗначений.Строки.Добавить(); КонецЦикла; //потом загрузим значения ДеревоЗначений.Строки.ЗагрузитьКолонку(мЗначения, "Наименование"); 

Читайте также:

Источник

Дерево значений на форме

рубрики: Работа с формами | Дата: 12 ноября, 2016
Скачать обработку с примерами из статьи: professia1c_TreeValue.epf
Платформа: 8.3; Тип формы: управляемая.

В этой статье рассмотрим как можно выгружать результат запроса в
дерево значений на форме. Разберем этот вопрос как для обычных,
так и для управляемых форм.
В некоторм роде эта статья пересекается со статьей про
иерархический обход результата запроса
Поэтому и пример возьмем такой же. То есть когда нам надо сделать запрос к таблице:

Период Склад Товар Цена
01.01.2016 Центральный Ручка 30
01.01.2016 Офис Карандаш 15
05.01.2016 Центральный Ручка 45
10.01.2016 Офис Карандаш 25
15.01.2016 Центральный Степлер 150
17.01.2016 Офис Дырокол 200

и разместить результат на форме в виде дерева значений вот в таком виде:

Центральный
Ручка
01.01.2016 30
05.01.2016 45
Степлер
15.01.2016 150
Офис
Карандаш
01.01.2016 15
10.01.2016 25
Дырокол
17.01.2016 200

А теперь рассмотрим как это можно сделать на управляемых и на обычных формах.

Управляемые формы

Для демонстрации создадим внешнюю обработку. Добавим форму. В реквизитах формы
создаем реквизит с типом ДеревоЗначений. Уже в этот реквизит добавляем
колонки реквизита (имена должны совпадать с именами полей в запросе).
Перетаскиваем наше дерево значений на форму. Ну и конечно добавим команду, которая
будет запускать заполнение дерева.

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

В модуле формы пишем вот такой код (текст запроса по формированию временной таблицы
с исходными данными полностью приводить не буду. Его можно взять в вышеуказанной статье):

                     Здесь стоит обратить внимание на два момента. Первое — это то, что имена полей 
запроса и полей дерева значений должны совпадать.
И второе — это метод
ЗначениеВРеквизитФормы(), который помещает сформированное дерево
значений в реквизит формы.
После выполнения кода в форме получаем вот такое дерево значений:

Обычные формы

Создадим тестовую обработку и добавим реквизит с типом ДеревоЗначений.

Создадим обычную форму, добавим на нее табличное поле и в свойствах в качестве
источника данных укажем ранее добавленный реквизит

Как видим в отиличие от управляемых в обычных формах нет необходимости заранее
создавать колонки для дерева значений.
Переходим в модуль формы. Текст запроса опустим, т.к. он будет точно такой же
как и для управляемой формы. Немного различаться будет обработка результата
запроса.

   Для тех кто первый раз сталкивается с такой задачей основная трудность — это 
догадаться о необходимости применения метода СоздатьКолонки()
к табличному полю формы, т.к. без него поле остается пустым.
Запускаем выполнение обработки и получаем следующую картину

2 комментария на «“Дерево значений на форме”»

не работает них на обычных формах.
если создать реквизит обработки Дерево, то в табличном поле в Данных этого реквизита НЕТ!
а вот если создать реквизит формы тогда он появляется в выборе данных для табличного поля.

год спустя пришел ответ 🙂
работает, нужно просто развернуть строку ОбработкаОбъект, и выбрать её реквизит

Источник

Дерево значений в управляемой форме. Заполнение и хранение

Хранить в документе (или справочнике, не суть важно) дерево значений. Дерево должно сохраняться в объекте, как и любой другой реквизит или табличная часть.

У нас дерево будет вот такое:

Одним из способов решить поставленную задачу является «хранилище значений». Я же решил хранить дерево в табличной части. У этого пути есть преимущества:

  • Можно выводить на форму автоматические итоги;
  • Итоги по группировкам можно считать в запросе;
  • В дальнейшем в динамический список документов можно тащить данные из табличной части. Например, тот же итог по одной из колонок.

Заполнение дерева из табличной части

В документ добавлена табличная часть «ПланФакт» с колонками, соответствующими колонкам дерева.

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

&НаСервере Функция ПолучитьТипизированнуюТаблицу(ЗаполнитьДанными = Ложь) ПромежуточнаяТаблица = Новый ТаблицаЗначений; ПромежуточнаяТаблица.Колонки.Добавить("Клиент", Новый ОписаниеТипов("СправочникСсылка.Партнеры")); ПромежуточнаяТаблица.Колонки.Добавить("Марка", Новый ОписаниеТипов("СправочникСсылка.Марки")); ПромежуточнаяТаблица.Колонки.Добавить("Сегмент", Новый ОписаниеТипов("СправочникСсылка.СегментыНоменклатуры")); ПромежуточнаяТаблица.Колонки.Добавить("ПродажиАППГ", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); ПромежуточнаяТаблица.Колонки.Добавить("ПродажиПП", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); ПромежуточнаяТаблица.Колонки.Добавить("План", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); ПромежуточнаяТаблица.Колонки.Добавить("Факт", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2))); Если ЗаполнитьДанными Тогда Для Каждого ТекСтр Из Объект.ПланФакт Цикл НовСтр = ПромежуточнаяТаблица.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр, ТекСтр); КонецЦикла; КонецЕсли; Возврат ПромежуточнаяТаблица; КонецФункции 

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

В форме при открытии вызывается процедура ИзвлечьДерево().

&НаКлиенте Процедура ИзвлечьДерево(Разворачивать = Истина) ИзвлечьДеревоНаСервере(); Если Разворачивать Тогда РазвернутьДерево(); КонецЕсли; КонецПроцедуры &НаСервере Процедура ИзвлечьДеревоНаСервере() Запрос = Новый Запрос; Запрос.УстановитьПараметр("ПромежуточнаяТаблица", ПолучитьТипизированнуюТаблицу(Истина)); Запрос.УстановитьПараметр("СкрытьПустые", Объект.СкрытьПустыеСтроки); Запрос.Текст = "ВЫБРАТЬ | ПромежуточнаяТаблица.Клиент КАК Клиент, | ПромежуточнаяТаблица.Марка КАК Марка, | ПромежуточнаяТаблица.Сегмент КАК Сегмент, | ПромежуточнаяТаблица.ПродажиАППГ КАК ПродажиАППГ, | ПромежуточнаяТаблица.ПродажиПП КАК ПродажиПП, | ПромежуточнаяТаблица.План КАК План, | ПромежуточнаяТаблица.Факт КАК Факт |ПОМЕСТИТЬ Данные |ИЗ | &ПромежуточнаяТаблица КАК ПромежуточнаяТаблица |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Данные.Клиент КАК Клиент, | Данные.Марка КАК Марка, | Данные.Сегмент КАК Сегмент, | Данные.ПродажиАППГ КАК ПродажиАППГ, | Данные.ПродажиПП КАК ПродажиПП, | Данные.План КАК План, | Данные.Факт КАК Факт |ИЗ | Данные КАК Данные |ГДЕ | (&СкрытьПустые = ЛОЖЬ | ИЛИ Данные.ПродажиАППГ <> 0 | ИЛИ Данные.ПродажиПП <> 0 | ИЛИ Данные.План <> 0 | ИЛИ Данные.Факт <> 0) |ИТОГИ | СУММА(ПродажиАППГ), | СУММА(ПродажиПП), | СУММА(План), | СУММА(Факт) |ПО | Клиент, | Марка"; Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ЗначениеВРеквизитФормы(Дерево, "ДеревоПланФакт"); КонецПроцедуры 

Да, наш запрос принял данные из табличной части и сформировал результат с итогами по группировкам, который мы и загрузили в дерево. Да, само собой, «ДеревоПланФакт» — это реквизит управляемой формы с типом «ДеревоЗначений».

Как это выглядит на форме:

Сохранение дерева

Понятно, что мало выводить дерево, надо еще и записывать его — после изменения пользователем. В нашем конкретном случае нужно еще и пересчитывать итоги по группировкам.

Можно было бы написать процедуру, которая выполнит обратное преобразование дерева в таблицу. Но в нашем случае это было бы долго: для пересчета итогов каждый раз пришлось бы перезаполнять всю таблицу. Я решил пойти другим путем и при изменении строки дерева пересчитывать только нужные итоги и обновлять только нужные строки в табличной части.

При этом я учел 2 особенности моей задачи:

  • Пользователь может менять только колонку «План»;
  • Поддерживается только изменение строк нижнего уровня. Изменение итогов по группировкам следует запретить.

Вот как выглядит результат:

&НаКлиенте Процедура ДеревоПланФактПланПриИзменении(Элемент) Модифицированность = Истина; СтрокаДерева = Элементы.ДеревоПланФакт.ТекущиеДанные; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("Клиент", СтрокаДерева.Клиент); СтруктураОтбора.Вставить("Марка", СтрокаДерева.Марка); СтруктураОтбора.Вставить("Сегмент", СтрокаДерева.Сегмент); СтрокиТаблицы = Объект.ПланФакт.НайтиСтроки(СтруктураОтбора); Для Каждого ТекСтр Из СтрокиТаблицы Цикл ТекСтр.План = СтрокаДерева.План; КонецЦикла; // Пересчитаем суммы в группировках СтрокаДереваМарка = СтрокаДерева.ПолучитьРодителя(); СуммаПоМарке = 0; Для Каждого ТекСтр Из СтрокаДереваМарка.ПолучитьЭлементы() Цикл СуммаПоМарке = СуммаПоМарке + ТекСтр.План; КонецЦикла; СтрокаДереваМарка.План = СуммаПоМарке; СтрокаДереваКлиент = СтрокаДереваМарка.ПолучитьРодителя(); СуммаПоКлиенту = 0; Для Каждого ТекСтр Из СтрокаДереваКлиент.ПолучитьЭлементы() Цикл СуммаПоКлиенту = СуммаПоКлиенту + ТекСтр.План; КонецЦикла; СтрокаДереваКлиент.План = СуммаПоКлиенту; КонецПроцедуры 

Источник

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