Профессия — 1С » Дерево значений на форме

Профессия — 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 КАК Цена
    |ПОМЕСТИТЬ ВТ_Цена
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |..............................
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВТ_Цена.Период КАК Период,
    |	ВТ_Цена.Склад КАК Склад,
    |	ВТ_Цена.Товар КАК Товар,
    |	ВТ_Цена.Цена КАК Цена
    |ИЗ
    |	ВТ_Цена КАК ВТ_Цена
    |ИТОГИ ПО
    |	Склад,
    |	Товар";

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

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

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

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

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

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

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



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

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

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

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

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

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

  1. Евгений:

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

    • Екатерина:

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

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

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

   

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