Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Список значений через Com

Список значений через Com
Я
   ComradeKite
 
09.07.19 - 11:48
Привет многоуважаемый ALL!
Может кто силен в Com и может подсказать, почему не передается у меня список значений в параметры отчета.
Пытаюсь запустить отчет в другой базе, подключаюсь по COM соединению, устанавливаю параметры отчету, список подразделений.
Формирую макет, вывожу процессором вывода.

В наборе данных простецкий запрос
ВЫБРАТЬ
    ПодразделенияОрганизаций.Ссылка
ИЗ
    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
ГДЕ
    ПодразделенияОрганизаций.Ссылка В (&СписокПодразделений)

========================================================================

В коде на стороне другой базе вызываю так

ЗУП = ПодключениеComС("C:\Users\Documents\InfoBase2", "Administrator", "", "");
    СхемаКомпоновкиДанных = ЗУП.Отчеты.Отчет1.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    КомпоновщикНастроекНастройки = ЗУП.NewObject("КомпоновщикНастроекКомпоновкиДанных");
    ИсточникДоступныхНастроекКомпоновкиДанных =  ЗУП.NewObject("ИсточникДоступныхНастроекКомпоновкиДанных",СхемаКомпоновкиДанных);
    КомпоновщикНастроекНастройки.Инициализировать(ИсточникДоступныхНастроекКомпоновкиДанных);
    КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    Настройки = КомпоновщикНастроекНастройки.ПолучитьНастройки();
        
    Запрос = ЗУП.NewObject("Запрос");
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПЕРВЫЕ 1 ПодразделенияОрганизаций.Ссылка КАК Подразделение
    |ИЗ
    |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций";
    
    ПодразделенияДайсонComObject = Запрос.Выполнить().Выгрузить();
    СписокПодразделений =ЗУП.NewObject("СписокЗначений");
    НовПер = Неопределено;
    Для Каждого ЭлементЗапроса Из ПодразделенияДайсонComObject Цикл
        СписокПодразделений.Добавить(ЭлементЗапроса.Подразделение);
    КонецЦикла;
        
    Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СписокПодразделений",  СписокПодразделений);

    КомпоновщикМакета = ЗУП.NewObject("КомпоновщикМакетаКомпоновкиДанных");
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекНастройки.Настройки,,,ЗУП.NewObject("ОписаниеТипов", "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений").Типы().Получить(0));
    ПроцессорКомпоновкиДанных = ЗУП.NewObject("ПроцессорКомпоновкиДанных");
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
    
    ПроцессорВывода = ЗУП.NewObject("ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений");
    
    ДанныеТЗ = ЗУП.NewObject("ТаблицаЗначений");
    ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);    

В результате ДанныеТЗ нет данных.
Если я в схеме скд в источнике оберу условие по подразделению, то данные выводятся.
Не получается у меня передать список значений.

У меня в списке значений реально Com объекты, которые другая сторона должна распознать как свои и преобразовать автоматически в ссылки подразделений, а не распознает однако.

Как все таки заставить сработать условие?
 
 
   sitex
 
1 - 09.07.19 - 11:56
(0) подсказка смотри в сторону ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр;
   gopile
 
2 - 09.07.19 - 12:05
(0) на вид все ровно. точно есть такие подразделения?
   ptiz
 
3 - 09.07.19 - 12:08
(0) "ВЫБРАТЬ
    |    ПЕРВЫЕ 1" - может нет данных по этому подразделению?
   ComradeKite
 
4 - 09.07.19 - 12:10
2, 3 Сто пудов есть, я же отладчиком смотрел)) 
В том то и дело что ровно, но не срабатывает.
   ComradeKite
 
5 - 09.07.19 - 12:13
(1) Да мне на приемнике не нужны не ссылки не элементы. Чем мне это поможет?
Мне надо чтобы список значений был взят на стороне источника и там же на стороне источника в параметры скд был вставлен.
   lodger
 
