Ошибка при вызове метода контекста значениевреквизитформы дерево

УФ. Построение дерева на форме

Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ХозрасчетныйОбороты.Субконто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(Реализация, Заказ) КАК ДокументТовар, | СУММА(Сумма) |ПО | Заказ, | Реализация"; ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам), "Дерево");

Источник

Оцените статью