Имя: Пароль:
1C
1С v8
обработка результата запроса по СОМ-соединению
,
0 Black Dragon
 
13.12.13
14:45
Доброго дня!

Есть такой код:
    
ConnectString = "File=" + ПутьИнфБазы + ";" + "Usr=" + ИмяПользователя + ";" + "Pwd=" + ПарольПользователя;
    V82 = Новый COMObject("V82.COMConnector");
    Попытка
        Соединение = V82.Connect(ConnectString);
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Сообщить("Соединение успешно установлено!");
    
    ЗапросСОМ = Соединение.newObject("Запрос");
    ЗапросСОМ.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ХозрасчетныйОбороты.*
        |ИЗ";
    СписокСубконто = Новый СписокЗначений;
    Если ЗначениеЗаполнено(ВыбСчет) Тогда
        Если ЗначениеЗаполнено(ЭлементыФормы.Субконто1.Значение) Тогда
            СписокСубконто.Добавить(ЭлементыФормы.Субконто1.Значение);
        КонецЕсли;
        Если ЗначениеЗаполнено(ЭлементыФормы.Субконто2.Значение) Тогда
            СписокСубконто.Добавить(ЭлементыФормы.Субконто2.Значение);
        КонецЕсли;
        Если ЗначениеЗаполнено(ЭлементыФормы.Субконто3.Значение) Тогда
            СписокСубконто.Добавить(ЭлементыФормы.Субконто3.Значение);
        КонецЕсли;
        Если СписокСубконто.Количество() > 0 Тогда
            ЗапросСОМ.УстановитьПараметр("Списоксубконто",СписокСубконто);
            ЗапросСОМ.Текст = ЗапросСОМ.Текст + "
            |    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода,&КонецПериода,Регистратор,Счет.Код = &Счет.Код,) КАК ХозрасчетныйОбороты";
        Иначе
            ЗапросСОМ.Текст = ЗапросСОМ.Текст + "
            |    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода,&КонецПериода,Регистратор,Счет В ИЕРАРХИИ (&Счет),) КАК ХозрасчетныйОбороты";
        КонецЕсли;
    Иначе
        ЗапросСОМ.Текст = ЗапросСОМ.Текст + "
        |    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода,&КонецПериода,Регистратор,) КАК ХозрасчетныйОбороты";
    КонецЕсли;
    ЗапросСОМ.УстановитьПараметр("НачалоПериода",Дата1);
    ЗапросСОМ.УстановитьПараметр("КонецПериода", Дата2);
    СчетСОМ = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду(ВыбСчет.Код);
    ЗапросСОМ.УстановитьПараметр("Счет", СчетСОМ);
    ВыборкаСОМ = ЗапросСОМ.Выполнить().Выбрать();
    Сообщить("Получено " + ВыборкаСОМ.Количество() + " записей!");
    ТабРезультатов2.Колонки.Добавить("Период");
    ТабРезультатов2.Колонки.Добавить("Организация");
    ТабРезультатов2.Колонки.Добавить("Счет");
    ТабРезультатов2.Колонки.Добавить("Субконто1");
    ТабРезультатов2.Колонки.Добавить("Субконто2");
    ТабРезультатов2.Колонки.Добавить("Субконто3");
    ТабРезультатов2.Колонки.Добавить("КорСчет");
    ТабРезультатов2.Колонки.Добавить("КорСубконто1");
    ТабРезультатов2.Колонки.Добавить("КорСубконто2");
    ТабРезультатов2.Колонки.Добавить("КорСубконто3");
    ТабРезультатов2.Колонки.Добавить("КоличествоОборот");
    ТабРезультатов2.Колонки.Добавить("КоличествоОборотДт");
    ТабРезультатов2.Колонки.Добавить("КоличествоОборотКт");
    ТабРезультатов2.Колонки.Добавить("СуммаОборот");
    ТабРезультатов2.Колонки.Добавить("СуммаОборотДт");
    ТабРезультатов2.Колонки.Добавить("СуммаОборотКт");
    Пока ВыборкаСОМ.Следующий() Цикл
        НоваяСтрока = ТабРезультатов2.Добавить();
        НоваяСтрока.Период = ВыборкаСОМ.Period;
        НоваяСтрока.Организация = ВыборкаСОМ.Организация.НаименованиеСокращенное;
        НоваяСтрока.Счет = ВыборкаСОМ.Account.Code;
        НоваяСтрока.Субконто1 = ВыборкаСОМ.ExtDimension1.Name;
        НоваяСтрока.Субконто2 = ВыборкаСОМ.ExtDimension2.Name;
        НоваяСтрока.Субконто3 = ВыборкаСОМ.ExtDimension3.Name;
        НоваяСтрока.КорСчет = ВыборкаСОМ.BalancedAccount.Code;
        НоваяСтрока.КорСубконто1 = ВыборкаСОМ.BalancedDimension1.Name;
        НоваяСтрока.КорСубконто2 = ВыборкаСОМ.BalancedDimension2.Name;
        НоваяСтрока.КорСубконто3 = ВыборкаСОМ.BalancedDimension3.Name;
        НоваяСтрока.КоличествоОборот = ВыборкаСОМ.КоличествоTurnover;
        НоваяСтрока.КоличествоОборотДт = ВыборкаСОМ.КоличествоTurnoverDr;
        НоваяСтрока.КоличествоОборотКт = ВыборкаСОМ.КоличествоTurnoverCr;
        НоваяСтрока.СуммаОборот = ВыборкаСОМ.СуммаTurnover;
        НоваяСтрока.СуммаОборотДт = ВыборкаСОМ.СуммаTurnoverDr;
        НоваяСтрока.СуммаОборотКт = ВыборкаСОМ.СуммаTurnoverCr;
    КонецЦикла;

