Результат запроса деревом 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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

1С 8.3 : Выгрузка результата запроса в Таблицу и Дерево значений

Распечатать

Результат запроса может быть выгружен в таблицу значений или дерево значений с помощью метода Выгрузить. Затем над ними могут быть произведены другие операции: сортировка, свертка, перебор строк и другие действия.

Следующий пример выгружает результат запроса в таблицу значений с прямым порядком обхода строк:
Код 1C v 8.х

 Результат = Запрос.Выполнить(); 
СпособОбхода = ОбходРезультатаЗапроса.Прямой;
ТабЗнач = Результат.Выгрузить(СпособОбхода);

Если используется иерархический обход результата запроса или обход по группировкам, тогда удобнее выгрузить не в таблицу значений, а в дерево значений, как делается в следующем примере:
Код 1C v 8.х

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

Распечатать

Похожие FAQ

Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить — сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools — это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих

Еще в этой же категории

17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Что такое менеджер временных таблиц и как с ним работать? 12
В 1С есть такая замечательная вещь, как МенеджерВременныхТаблиц . Этот объект позволяет передавать временные таблицы из одного запроса в другой. То есть, мы можем создать временную таблицу в запросе, прерваться, выполнить какой-нибудь код, и продо Объектная модель схемы запроса 5
Периодически во встроенном языке возникает необходимость изменения текста запроса в зависимости от разных алгоритмических условий. Раньше подобная задача решалась путем непосредственного формирования нужного текста запроса в виде строки. А это не вс Как в запросе объединить несколько значений в один столбец отобрав по условию? 1
Бывают ситуации, особенно когда формируешь отчеты по проводкам, где надо вывести отчет по одному типу значений и эти значения могут быть в разных колонках регистра. В примере ниже, необходимо собрать отчет в разбивке по Номенклатурным группам. Про Курс по разработке и оптимизации запросов в 1С (Часть 1) 0
Часть 1. Основные конструкции языка запросов и их назначение • Назначение языка запросов • Структура запроса • Основные секции запроса и их назначение • Группировка результатов запроса • Фильтрация результатов запроса • Объединения и соединени Посмотреть все в категории Запросы

Источник

Как выгрузить результат запроса в дерево значений?

на форме есть табл. поле с типом дерево значений, при открытии хотелось бы заполнять это поле из запроса. Запрос к справочнику организаци возвращает результат с группировкой по родителям, вот и хотелось бы отразить это в виде дерева на форме.
КАК?

спасибо, я и говорю в результате запроса есть дерево, и на форме есть табличное поле с типом дерево, как в него загрузить результат запроса?

(4) шатенка. фотко нет! 🙂
Дерево.Значение = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).Скопировать();

Подскажите пожалуйста как получить одним запросом дерево состоящее в корневых ветвях из подразделений и разворачивающиеся на вложенное дерево оформленных на эту организацию ОС. типа так:

— Подразделение1
— Офис -(группа справочника ОС)
ОС стол
ОС стул
ОС комп
— Склад
ОС Станок
— Подразделение2
— Магазин
ОС прилавок.

у меня после выгрузки запроса «ПоГруппировкамСИерархией» выходит только в 2 колонки Подразделение и ОС.
Выбираю из регистра сведений МестонахождениеОС.Срезпоследних как правильно запрос построить?

//Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
Запрос = Новый Запрос;
Запрос.Текст ;
Результат = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

(13) Без Скопировать(), просто срабатывала проверка на равенство, возвращающая ложь, а присвоения значения не происходило.

Спасбо ptiz, появилось дерево, но ОС по-прежнему выходят второй колонкой, как бы сделать чтобы все попало в одну колонку дерева, и ОС размещались под подразделением владельцем?

//Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
Запрос = Новый Запрос;
Запрос.Текст ;

А мне где спасибо? Обидился. И не буду посказывать, что надо правильно группировку произвести. Но важнее — сделать итоги по нескольким реквизитам.

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

(23) Я рад 🙂 Не уж то получилось? 🙁 не удержался 🙂

Группировка и Итоги — различные «понятия». Группировка позволяет сгруппировать «однородные» записи, но не меняет их табличную «сущность». Итоги — вот что «создает» дерево.

(24) Зачем ушел плакать? Скажи что нибудь, доброе слово и кошке приятно. упс, сорри. я хотел сказать «и тебе спасибо скажут» :))

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

(27) благодарю NULLL я только не знакома с таким механизмом когда результат одного запроса используется как параметр другого, наверно это можно использовать в моем случае, например получить одним запросом дерево подразделений, и затем если у подразделения висят ОС вставить ему дерево его ОС.

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

Такой должен быть запрос:
Запрос = Новый Запрос;
Запрос.Текст ;

Автор хочет в одной колонке и Местонахождение, и ОсновноеСредство. Столбиком, друг под другом. Что тут не понятно? 🙂

Mitriy, это твой шанс получить спасибо 🙂 Подскажи автору как обойти строки дерева и из одной колонки перенести значение в другую и скрыть эту колонку с показа :))

(30) нужен результат как в (9) а выходит с 2 колонками и без иерархии ОС.
— Подразделение1 NULL
NULL ОС стол
NULL ОС стул
NULL ОС комп
NULL ОС Станок
— Подразделение2 NULL
NULL ОС прилавок.

а хотелось бы 1 колонкой, с иерархией сначала подразделений и потом их ОС

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

Обход результата:
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
Строка = Дерево.Строки.Добавить();
Строка.ОсновноеСредство = Выборка.Местонахождение;
РекурсивнаяПроцедура(Строка,Выборка);
КонецЦикла;

Пока ВыборкаОС.Следующий() Цикл
НоваяСтрока = Строка.Строки.Добавить();
НоваяСтрока.ОсновноеСредство = ВыборкаОС.ОсновноеСредство;
РекурсивнаяПроцедура(НоваяСтрока,ВыборкаОС);
КонецЦикла;
КонецПроцедуры

Только тут без учета иерархии подразделений.

Источник

Читайте также:  Какая может быть тень от деревьев
Оцените статью