Имя: Пароль:
1C
1С v8
Как выгрузить результаты запроса по 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) не получается рекурсивно обойти дерево и передать его в другое дерево. Пожалуйста, покажите как это можно сделать.
Ошибка? Это не ошибка, это системная функция.