|
Как выгрузить результаты запроса по COM-соединению в дерево значений в 1С 8.3? | ☑ | ||
---|---|---|---|---|
0
ilyabr
07.05.17
✎
16:12
|
Всем привет и с наступающим праздником!
Прошу помощи у специалистов, т.к. сам зашел в тупик. Задача: получить содержимое справочника у удаленной базе по COM-соединению и вывести на управляемую форму в дерево значений. Я делаю вот так: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) УдаленнаяБаза = ВнешниеСоединения.ПолучитьПодключениеКСервернойБД(); Запрос = УдаленнаяБаза.NewObject("Запрос"); Запрос.Текст = "ВЫБРАТЬ | Автомобили.Наименование КАК Наименование, | Автомобили.Код КАК Код |ИЗ | Справочник.Автомобили КАК Автомобили | |УПОРЯДОЧИТЬ ПО | Автомобили.Ссылка ИЕРАРХИЯ УБЫВ"; Дерево = Запрос.Выполнить().Выгрузить(УдаленнаяБаза.ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ЗначениеВРеквизитФормы(Дерево, "Автомобили"); КонецПроцедуры Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы) ЗначениеВРеквизитФормы(Дерево, "Автомобили"); по причине: Недопустимое значение параметра (параметр номер ‘2’) Если все то же самое делать локально, то данные из запроса попадают в форму без проблем. В чем может быть проблема? |
|||
1
XLife
07.05.17
✎
16:18
|
(0) В чем может быть проблема?
в типе значения |
|||
2
ilyabr
07.05.17
✎
16:39
|
И еще: если убрать УдаленнаяБаза.ОбходРезультатаЗапроса.ПоГруппировкамСИерархией и выгружать в таблицу значений, а на форме реквизит Автомобили сделать таблицей, все выгружается отлично. С теми же колонками, что и в дереве.
|
|||
3
h-sp
07.05.17
✎
16:43
|
(2) Дерево - это дерево другой базы. Поэтому напрямую ЗначениеВРеквизитФормы(Дерево не прокатит.
Надо самому в цикле обходить это дерево и каждую строчку переписывать в автомобили. |
|||
4
ilyabr
07.05.17
✎
16:46
|
Перебор циклом занимает 30-40 секунд, это очень долго.
|
|||
5
h-sp
07.05.17
✎
21:52
|
(4) с чего это 40 секунд? Перебор должен быть быстрее, чем ЗначениеВРеквизитФормы.
|
|||
6
Бертыш
07.05.17
✎
22:08
|
Ссылку, то в другую базу передать проблематично... Если только не перепаковывать каждую ссылку Через ЗначениеВстрокуВнутр... Например задав это в функции представления...
А так то дерево в строку или в файл в одной базе засунуо, а в другой базе вынул из строки из файла. И будет счастье |
|||
7
ilyabr
07.05.17
✎
22:46
|
(5)
Ну вот смотрите, код с перебором &НаСервере Процедура ПолучитьНаСервере() Время1 = Формат(ТекущаяДата(), "ДФ=mm:ss"); ДеревоАвтомобили = Новый ДеревоЗначений; ДеревоАвтомобили.Колонки.Добавить("Наименование"); ДеревоАвтомобили.Колонки.Добавить("Код"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Автомобили.Ссылка КАК Ссылка, | Автомобили.Код КАК Код, | Автомобили.Наименование КАК Наименование, | Автомобили.Родитель.Наименование КАК НаименованиеРодителя, | Автомобили.Родитель.Код КАК КодРодителя |ИЗ | Справочник.Автомобили КАК Автомобили | |УПОРЯДОЧИТЬ ПО | Автомобили.Ссылка ИЕРАРХИЯ, | Автомобили.Наименование"; РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Время2 = Формат(ТекущаяДата(), "ДФ=mm:ss"); Пока Выборка.Следующий() Цикл Если НЕ Выборка.Ссылка.Родитель.ЭтоГруппа Тогда НоваяСтрока = ДеревоАвтомобили.Строки.Добавить(); НоваяСтрока.Наименование = Выборка.Наименование; НоваяСтрока.Код = Выборка.Код; Иначе СтрокаПоиска = ДеревоАвтомобили.Строки.Найти(Выборка.КодРодителя, "Код", Истина); НоваяСтрока = СтрокаПоиска.Строки.Добавить(); НоваяСтрока.Наименование = Выборка.Наименование; НоваяСтрока.Код = Выборка.Код; КонецЕсли; КонецЦикла; Время3 = Формат(ТекущаяДата(), "ДФ=mm:ss"); ЗначениеВРеквизитФормы(ДеревоАвтомобили, "Автомобили"); Время4 = Формат(ТекущаяДата(), "ДФ=mm:ss"); Сообщить("Время1 " + Время1); Сообщить("Время2 " + Время2); Сообщить("Время3 " + Время3); Сообщить("Время4 " + Время4); КонецПроцедуры Для удаленной базы меняется только строка: Запрос = УдаленнаяБаза.NewObject("Запрос"); И результаты: Удаленная база Время1 25:36 Время2 25:36 Время3 26:02 Время4 26:02 Локальная база Время1 39:30 Время2 39:30 Время3 39:39 Время4 39:39 |
|||
8
h-sp
08.05.17
✎
05:52
|
(7) вот это что за херня?
Если НЕ Выборка.Ссылка.Родитель.ЭтоГруппа Тогда в запросе это сделайте. Выигрыш по времени в 100 раз. |
|||
9
h-sp
08.05.17
✎
05:55
|
и это
СтрокаПоиска = ДеревоАвтомобили.Строки.Найти(Выборка.КодРодителя, "Код", Истина); зачем поиск? |
|||
10
ilyabr
08.05.17
✎
11:47
|
(8) как это сделать в запросе? не представляю себе.
(9) а как мне добавить подчиненный элемент? |
|||
11
h-sp
08.05.17
✎
12:06
|
(10) ты не поверишь
"ВЫБРАТЬ | Автомобили.Наименование КАК Наименование, ... | Автомобили.Родитель.ЭтоГруппа КАК РодительЭтоГруппа |ИЗ | Справочник.Автомобили КАК Автомобили |ИТОГИ ПО Иерархия и Выборка = РезультатЗапроса.Выбрать(УдаленнаяБаза.ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); тогда в выборке будет дерево |
|||
12
ilyabr
08.05.17
✎
12:20
|
(11) Ах, Вы об этом… Запрос я подкорректировал, вместо 30 секунд стало 20.
А вот насчет “тогда в выборке будет дерево” - будет. Только дерево не вставляется в форму, что собственно и побудило меня написать этот пост, почитайте (0). Проблема до сих пор не решена. |
|||
13
h-sp
08.05.17
✎
13:24
|
(12) в (0) про это ничего нет.
|
|||
14
ilyabr
08.05.17
✎
13:28
|
(13)
Ну как же нет, а вот это: Но на шаге ЗначениеВРеквизитФормы(Дерево, “Автомобили”); 1С ругается: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы) ЗначениеВРеквизитФормы(Дерево, "Автомобили"); по причине: Недопустимое значение параметра (параметр номер ‘2’) ? |
|||
15
h-sp
08.05.17
✎
13:49
|
(14) ну ты там хочешь com-объекты впихнуть в реквизит формы. Это дебилизм согласись. Надо просто создать дерево в это базе, и построчно переписать из того дерева в это дерево.
|
|||
16
ilyabr
08.05.17
✎
13:57
|
(15) А как построчно переписать дерево в дерево? Вы можете привести пример?
|
|||
17
Fish
08.05.17
✎
14:28
|
(16) рекурсивный обход дерева
|
|||
18
ilyabr
08.05.17
✎
15:47
|
(16) не получается рекурсивно обойти дерево и передать его в другое дерево. Пожалуйста, покажите как это можно сделать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |