- ДеревоЗначений.Строки Метод ЗагрузитьКолонку()
- Доступность
- Пример использования
- Читайте также:
- Дерево значений на форме
- Управляемые формы
- Обычные формы
- 2 комментария на «“Дерево значений на форме”»
- Дерево значений в управляемой форме. Заполнение и хранение
- Заполнение дерева из табличной части
- Сохранение дерева
ДеревоЗначений.Строки
Метод ЗагрузитьКолонку()
Метод ЗагрузитьКолонку() копирует значения в колонку коллекции строк дерева значений из массива. Значения из массива загружаются в порядке следования индексов.
Доступность
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример использования
Пример кода с использованием метода ЗагрузитьКолонку() :
мЗначения = Новый Массив; мЗначения.Добавить("Стол деревянный"); мЗначения.Добавить("Стул деревянный"); //создание нового дерева значений ДеревоЗначений = Новый ДеревоЗначений; //добавляем колонки ДеревоЗначений.Колонки.Добавить("Наименование"); ДеревоЗначений.Колонки.Добавить("КодТовара"); //метод ЗагрузитьКолонку не добавляет строки //поэтому перед заполнением добавим строки в коллекцию Для Инд = 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; Для Каждого ТекСтр Из СтрокаДереваКлиент.ПолучитьЭлементы() Цикл СуммаПоКлиенту = СуммаПоКлиенту + ТекСтр.План; КонецЦикла; СтрокаДереваКлиент.План = СуммаПоКлиенту; КонецПроцедуры
Источник