6 - 09.07.19 - 12:14
ну от балды можно потестить вместо
 ЗУП.NewObject("СписокЗначений"); 
 ЗУП.NewObject("Массив");
   ptiz
 
7 - 09.07.19 - 12:16
(4) Убери ПЕРВЫЕ и проверь.
   sitex
 
8 - 09.07.19 - 12:16
(5) На стороне источника сформировать отправить в ЗначениеВСтрокуВнутр  и потом на стороне приемника ЗначениеИзСтрокиВнутр.
   Вафель
 
9 - 09.07.19 - 12:17
можно же массив как параметр использовать
   ComradeKite
 
10 - 09.07.19 - 12:17
(6)Делал. не работает, даже делал так, не список значений а просто элемент передавал, соответственно в наборе ставил равно а не "В".
Не хочет(или я не могу) передавать объект.
 
 Рекламное место пустует
   Вафель
 
11 - 09.07.19 - 12:17
массив нормально должен через ком передаваться
   ComradeKite
 
12 - 09.07.19 - 12:18
(9) можно, вот что букварь говорит

Объектные типы
Все остальные типы данных, определенные в 1С:Предприятии, в том числе и коллекции значений, являются объектами и преобразуются к типу VT_DISPATCH структуры VARIANT.

С другой стороны, при получении 1С:Предприятием значения VARIANT типа VT_DISPATCH, оно будет преобразовано в значение типа COMОбъект, набор свойств и методов которого будет совпадать с набором свойств и методов объекта, указатель на который содержался в VARIANT типа VT_DISPATCH. Работа с таким объектом может выполняться только через предоставляемые им свойства и методы, кроме оператора Для Каждого ....

Однако, в том случае, если 1С:Предприятие узнает в нем "свой" объект, VT_DISPATCH будет обратно преобразован в исходный объект 1С:Предприятия и его можно будет использовать так, как любой другой объект 1С:Предприятия этого же типа (оператор Для Каждого ..., обращения по индексу, встроенные функции Строка(), Тип() и т.д.).

1С:Предприятие или COM-соединение, подсоединенное к некоторой информационной базе,  распознает объект как "свой" только в том случае, если он был создан этим же подсоединением к информационной базе. Например, если из COM-соединения получить элемент справочника и передать этот элемент справочника в качестве параметра какого-нибудь метода объекта, полученного из этого же COM-соединения, то при выполнении этого метода объект будет распознан как "свой". Объект, полученный из другого соединения с информационной базой, не будет распознан как "свой".

Такое поведение объектов 1С:Предприятия объясняется тем, что большинство объектов 1С:Предприятия используют свой экземпляр контекста информационной базы, из которой они получены, и в другом экземпляре контекста информационной базы они "своими" не являются. Каждое приложение 1С:Предприятия и каждый экземпляр COM-соединения поддерживает свой экземпляр контекста информационной базы. Поэтому объекты 1С:Предприятия не распознаются как "свои" не в том приложении 1С:Предприятия или экземпляре COM-соединения, в котором они были созданы.
   ComradeKite
 
13 - 09.07.19 - 12:19
Я так и делаю, передаю ему "свой" объект подразделение. Не взлетает. Простой тип отработает сто пудов, я дату передавал, а объект не хочет.
   Вафель
 
14 - 09.07.19 - 12:20
так ссылку так не передашь
   sitex
 
15 - 09.07.19 - 12:21
(14) ну в виде строки если только
   ComradeKite
 
16 - 09.07.19 - 12:23
(14)Ну у меня не ссылка а COM объект.
Типа по логике, я беру создаю СписокПодразделений =ЗУП.NewObject("СписокЗначений"); 
И в него запихиваю результат запроса, который содержит Comобъекты.
По документации все эти com объекты должны при выполнении стать ссылками
   lodger
 
17 - 09.07.19 - 12:24
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СписокПодразделений",  Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение "));
   ComradeKite
 
