Имя: Пароль:
1C
1С v8
Как выбрать COMОбъект из ТЗ в запросе?
0 s-n-a-y
 
03.03.15
08:13
Пишу такой код:
    тз = новый ТаблицаЗначений;
    Описание = Новый ОписаниеТипов("COMОбъект");    
    тз.Колонки.Добавить("Данные", Описание);
    Запрос.Текст =    
    "ВЫБРАТЬ
    |    Таблица.Данные
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    |    &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Таблица.Данные
    |ИЗ
    |    Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ Таблица";    
    Запрос.УстановитьПараметр("Таблица", тз);
    ТабличнаяЧасть = Запрос.Выполнить().Выгрузить();
пишет: "Тип не может быть выбран в запросе"
А как надо?
1 s-n-a-y
 
03.03.15
08:15
пишет: "Тип не может быть выбран в запросе"
А как надо?
2 Wobland
 
03.03.15
08:16
а чего ты с ним в запросе собрался делать?
3 ShoGUN
 
03.03.15
08:17
(0) Что это за чудеса? О_О
Может тебе внешние источники данных нужны?
4 s-n-a-y
 
03.03.15
08:18
(2) я для наглядности привел упрощенный код. А вообще в тз есть еще колонки, и по одной из них мне нужно сгруппировать.
5 Wobland
 
03.03.15
08:19
(4) ну сгруппируешь. дальше?
6 ShoGUN
 
03.03.15
08:22
(5) Он видимо какие-то данные из COM-объекта хочет достать. Вопрос - почему не через (3) или не через таблицу значений на худой конец...
7 s-n-a-y
 
03.03.15
08:22
(5) дальше буду выгружать и использовать COMОбъект как ссылку на объект из другой базы (справочник Контрагенты из Бухгалтерии).
8 zulu_mix
 
03.03.15
08:23
Собирай данные из сом в локальную таблицу циклом. Локальную суй в запрос
9 s-n-a-y
 
03.03.15
08:23
вот полный код:
    тз = новый ТаблицаЗначений;
    КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя);
    ОписаниеДаты = Новый ОписаниеТипов("Дата", , ,КвалификаторыДаты);
    тз.Колонки.Добавить("Дата", ОписаниеДаты);       
    КвалификаторыСтроки = Новый КвалификаторыСтроки(255);
    ОписаниеСтроки = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);    
    тз.Колонки.Добавить("ПредставлениеДанных", ОписаниеСтроки);
    Описание = Новый ОписаниеТипов("COMОбъект");    
    тз.Колонки.Добавить("Данные", Описание);
    Для Каждого стр из ВыгруженныйЖурнал цикл
        эл = тз.Добавить();
        эл.Дата = стр.Дата;
        эл.ПредставлениеДанных = стр.ПредставлениеДанных;              
        эл.Данные = стр.Данные;              
    КонецЦикла;    
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст =    
    "ВЫБРАТЬ
    |    Таблица.Дата,
    |    Таблица.ПредставлениеДанных,
    |    Таблица.Данные
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    |    &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    МАКСИМУМ(Таблица.Дата) КАК Дата,
    |    Таблица.ПредставлениеДанных,
    |    Таблица.Данные
    |ИЗ
    |    Таблица КАК Таблица
    |
    |СГРУППИРОВАТЬ ПО
    |    Таблица.ПредставлениеДанных
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ Таблица";    
    Запрос.УстановитьПараметр("Таблица", тз);
    ТабличнаяЧасть = Запрос.Выполнить().Выгрузить();
10 ShoGUN
 
03.03.15
08:24
(7) Фиг тебе. Добавлю к этому, что вы извращенец, батенька.
11 s-n-a-y
 
03.03.15
08:25
(8) так и делаю, вроде, см (9)
12 ShoGUN
 
03.03.15
08:26
(11) Из COM-объекта можно достать только примитивные типы, ссылка тебе нафиг не нужна. Если нужен идентификатор - передавай его как строку.
13 Wobland
 
03.03.15
08:28
я чего-то не понял. автор хочет использовать поле в запросе для того, чтобы вытягивать данные из соседней базы? вот так вот Результат.КОМ.Контрагент?
14 s-n-a-y
 