...и тут ошибка при добавлении колонки с именем Период! Однако при выполнении подобного запроса с локальной базой все отрабатывает нормально, и колонка период присутствует!

В чем подвох может быть?
1 Black Dragon
 
13.12.13
14:52
Еще важное, наверное, замечание:

ТабРезультатов2 - элемент формы, форма обычная, неуправляемая, платформа 8.2.18.82, конфиг КА 1.1.29.1
2 hhhh
 
13.12.13
14:55
ошибка-то какая?
3 Black Dragon
 
13.12.13
14:59
Оопс! это другая! сорри!

{Форма.Форма.Форма(206)}: Поле объекта не обнаружено (Name)
        НоваяСтрока.Субконто1 = ВыборкаСОМ.ExtDimension1.Name;
4 Black Dragon
 
13.12.13
15:07
А как реквизит Наименование будет? Description это что?
5 hhhh
 
13.12.13
15:09
(3) ну

Если ЗначениеЗаполнено(ВыборкаСОМ.ExtDimension1) Тогда
    НоваяСтрока.Субконто1 = ВыборкаСОМ.ExtDimension1.Name;
КонецЕсли;
6 hhhh
 
13.12.13
15:10
но всё равно там пусто будет, потому что вы строку пытаетесь в субконто запихнуть.
7 Black Dragon
 
13.12.13
15:11
Где субконто? это же колонка таблицы значений, причем не типизированная!
8 hhhh
 
13.12.13
15:14
ну тогда ладно
9 Black Dragon
 
13.12.13
15:16
Странно как-то получается = была ошибка добавления колонки в ТЗ с именем Период, а теперь все нормально! И дважды добавляться не должны были колонки!
10 hhhh
 
13.12.13
15:16
а такие вещи как

ВыборкаСОМ.ExtDimension1.Name

надо в запросе вытаскивать. А так у вас типичные запросы в цикле получаются, значения через 2 точки
11 Black Dragon
 
13.12.13
15:19
(10) ???

это же объект со своими реквизитами! какой еще типичный запрос в цикле?
12 Black Dragon
 
13.12.13
15:22
где про это написано? чего почитать?
13 hhhh
 
13.12.13
15:24
ВыборкаСОМ.ExtDimension1 это ссылка, а не объект, поля Name нету в нем.

Когда пишете ВыборкаСОМ.ExtDimension1.Name программа фигачит запрос к базе и уже достает объект. А так как у вас это в цикле, то 1с это назвала "запросы в цикле". И за это сразу расстреливает на экзамене по спецу.
14 Black Dragon
 
13.12.13
15:26
интересно! поля нету! зато есть другое поле Наименование! по ссылке есть доступ к реквизитам!
15 Black Dragon
 
13.12.13
15:27
сертификат получал недавно?
16 hhhh
 
13.12.13
15:30
(14) доступ - это вообще из другой оперы. ОН есть, этот доступ, но ссылка - это ГУИД просто, 2 байта, адрес, никаких полей в ней нет и быть не может.
17 Black Dragon
 
13.12.13
15:36
если бы разрабы типовых конф так писали - счастье бы наступило еще вчера!
18 Михаил Козлов
 
13.12.13
15:53
Вызывает подозрение "ЗапросСОМ.УстановитьПараметр("Списоксубконто",СписокСубконто);": списокСубконто не COM объект.
19 Black Dragon
 
13.12.13
16:15
(18) я этим не пользуюсь - копипаст лакального запроса :)
20 wowik
 
13.12.13
16:18
(18) +100
21 wowik
 
13.12.13
16:19
22 Black Dragon
 
13.12.13
16:19
кто подскажет как проверить заполненность СОМ-объекта? то что тут предлагалось вида
Если ЗначениеЗаполнено(ВыборкаСОМ.ExtDimension1) Тогда
    НоваяСтрока.Субконто1 = ВыборкаСОМ.ExtDimension1.Name;
КонецЕсли;
нельзя использовать - мутабельное значение!
23 Михаил Козлов
 
13.12.13
16:21
Если не NULL, то скорее всего Ссылка.
24 wowik
 
13.12.13
16:24
Соединение.ЗначениеЗаполнено(...
25 Black Dragon
 
13.12.13
16:47
BalancedDimension = КоррСубконто? да?
26 Black Dragon
 
13.12.13
16:47
не пойму таки почему не могу взять наименование...