18 - 09.07.19 - 12:24
(15) Я понимаю о чем ты говоришь, я могу например Code у Com объекта получить и найти в справочнике по коду. Но это если мне надо в приемнике работать с этим. Мне не надо
   sitex
 
19 - 09.07.19 - 12:32
(18) вообще я не о том говорил, ну да ладно.
   ComradeKite
 
20 - 09.07.19 - 12:38
(17) Попробовал, не работает. Твой код правилен, но значения не применяются к схеме.
(18) Может ты об этом говорил? СписокПодразделений.Добавить(ЗУП.Справочники.ПодразделениеОрганизации.НайтиПоКоду(ЭлементЗапроса.Code))
Ну я так тоже делал.
   ComradeKite
 
21 - 09.07.19 - 12:39
Сорри не тот номер указал))
(19) Может ты об этом говорил? СписокПодразделений.Добавить(ЗУП.Справочники.ПодразделениеОрганизации.НайтиПоКоду(ЭлементЗапроса.Code))
Ну я так тоже делал.
   Вафель
 
22 - 09.07.19 - 12:40
(21) а точно находит?
   Вафель
 
23 - 09.07.19 - 12:41
но лучше конечно сделать экспортную процедуру и пусть она самм с СКД возится.
можно в расширении
   lodger
 
24 - 09.07.19 - 12:42
(20) бурда какая-то
поставь точку остановки на Настройки.ПараметрыДанных.УстановитьЗначениеПараметра
и приведи чему равно Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0);
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0).ссылка;
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0).код;
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0).наименование;
   ComradeKite
 
25 - 09.07.19 - 12:46
(22) Находит точно, я же из этого справочника их и беру. Ну и если просто запустить ЗУП.Справочники.ПодразделениеОрганизации.НайтиПоКоду(ЭлементЗапроса.Code)
результатом будет COM объект с данными, в отладчике все нормально, данные есть.
(23) та на самом деле отчет термоядерный, кучу данных обрабатывает. Я хотел чтобы не переделывать его. ну и не городить внешние процедуры, просто запустить его, получить ТЗ, перегнать ТЗ на приемник, добавить дополнительными данными и сформировать отчет.

Почитал  документацию, вроде реально такое провернуть, но вот с параметрами что то не то.
   ComradeKite
 
26 - 09.07.19 - 12:55
(24) Так сделал данные есть,
в первом и втором случае это ссылка
в 3 и 4 случае код и наименование выводится