03.03.15
08:29
(12) К счастью, Мне нужны только строки и числа. Они успешно извлекаются из COMОбъекта.
15 ShoGUN
 
03.03.15
08:30
(14) Почему бы их не извлечь ДО запроса? Не думал об этом?
16 ShoGUN
 
03.03.15
08:30
Если очень хочется запросом - можно запрос во внешней базе сделать.
17 ShoGUN
 
03.03.15
08:31
(13) У автора просто руки вперёд головы работают.
18 Wobland
 
03.03.15
08:32
(17) но каков полёт мысли!
19 s-n-a-y
 
03.03.15
08:35
(13) примерно так:

пусть ОбъектКонтрагентыБух - ComОбъект

    Наименование             = ОбъектКонтрагентыБух.Наименование;
    ПолноеНаименование         = ОбъектКонтрагентыБух.НаименованиеПолное;
    ИНН                     = ОбъектКонтрагентыБух.ИНН;
    КПП                     = ОбъектКонтрагентыБух.КПП;
    КодПоОКПО                = ОбъектКонтрагентыБух.КодПоОКПО;
    ЮрФизЛицо                = ОбъектКонтрагентыБух.ЮрФизЛицо;                               
    Комментарий                = ОбъектКонтрагентыБух.Комментарий;
    
    Элемент = Справочники.Корреспонденты.СоздатьЭлемент();
            
    Элемент.Наименование            = Наименование;
    Элемент.ПолноеНаименование        = ПолноеНаименование;
    Элемент.ИНН                = ИНН;
    Элемент.КПП                = КПП;
    Элемент.КодПоОКПО            = КодПоОКПО;
    Если ЮрФизЛицо = "ЮрЛицо" Тогда
        Элемент.ЮрФизЛицо            = Перечисления.ЮрФизЛицо.ЮрЛицо;
    ИначеЕсли ЮрФизЛицо = "ФизЛицо" Тогда
        Элемент.ЮрФизЛицо        = Перечисления.ЮрФизЛицо.ФизЛицо;
    КонецЕсли;
    Элемент.Комментарий            = Комментарий;
    Элемент.Записать();
20 Wobland
 
03.03.15
08:37
пусть ОбъектКонтрагентыБух - это не КОМ-подключение, а некий объект, выдающий реквизиты какого-то элемента?
21 s-n-a-y
 
03.03.15
08:38
(16) не додумался(
22 ShoGUN
 
03.03.15
08:39
(19) Достань это всё запросом во внешней базе, передай через COMSafeArray или через ЗаполнитьЗначенияСвойств, и не мучай *опу.
23 s-n-a-y
 
03.03.15
08:39
(20) ну да это объект из внешней базы, просто в отладчике это ComОбъект
24 s-n-a-y
 
03.03.15
08:41
(22) буду пробовать
25 s-n-a-y
 
03.03.15
09:03
(22) если можно, скажите заодно, как мне это определить в другой базе?
       
    КвалификаторыСтроки = Новый     КвалификаторыСтроки(255);
    ОписаниеСтроки = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);    

В СП написано, что NewObject() принимает только один параметр
т.е. я пишу V8_Бух.NewObject("ОписаниеТипов"), а как мне передать параметр в конструктор?
26 ShoGUN
 
03.03.15
09:07
(25) Хреновая документация у 1С :( Через запятую, после первого параметра.
NewObject("КвалификаторыСтроки", 255), и т.д.
27 s-n-a-y
 
03.03.15
09:08
(26) ок
28 Wobland
 
03.03.15
09:09
двоечник

Примечание:

Последующие параметры метода те же, что у конструктора объекта, имя которого указано в качестве значения первого параметра.
29 ShoGUN
 
03.03.15
09:11
(28) Это не он виноват, это документация подкачала.
30 Wobland
 
03.03.15
09:18
(29) что, не сказали про другие параметры?
31 ShoGUN
 
03.03.15
09:20
(30) В сигнатуре не указали, что они вообще есть.
32 Wobland
 
03.03.15
09:20
(31) ну да, недочёт
Основная теорема систематики: Новые системы плодят новые проблемы.