УФ. Построение дерева на форме
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ХозрасчетныйОбороты.Субконто1 КАК ОсновноеСредство,
| ХозрасчетныйОбороты.Субконто2 КАК СтатьяЗатрат,
| ХозрасчетныйОбороты.Подразделение,
| ХозрасчетныйОбороты.СуммаОборот КАК СуммаЗатрат
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Период, Счет В ИЕРАРХИИ(&Счет2003), , Организация = &Организация) КАК ХозрасчетныйОбороты
|ИТОГИ
| СУММА(СуммаЗатрат)
|ПО
| ОсновноеСредство»;
Запрос.УстановитьПараметр(«КонецПериода», КонецМесяца(Объект.Период));
Запрос.УстановитьПараметр(«НачалоПериода», НачалоМесяца(Объект.Период));
Запрос.УстановитьПараметр(«Счет2003», ПланыСчетов.Хозрасчетный.НайтиПоКоду(«2003»));
Запрос.УстановитьПараметр(«Организация», Объект.Организация);
Объект.Затраты = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ошибка
: Ошибка при установке значения атрибута контекста (Затраты)
Объект.Затраты = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
по причине:
Нельзя изменять поле, содержащее объект данных формы
брр.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ХозрасчетныйОбороты.Субконто1 КАК ОсновноеСредство,
| ХозрасчетныйОбороты.Субконто2 КАК СтатьяЗатрат,
| ХозрасчетныйОбороты.Подразделение,
| ХозрасчетныйОбороты.СуммаОборот КАК СуммаЗатрат
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Период, Счет В ИЕРАРХИИ(&Счет2003), , Организация = &Организация) КАК ХозрасчетныйОбороты
|ИТОГИ
| СУММА(СуммаЗатрат)
|ПО
| ОсновноеСредство»;
Запрос.УстановитьПараметр(«КонецПериода», КонецМесяца(Объект.Период));
Запрос.УстановитьПараметр(«НачалоПериода», НачалоМесяца(Объект.Период));
Запрос.УстановитьПараметр(«Счет2003», ПланыСчетов.Хозрасчетный.НайтиПоКоду(«2003»));
Запрос.УстановитьПараметр(«Организация», Объект.Организация);
Дерево = РеквизитФормыВЗначение(«Затраты»);
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ЗначениеВРеквизитФормы(Дерево,»Затраты»);
: Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
Дерево = РеквизитФормыВЗначение(«Затраты»);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
(0) Пробуй так: Объект.Затраты.Загрузить(Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам));
Ты собрался просто так присвоить ТаблицуЗначений КоллекцииФормы?
(1)скорее наоборот, ЗначениеВДанныеФормы
Источник
Как выгрузить результаты запроса по COM-соединению в дерево значений в 1С 8.3?
Всем привет и с наступающим праздником!
Прошу помощи у специалистов, т.к. сам зашел в тупик.
Задача: получить содержимое справочника у удаленной базе по COM-соединению и вывести на управляемую форму в дерево значений. Я делаю вот так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УдаленнаяБаза = ВнешниеСоединения.ПолучитьПодключениеКСервернойБД();
Запрос = УдаленнаяБаза.NewObject(«Запрос»);
Запрос.Текст =
«ВЫБРАТЬ
| Автомобили.Наименование КАК Наименование,
| Автомобили.Код КАК Код
|ИЗ
| Справочник.Автомобили КАК Автомобили
|
|УПОРЯДОЧИТЬ ПО
| Автомобили.Ссылка ИЕРАРХИЯ УБЫВ»;
КонецПроцедуры
Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
ЗначениеВРеквизитФормы(Дерево, «Автомобили»);
по причине:
Недопустимое значение параметра (параметр номер ‘2’)
Если все то же самое делать локально, то данные из запроса попадают в форму без проблем. В чем может быть проблема?
(0) В чем может быть проблема?
И еще: если убрать УдаленнаяБаза.ОбходРезультатаЗапроса.ПоГруппировкамСИерархией и выгружать в таблицу значений, а на форме реквизит Автомобили сделать таблицей, все выгружается отлично. С теми же колонками, что и в дереве.
(2) Дерево — это дерево другой базы. Поэтому напрямую ЗначениеВРеквизитФормы(Дерево не прокатит.
Надо самому в цикле обходить это дерево и каждую строчку переписывать в автомобили.
Ссылку, то в другую базу передать проблематично. Если только не перепаковывать каждую ссылку Через ЗначениеВстрокуВнутр. Например задав это в функции представления.
А так то дерево в строку или в файл в одной базе засунуо, а в другой базе вынул из строки из файла.
И будет счастье
(5)
Ну вот смотрите, код с перебором
&НаСервере
Процедура ПолучитьНаСервере()
Время1 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
ДеревоАвтомобили = Новый ДеревоЗначений;
ДеревоАвтомобили.Колонки.Добавить(«Наименование»);
ДеревоАвтомобили.Колонки.Добавить(«Код»);
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| Автомобили.Ссылка КАК Ссылка,
| Автомобили.Код КАК Код,
| Автомобили.Наименование КАК Наименование,
| Автомобили.Родитель.Наименование КАК НаименованиеРодителя,
| Автомобили.Родитель.Код КАК КодРодителя
|ИЗ
| Справочник.Автомобили КАК Автомобили
|
|УПОРЯДОЧИТЬ ПО
| Автомобили.Ссылка ИЕРАРХИЯ,
| Автомобили.Наименование»;
Выборка = РезультатЗапроса.Выбрать();
Время2 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
Пока Выборка.Следующий() Цикл
Если НЕ Выборка.Ссылка.Родитель.ЭтоГруппа Тогда
НоваяСтрока = ДеревоАвтомобили.Строки.Добавить();
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Код = Выборка.Код;
Иначе
СтрокаПоиска = ДеревоАвтомобили.Строки.Найти(Выборка.КодРодителя, «Код», Истина);
НоваяСтрока = СтрокаПоиска.Строки.Добавить();
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Код = Выборка.Код;
КонецЕсли;
КонецЦикла;
Время3 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
ЗначениеВРеквизитФормы(ДеревоАвтомобили, «Автомобили»);
Время4 = Формат(ТекущаяДата(), «ДФ=mm:ss»);
Сообщить(«Время1 » + Время1);
Сообщить(«Время2 » + Время2);
Сообщить(«Время3 » + Время3);
Сообщить(«Время4 » + Время4);
КонецПроцедуры
Для удаленной базы меняется только строка:
Время1 25:36
Время2 25:36
Время3 26:02
Время4 26:02
Время1 39:30
Время2 39:30
Время3 39:39
Время4 39:39
Если НЕ Выборка.Ссылка.Родитель.ЭтоГруппа Тогда
в запросе это сделайте. Выигрыш по времени в 100 раз.
СтрокаПоиска = ДеревоАвтомобили.Строки.Найти(Выборка.КодРодителя, «Код», Истина);
«ВЫБРАТЬ
| Автомобили.Наименование КАК Наименование,
.
| Автомобили.Родитель.ЭтоГруппа КАК РодительЭтоГруппа
|ИЗ
| Справочник.Автомобили КАК Автомобили
|ИТОГИ ПО Иерархия
тогда в выборке будет дерево
(11) Ах, Вы об этом… Запрос я подкорректировал, вместо 30 секунд стало 20.
А вот насчет “тогда в выборке будет дерево” — будет. Только дерево не вставляется в форму, что собственно и побудило меня написать этот пост, почитайте (0). Проблема до сих пор не решена.
(13)
Ну как же нет, а вот это:
Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
ЗначениеВРеквизитФормы(Дерево, «Автомобили»);
по причине:
Недопустимое значение параметра (параметр номер ‘2’) ?
(14) ну ты там хочешь com-объекты впихнуть в реквизит формы. Это дебилизм согласись. Надо просто создать дерево в это базе, и построчно переписать из того дерева в это дерево.
(16) не получается рекурсивно обойти дерево и передать его в другое дерево. Пожалуйста, покажите как это можно сделать.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа.
Фредерик Брукс-младший
Источник
Работа с деревом значений (УФ)
Имею два справочника сведенных в одну таблицу:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Док1.Справочник1 КАК Справочник1, | Док1.Справочник2 КАК Справочник2, | Док1.Количество КАК Количество, | Док1.Цена КАК Цена, | Док1.Сумма КАК Сумма |ИЗ | Документ.Док1.ТабЧасть КАК Док1 |ГДЕ | Док1.Ссылка = &Ссылка |ИТОГИ | СУММА(Количество), | СУММА(Сумма) |ПО | Справочник1"; Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); ДанныеДляДерева = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
Получаю:
а как сделать вот так? :
Уточните, пожалуйста, Вас интересует любое решение или исключительно запросом? Ведь первое, что здесь напрашивается, это отказаться от использования метода «ЗначениеВРеквизитФормы» и заполнить дерево формы согласно своим предпочтениям последовательным обходом выборки.
(5)
А, блин, мой косяк, не досмотрел строчку.
Тогда остаётся просто циклом пробегать, а не одной строчкой выгрузки) Потому что выгрузкой для запроса у вас всегда будет заполнена колонка «Справочник1». Для понимания можете в консоли запросов глянуть результат
(5) результатЗапроса.Выгрузить() там как отображается?
и попробуйте ДанныеДляДерева = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); (сИерархией убрать)
ДанныеДляДерева — после выгрузки имеет тип дерево значений и нужный вид?
ДанныеДляДерева = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); Для каждого Группировка Из ДанныеДляДерева.Строки Цикл Для каждого ДетальныеЗаписи Из Группировка.Строки Цикл ДетальныеЗаписи.Справочник1 = Неопределено; КонецЦикла; КонецЦикла; ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
ДанныеДляДерева = РеквизитФормыВЗначение("ДеревоНаФорме"); ДанныеДляДерева.Строки.Очистить(); ВыборкаПоГруппировкам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоГруппировкам.Следующий() Цикл Группировка = ДанныеДляДерева.Строки.Добавить(); ЗаполнитьЗначенияСвойств(Группировка, ВыборкаПоГруппировкам); ВыборкаДетальныеЗаписи = ВыборкаПоГруппировкам.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ДетальныеЗаписи = Группировка.Строки.Добавить(); ЗаполнитьЗначенияСвойств(ДетальныеЗаписи, ВыборкаДетальныеЗаписи, , "Справочник1"); КонецЦикла; КонецЦикла; ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
(9) спасибо, «перебором» получилось.
Если у элемента верхнего уровня, длинное название, можно как-то настроить, чтобы оно было по всей строке.
Ведь в первой строке у меня вообще только один элемент с типом Справочник1.
Думаю на картинке понятно, что сейчас обрезает по красной линии:
(11) да, по сути делаю иерархический подбор в документ (не иерархия справочника, а подчинение одного справочника другому, как в примере)
(12) Опять предлагаю Вам попробовать два пути решения:
1. Спрятать колонки справочников, добавить третью составного типа. Ее и вывести на форму. При обходе результата запроса заполнять новую колонку либо значением справочника 1, либо справочника 2 зависимости от уровня. В зависимости от уровня же при активизации строки ограничивать тип выбираемых данных в отображаемой колонке, при изменении ее значения корректно заполнять одну из скрытых колонок (если нужно, конечно).
2. Добавить скрытую колонку булево типа «ЭтоГруппа», или числового «Уровень». Заполнять ее при обходе результата запроса. Настроить условное оформление формы в зависимости от значения в новой колонке. В оформлении указать не то «Видимость=Ложь», не то «Отображать=Ложь», точно не помню.
а если посмотреть результатЗапроса.Выгрузить() там отображается как надо?
Может у вас ЭлементФормы не дерево?
И тогда отображение должно быть как Вы хотите.Хотя, вроде, тогда всё равно на дочернем уровне будут светиться поля и всё равно нужно тогда дерево заполнять вручную циклом)
(9) Почему у меня не работает Группировка = ДанныеДляДерева.Строки.Добавить(); ?
Пишет ошибку «Несоответствие типов». Делаю в модуле формы &НаСервере.
(16) Скорее всего имя переменной «Группировка» неудачное. Например, совпало с именем свойства формы. Попробуйте использовать другое имя, например «ГруппаДерева».
1. Нужно ПоГруппировкам обходить, а не ПоГруппировкамСИерархией. Это другое. Для иерархических справочников. У вас в запросе нет иерархии
2. Не нужно ничего дообрабатывать в цикле. Всё в запросе делается. Через ISNULL в поле итогов можно назначить разное значение для итогового поля, в зависимости от уровня группировки. И вообще в итогах можно произвольные выражения делать любой сложности. Сделал в демоБазе пример. Думаю из него понятно, как это можно к другой любой задаче использовать, когда нужно дерево на форму вывести.
Примерно так:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказКлиента.Ссылка КАК Заказ |ПОМЕСТИТЬ ВтЗаказы |ИЗ | Документ.ЗаказКлиента КАК ЗаказКлиента |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВтЗаказы.Заказ КАК Заказ, | РеализацияТоваровУслугТовары.Ссылка КАК Реализация, | РеализацияТоваровУслугТовары.Цена КАК Цена, | РеализацияТоваровУслугТовары.Ссылка.Менеджер КАК Менеджер, | РеализацияТоваровУслугТовары.Количество КАК Количество, | РеализацияТоваровУслугТовары.Номенклатура КАК ДокументТовар, | РеализацияТоваровУслугТовары.Сумма КАК Сумма |ИЗ | ВтЗаказы КАК ВтЗаказы | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ПО ВтЗаказы.Заказ = РеализацияТоваровУслугТовары.ЗаказКлиента |ИТОГИ | ВЫБОР | КОГДА Реализация ЕСТЬ NULL | ТОГДА ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) | ИНАЧЕ МАКСИМУМ(Менеджер) | КОНЕЦ КАК Менеджер, | СУММА(Количество), | ЕСТЬNULL(Реализация, Заказ) КАК ДокументТовар, | СУММА(Сумма) |ПО | Заказ, | Реализация"; ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам), "Дерево");
Источник