[url=https://radikal.ru][img]https://d.radikal.ru/d15/1907/b6/4cd748c0f766.jpg[/img][/url]
   ComradeKite
 
27 - 09.07.19 - 12:55
   ComradeKite
 
28 - 09.07.19 - 12:56
   ComradeKite
 
29 - 09.07.19 - 13:57
Может у кого есть пример работающий?
Запрос кстати тоже не работает, вот по этому примеру
https://wiseadvice-it.ru/o-kompanii/blog/articles/com-soedinenie-v-1s-8-3/
Не передается массив подразделений.
   hhhh
 
30 - 09.07.19 - 15:48
(29) может имена переменных совпадают? посмотри нет ли у тебя переменных с такими же именами? например, СписокПодразделений - реквизит формы, или еще что-нибудь.
   hhhh
 
31 - 09.07.19 - 15:49
(30) + или ДанныеТЗ
   ptiz
 
32 - 09.07.19 - 15:53
(29) С параметром-массивом точно никаких проблем - у меня работает.
   ptiz
 
33 - 09.07.19 - 15:54
(30) +1
проверить нет ли реквизита с именем "СписокПодразделений"
 
 
   ComradeKite
 
34 - 09.07.19 - 16:15
Переменные поменял, не помогло.
А может быть что у меня винда 10 64 и я через com+ оборачивал 32 разрядную com dll ку и может что то не так намутил?
Попробую посмотреть как типовая подключается, там оборачивать не надо же.
   Daluvan
 
35 - 09.07.19 - 16:26
(34) Объясните мне пжлста. сомобъекты целиком не преобразуются в ссылку другого объекта. они же считываются простыми типами, как код объекта, наименование итд.
   ComradeKite
 
36 - 09.07.19 - 16:52
(35) Это так если ты хочешь данные из источника найти в приемнике, тогда через код, ссылку ты не перекинешь из источника в приемник. Можно получить "Код" из источника и поискать по коду элемент в приемнике или создать новую ссылку. Но мне ссылка не нужна, мне надо применить некий список значений к отчету в источнике значениями из источника же.

Вообщем как выяснил у меня вообще не передаются, даже простые типы.

Вот отчет в источнике
ВЫБРАТЬ
    ПодразделенияОрганизаций.Ссылка,
    &СпПодразделений КАК Код
ИЗ
    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
================================
вот вызываю код в приемнике. Передаю в параметр "12345" и не работает.

    ЗУП = ПодключениеКБазе1С("C:\Users\Artem\Documents\InfoBase2", "Administrator", "", ""); 
    СхемаКомпоновкиДанных = ЗУП.Отчеты.Отчет1.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    КомпоновщикНастроекНастройки = ЗУП.NewObject("КомпоновщикНастроекКомпоновкиДанных");
     ИсточникДоступныхНастроекКомпоновкиДанных =  ЗУП.NewObject("ИсточникДоступныхНастроекКомпоновкиДанных",СхемаКомпоновкиДанных);
    КомпоновщикНастроекНастройки.Инициализировать(ИсточникДоступныхНастроекКомпоновкиДанных);
    КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    Настройки = КомпоновщикНастроекНастройки.ПолучитьНастройки();
        
    Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СпПодразделений", "12345");

    КомпоновщикМакета = ЗУП.NewObject("КомпоновщикМакетаКомпоновкиДанных");
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекНастройки.Настройки,,,ЗУП.NewObject("ОписаниеТипов", "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений").Типы().Получить(0));
    ПроцессорКомпоновкиДанных = ЗУП.NewObject("ПроцессорКомпоновкиДанных");
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
    
    ПроцессорВывода = ЗУП.NewObject("ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений");
    
    ДанныеТЗ333 = ЗУП.NewObject("ТаблицаЗначений");
    ПроцессорВывода.УстановитьОбъект(ДанныеТЗ333);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
   ComradeKite
 
37 - 09.07.19 - 16:56
Данные есть, но в поле код "" вместо "12345"
https://a.radikal.ru/a00/1907/36/8d83b4e6629c.jpg
   Daluvan
 
38 - 09.07.19 - 17:04
(37) А разве по ком можно в обе стороны передать? а можно код передачи
   Карст
 
39 - 09.07.19 - 17:23
передавай строку с разделителями )))))  а там разбирай и заполняй
   ComradeKite
 
40 - 09.07.19 - 18:09
В 36 пробую передать простой тип 12345. Не срабатывает. То есть строка тоже не передается)))
   ComradeKite
 
41 - 09.07.19 - 22:00
Ошибка была вот в этой строке
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекНастройки.Настройки,,,ЗУП.NewObject("ОписаниеТипов", "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений").Типы().Получить(0));

Настройки вот такие "КомпоновщикНастроекНастройки.Настройки"
а надо "Настройки"

Всем спасибо за участие, все работает!
   FIXXXL
 
42 - 10.07.19 - 08:33
МАССИВДайсонComObject = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(); 
пробовал?
   FIXXXL
 
43 - 10.07.19 - 08:33
(42) +
МАССИВДайсонComObject = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение");
   gopile
 
44 - 10.07.19 - 09:12
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра( - а если так установить параметр, то будет работать не переделывая как в (41)?
   ComradeKite
 
45 - 10.07.19 - 13:46
(44) Конечно будет, (42,43) будет работать и так.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует