Профессия — 1С

Рукопашный бой Карташ

Категории

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

рубрики: Работа с формами | Дата: 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

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

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

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




Перетаскиваем наше дерево значений на форму. Ну и конечно добавим команду, которая
будет запускать заполнение дерева.

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



&НаСервере
Процедура ЗаполнитьДеревоНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	ДАТАВРЕМЯ(2016, 1, 1) КАК Период,
    |	""Центральный"" КАК Склад,
    |	""Ручка"" КАК Товар,
    |	30 КАК Цена
    |ПОМЕСТИТЬ ВТ_Цена
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |..............................
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВТ_Цена.Период КАК Период,
    |	ВТ_Цена.Склад КАК Склад,
    |	ВТ_Цена.Товар КАК Товар,
    |	ВТ_Цена.Цена КАК Цена
    |ИЗ
    |	ВТ_Цена КАК ВТ_Цена
    |ИТОГИ ПО
    |	Склад,
    |	Товар";

    Результат = Запрос.Выполнить();
	
    Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
    ЗначениеВРеквизитФормы(Дерево, "ДеревоНоменклатуры");
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДерево(Команда)
    ЗаполнитьДеревоНаСервере();
КонецПроцедуры

Здесь стоит обратить внимание на два момента. Первое — это то, что имена полей
запроса и полей дерева значений должны совпадать.




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

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

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

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

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



Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	...............................
    |	........";

    Результат = Запрос.Выполнить();
    ДеревоНоменклатуры = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

    ЭлементыФормы.фДеревоНоменклатуры.СоздатьКолонки();

КонецПроцедуры

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




к табличному полю формы, т.к. без него поле остается пустым.
Запускаем выполнение обработки и получаем следующую картину

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С