Дерево значений на форме
рубрики: Работа с формами | Дата: 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 колонкой, с иерархией сначала подразделений и потом их ОС
что то мне интуиция подсказывает что запрос здесь просто не справится.
эта технология заточена деревья выводить только по иерархически связанным источникам данных.
надеюсь я тут ошибаюсь 🙂 а то как то медленно получится стыковать эти выборки меж собой.
Обход результата:
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
Строка = Дерево.Строки.Добавить();
Строка.ОсновноеСредство = Выборка.Местонахождение;
РекурсивнаяПроцедура(Строка,Выборка);
КонецЦикла;
Пока ВыборкаОС.Следующий() Цикл
НоваяСтрока = Строка.Строки.Добавить();
НоваяСтрока.ОсновноеСредство = ВыборкаОС.ОсновноеСредство;
РекурсивнаяПроцедура(НоваяСтрока,ВыборкаОС);
КонецЦикла;
КонецПроцедуры
Только тут без учета иерархии подразделений.
Источник