Имя: Пароль:
1C
1С v8
Список значений через Com
,
0 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 объекты, которые другая сторона должна распознать как свои и преобразовать автоматически в ссылки подразделений, а не распознает однако.

Как все таки заставить сработать условие?
1 sitex
 
naïve
09.07.19
11:56
(0) подсказка смотри в сторону ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр;
2 gopile
 
09.07.19
12:05
(0) на вид все ровно. точно есть такие подразделения?
3 ptiz
 
09.07.19
12:08
(0) "ВЫБРАТЬ
    |    ПЕРВЫЕ 1" - может нет данных по этому подразделению?
4 ComradeKite
 
09.07.19
12:10
2, 3 Сто пудов есть, я же отладчиком смотрел))
В том то и дело что ровно, но не срабатывает.
5 ComradeKite
 
09.07.19
12:13
(1) Да мне на приемнике не нужны не ссылки не элементы. Чем мне это поможет?
Мне надо чтобы список значений был взят на стороне источника и там же на стороне источника в параметры скд был вставлен.
6 lodger
 
09.07.19
12:14
ну от балды можно потестить вместо
ЗУП.NewObject("СписокЗначений");
ЗУП.NewObject("Массив");
7 ptiz
 
09.07.19
12:16
(4) Убери ПЕРВЫЕ и проверь.
8 sitex
 
naïve
09.07.19
12:16
(5) На стороне источника сформировать отправить в ЗначениеВСтрокуВнутр  и потом на стороне приемника ЗначениеИзСтрокиВнутр.
9 Вафель
 
09.07.19
12:17
можно же массив как параметр использовать
10 ComradeKite
 
09.07.19
12:17
(6)Делал. не работает, даже делал так, не список значений а просто элемент передавал, соответственно в наборе ставил равно а не "В".
Не хочет(или я не могу) передавать объект.
11 Вафель
 
09.07.19
12:17
массив нормально должен через ком передаваться
12 ComradeKite
 
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-соединения, в котором они были созданы.
13 ComradeKite
 
09.07.19
12:19
Я так и делаю, передаю ему "свой" объект подразделение. Не взлетает. Простой тип отработает сто пудов, я дату передавал, а объект не хочет.
14 Вафель
 
09.07.19
12:20
так ссылку так не передашь
15 sitex
 
naïve
09.07.19
12:21
(14) ну в виде строки если только
16 ComradeKite
 
09.07.19
12:23
(14)Ну у меня не ссылка а COM объект.
Типа по логике, я беру создаю СписокПодразделений =ЗУП.NewObject("СписокЗначений");
И в него запихиваю результат запроса, который содержит Comобъекты.
По документации все эти com объекты должны при выполнении стать ссылками
17 lodger
 
09.07.19
12:24
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СписокПодразделений",  Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение "));
18 ComradeKite
 
09.07.19
12:24
(15) Я понимаю о чем ты говоришь, я могу например Code у Com объекта получить и найти в справочнике по коду. Но это если мне надо в приемнике работать с этим. Мне не надо
19 sitex
 
naïve
09.07.19
12:32
(18) вообще я не о том говорил, ну да ладно.
20 ComradeKite
 
09.07.19
12:38
(17) Попробовал, не работает. Твой код правилен, но значения не применяются к схеме.
(18) Может ты об этом говорил? СписокПодразделений.Добавить(ЗУП.Справочники.ПодразделениеОрганизации.НайтиПоКоду(ЭлементЗапроса.Code))
Ну я так тоже делал.
21 ComradeKite
 
09.07.19
12:39
Сорри не тот номер указал))
(19) Может ты об этом говорил? СписокПодразделений.Добавить(ЗУП.Справочники.ПодразделениеОрганизации.НайтиПоКоду(ЭлементЗапроса.Code))
Ну я так тоже делал.
22 Вафель
 
09.07.19
12:40
(21) а точно находит?
23 Вафель
 
09.07.19
12:41
но лучше конечно сделать экспортную процедуру и пусть она самм с СКД возится.
можно в расширении
24 lodger
 
09.07.19
12:42
(20) бурда какая-то
поставь точку остановки на Настройки.ПараметрыДанных.УстановитьЗначениеПараметра
и приведи чему равно Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0);
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0).ссылка;
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0).код;
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Подразделение").получить(0).наименование;
25 ComradeKite
 
09.07.19
12:46
(22) Находит точно, я же из этого справочника их и беру. Ну и если просто запустить ЗУП.Справочники.ПодразделениеОрганизации.НайтиПоКоду(ЭлементЗапроса.Code)
результатом будет COM объект с данными, в отладчике все нормально, данные есть.
(23) та на самом деле отчет термоядерный, кучу данных обрабатывает. Я хотел чтобы не переделывать его. ну и не городить внешние процедуры, просто запустить его, получить ТЗ, перегнать ТЗ на приемник, добавить дополнительными данными и сформировать отчет.

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

[url=https://radikal.ru][img]https://d.radikal.ru/d15/1907/b6/4cd748c0f766.jpg[/img][/url]
27 ComradeKite
 
09.07.19
12:55
28 ComradeKite
 
09.07.19
12:56
29 ComradeKite
 
09.07.19
13:57
Может у кого есть пример работающий?
Запрос кстати тоже не работает, вот по этому примеру
https://wiseadvice-it.ru/o-kompanii/blog/articles/com-soedinenie-v-1s-8-3/
Не передается массив подразделений.
30 hhhh
 
09.07.19
15:48
(29) может имена переменных совпадают? посмотри нет ли у тебя переменных с такими же именами? например, СписокПодразделений - реквизит формы, или еще что-нибудь.
31 hhhh
 
09.07.19
15:49
(30) + или ДанныеТЗ
32 ptiz
 
09.07.19
15:53
(29) С параметром-массивом точно никаких проблем - у меня работает.
33 ptiz
 
09.07.19
15:54
(30) +1
проверить нет ли реквизита с именем "СписокПодразделений"
34 ComradeKite
 
09.07.19
16:15
Переменные поменял, не помогло.
А может быть что у меня винда 10 64 и я через com+ оборачивал 32 разрядную com dll ку и может что то не так намутил?
Попробую посмотреть как типовая подключается, там оборачивать не надо же.
35 Daluvan
 
09.07.19
16:26
(34) Объясните мне пжлста. сомобъекты целиком не преобразуются в ссылку другого объекта. они же считываются простыми типами, как код объекта, наименование итд.
36 ComradeKite
 
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);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
37 ComradeKite
 
09.07.19
16:56
Данные есть, но в поле код "" вместо "12345"
https://a.radikal.ru/a00/1907/36/8d83b4e6629c.jpg
38 Daluvan
 
09.07.19
17:04
(37) А разве по ком можно в обе стороны передать? а можно код передачи
39 Карст
 
09.07.19
17:23
передавай строку с разделителями )))))  а там разбирай и заполняй
40 ComradeKite
 
09.07.19
18:09
В 36 пробую передать простой тип 12345. Не срабатывает. То есть строка тоже не передается)))
41 ComradeKite
 
09.07.19
22:00
Ошибка была вот в этой строке
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекНастройки.Настройки,,,ЗУП.NewObject("ОписаниеТипов", "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений").Типы().Получить(0));

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

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