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

Не получается запрос через COMОбъект.

Не получается запрос через COMОбъект.
Я
   dark70
 
19.02.21 - 21:09
Вытаскиваю сальдо из другой базы по списку счетов (60,62,76) и еще обороты (т.е. оплату) в корреспонденции с 51.
Все нормально. Тут понадобилось получать сальдо по сч. 10.07. Не только для тех контрагентов которые имеют или обороты или сальдо по списку счетов(60,62,76), но и
сальдо на 10.07
Добавил в запрос еще одну таблицу. В базе откуда запускается, все нормально вытаскивается. А вот из удаленной базы не могу получить Выборка.Сальдо_1007 , почему то NULL.

сам текст запроса
Запрос=Connection.NewObject("Запрос");
    Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК НамДолжны,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокКт, 0) КАК МыДолжны,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1.Наименование, ХозрасчетныйОбороты.Субконто1.Наименование) КАК Контрагент,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1.Родитель.Наименование, ХозрасчетныйОбороты.Субконто1.Родитель.Наименование) КАК Родитель,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1.ИНН, ХозрасчетныйОбороты.Субконто1.ИНН) КАК ИНН,
    |    ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотДт, 0) КАК Оплата,
    |    NULL КАК Сальдо_1007
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет В ИЕРАРХИИ (&ДругойСписокСчетов), , ) КАК ХозрасчетныйОстатки
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&ОплатаС, &ОплатаПо, , Счет В ИЕРАРХИИ (&ДругойСписокСчетов), , , КорСчет = &РасчетныйСчет, ) КАК ХозрасчетныйОбороты
    |        ПО ХозрасчетныйОстатки.Субконто1 = ХозрасчетныйОбороты.Субконто1
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    NULL,
    |    NULL,
    |    Хозрасчетный_1007.Субконто1.Наименование,
    |    NULL,
    |    NULL,
    |    NULL,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = &Счет_1007, , ) КАК Хозрасчетный_1007" ;


тут более наглядно https://s8.hostingkartinok.com/uploads/images/2021/02/c1d6e83990be1713d31888421a46cf34.jpg

В чем может быть причина ?
   dark70
 
1 - 19.02.21 - 21:15
абсолютно такой же запрос, за исключением того, что получаю не наименования, а ссылки
Текст = 
    "ВЫБРАТЬ
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1, ХозрасчетныйОбороты.Субконто1) КАК Контрагент,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК НамДолжны,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокКт, 0) КАК МыДолжны,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1.Наименование, ХозрасчетныйОбороты.Субконто1.Наименование) КАК Наименование,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1.Родитель.Наименование, ХозрасчетныйОбороты.Субконто1.Родитель.Наименование) КАК Родитель,
    |    ЕСТЬNULL(ХозрасчетныйОстатки.Субконто1.ИНН, ХозрасчетныйОбороты.Субконто1.ИНН) КАК ИНН,
    |    ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотДт, 0) КАК Оплата,
    |    NULL КАК Сальдо_1007
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ХозрасчетныйОстатки
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&ОплатаС, &ОплатаПо, , Счет В ИЕРАРХИИ (&СписокСчетов), , , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета), ) КАК ХозрасчетныйОбороты
    |        ПО ХозрасчетныйОстатки.Субконто1 = ХозрасчетныйОбороты.Субконто1
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    Хозрасчетный_1007.Субконто1,
    |    NULL,
    |    NULL,
    |    NULL,
    |    NULL,
    |    NULL,
    |    NULL,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку), , ) КАК Хозрасчетный_1007"    ;
прекрасно работает в текущей базе.
   ГдеСобакаЗарыта
 
2 - 19.02.21 - 21:23
Параметры запроса вестимо не правильно заполнил. Покажи код где параметры устанавливаешь
   dark70
 
3 - 19.02.21 - 21:34
Не, параметры правильные.
Счет_1007 = Connection.ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.07");
   dark70
 
4 - 19.02.21 - 21:38
Пока не добавлял
 |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    NULL,
    |    NULL,
    |    Хозрасчетный_1007.Субконто1.Наименование,
    |    NULL,
    |    NULL,
    |    NULL,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = &Счет_1007, , ) КАК Хозрасчетный_1007" ;

все нормально работало. 
Сейчас понатыкал в коде получения выборки

        Если НЕ Выборка.Сальдо_1007=NULL  тогда
            Стр.ДавальческийОстаток = Стр.ДавальческийОстаток + ВЫборка.Сальдо_1007;
        КонецЕсли;
Заработало. 
Но фигня какая-то, почему через COM не работает ЕСТЬNULL ?
   ГдеСобакаЗарыта
 
5 - 19.02.21 - 21:47
Чего бы это не работать ЕСТЬNULLу? Это ты где-то обманываешь. В записях первого запроса у тебя NULL, в записях второго числа (если есть записи). Что тебя не устраивает?
   ГдеСобакаЗарыта
 
6 - 19.02.21 - 21:51
Может тебе надо 0 КАК Сальдо_1007?
   dark70
 
7 - 19.02.21 - 22:03
   DrZombi
 
8 - 19.02.21 - 22:15
(0) Зачем тут "ПОЛНОЕ СОЕДИНЕНИЕ"?         (Странная конструкция)
Почему тут все в ЕстьNull "ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0) "?   (Из-за странной конструкции, еще все странней)
А это что за чудо "ХозрасчетныйОстатки.Субконто1.Наименование"?     (Таки по ссылке из другой базы можно все что угодно получить)
Это помогает "NULL,"?      (Удобнее использовать Неопределено)
   DrZombi
 
9 - 19.02.21 - 22:18
(4) "ЕСТЬNULL " - все работает, в запросе.
А вот в цикле, вам бы запустить отладчик.

Попробуй отладчик запустить, помогает :)
   DrZombi
 
10 - 19.02.21 - 22:19
(3) Таки, на удаленной базе тоже можно запросом получать параметры. :)
   youalex
 
11 - 19.02.21 - 22:21
(0) сделай экспортную функцию в "базе, откуда запускается", и тяни данные через нее.
   DrZombi
 
12 - 19.02.21 - 22:21
+ Проблемы, доп. проблемы:
1. Параметр "НаДату" может содержать неправильные данные.
2. Как вам сказали, вы не получили счета.
3. На удаленной базе, нет данных.
4. Запрос, чет странноватый... Не наблюдал такое творение
   DrZombi
 
13 - 19.02.21 - 22:21
(11) Зачем?
   youalex
 
14 - 19.02.21 - 22:29
(13) Чтобы не смешивать контексты, чтобы не держать коннект, чтобы была возможность отладки в контексте источника. Первое что в голову пришло.
   dark70
 
15 - 19.02.21 - 22:29
1) "Зачем тут "ПОЛНОЕ СОЕДИНЕНИЕ"?         (Странная конструкция)"
надо получать строки если есть или обороты или сальдо.
2) "А это что за чудо "ХозрасчетныйОстатки.Субконто1.Наименование"?"
Я сначала заполняю таблицу значений контрагентами из основной базы, потом туда подтягиваю контрагентов из удаленной базы.
А если контрагент не найден в удаленной базе ? Поэтом и пихаю в таблицу значений наименования контрагентов удаленной базы.
3) Параметр "НаДату" может содержать неправильные данные.
Все там правильно. Я же говорю, пока не добавил (сообщение 4), все нормально работало.
4) Как вам сказали, вы не получили счета.
Получил. Иначе почему в выборке как только понаставил проверку на ЕстьNULL, все заработало. Сравнивал потом с ОСВ удаленной базы.
5) Запрос, чет странноватый... Не наблюдал такое творение
Выше скрин делал, там понятно почему такой запрос.
   dark70
 
16 - 19.02.21 - 22:30
"Поэтом и пихаю в таблицу значений наименования контрагентов удаленной базы."
Имелось ввиду, что при заполнении таблицы значений я проверяю сначала по ИНН соответствие контрагентов из разных баз, потом уже по наименованию.
   ГдеСобакаЗарыта
 
17 - 19.02.21 - 22:32
(7) Что значит как? Ни разу не пробовал текст запроса руками править? Только конструктором?
   DrZombi
 
18 - 19.02.21 - 22:34
+ (0) Вот так получают по ссылкам.
                пГУИД_Строкой = СокрЛП(ПолучитьГУИД_ЭлементаCOM(ОЛЕ_ССылка,БазаИсточник));
        Наименование_ЗУП = ПолучитьПредставлениеПоСсылке(COM_Выборка_ФизЛица.Ссылка, БазаИсточник);

                ССылкаДок = ПолучитьЭлементБД(пГУИД_Строкой,"РеализацияТоваровУслуг");//



Функции:

Функция ПолучитьГУИД_ЭлементаCOM(COM_Ссылка,БазаИсточник)
    
    //Если передать NULL, то будет вызвано исключение, и функция вернет пустую строку...

    Попытка
        Возврат Строка(БазаИсточник.String(COM_Ссылка.УникальныйИдентификатор()));
    Исключение
        Возврат "";
    КонецПопытки;
    
КонецФункции

Функция ПолучитьПредставлениеПоСсылке(COM_Значение,БазаИсточник)
    
    Возврат Строка(БазаИсточник.String(COM_Значение));
    
КонецФункции


Функция ПолучитьЭлементБД(ГУИД_Строкой, ВидОбъекта, ТипОбъекта=Неопределено)
    
    Если Не ПустаяСтрока(ГУИД_Строкой) и ГУИД_Строкой <> "00000000-0000-0000-0000-000000000000" Тогда 
        ГуидИзСтроки = Новый УникальныйИдентификатор(ГУИД_Строкой);
        
        Если ТипОбъекта <> Неопределено и ТипОбъекта = "Справочник" Тогда 
            СсылкаОбъекта = Справочники[ВидОбъекта].ПолучитьСсылку(ГуидИзСтроки);
        Иначе 
            СсылкаОбъекта = Документы[ВидОбъекта].ПолучитьСсылку(ГуидИзСтроки);
        КонецЕсли;
        
        Если ПроверитьНаБитуюСсылку(СсылкаОбъекта, ТипОбъекта) <> Истина Тогда
            Возврат СсылкаОбъекта;
        КонецЕсли;
        
    ИначеЕсли ПустаяСтрока(ГУИД_Строкой) Тогда 
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции
   DrZombi
 
19 - 19.02.21 - 22:36
+(18) Еще Функции...

Функция ПроверитьНаБитуюСсылку(Ссылка, ТипОбъекта=Неопределено)
    
    Запрос = Новый Запрос;
    Если ТипОбъекта = Неопределено Тогда
        Запрос.Текст =
        "ВЫБРАТЬ Ссылка ИЗ Документ." + Ссылка.Метаданные().Имя + " ГДЕ Ссылка = &Ссылка";
    Иначе 
        Запрос.Текст =
        "ВЫБРАТЬ Ссылка ИЗ Справочник." + Ссылка.Метаданные().Имя + " ГДЕ Ссылка = &Ссылка";
    КонецЕсли;
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезЗапроса = Запрос.Выполнить();
    Если РезЗапроса.Пустой() Тогда
        Возврат Истина;
    Иначе 
        Возврат Ложь;
    КонецЕсли;
    
КонецФункции
   dark70
 
20 - 19.02.21 - 22:41
(18) Я получаю из другой базы Контрагента которого в основной базе нет и никогда не было.
Что я тогда запихну в Таблицу значений ? Поэтому у меня в ТЗ колока текстовая куда и вставляю наименование контрагента.
Да и не в этом суть.
Я же говорю, что все нормально работало пока не добавил конструкцию как в 4-м сообщении.
   DrZombi
 
21 - 19.02.21 - 22:43
(16) А я вот так ищу контрагентов... (некоторые функции выше по топику)

ОЛЕ_Контрагент_Строкой         = ПолучитьПредставлениеПоСсылке(COM_Выборка.Контрагент,БазаИсточник);//Для комментария, в случаи ошибок...


            пГУИД_Строкой_Контрагент = СокрЛП(ПолучитьГУИД_ЭлементаCOM(COM_Выборка.Контрагент,БазаИсточник));
            Контрагент = ПолучитьЭлементБД(пГУИД_Строкой_Контрагент,"Контрагенты","Справочник");//Сперва по гуиду...


Контрагент = ОЛЕ_НайтиКонтрагента(COM_Выборка.Контрагент);  //Потом по тому, как получится


Функции:...

Функция ОЛЕ_НайтиКонтрагента(ОЛЕ_Контрагент)
    
    Код = СокрЛП(ОЛЕ_Контрагент.Код);
    ИНН = СокрЛП(ОЛЕ_Контрагент.ИНН);
    КПП = СокрЛП(ОЛЕ_Контрагент.КПП);
    
    Если Не ЗначениеЗаполнено(Код) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    СсылкаКод = Справочники.Контрагенты.НайтиПоКоду(Код);
    Если СсылкаКод <> Неопределено Тогда 
        Возврат СсылкаКод;
    КонецЕсли;
    
    Если ПустаяСтрока(ИНН) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ИНН",ИНН);
    Запрос.УстановитьПараметр("КПП",КПП);
    Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Контрагенты.Ссылка КАК Ссылка,
    |    Контрагенты.Код КАК Код
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    НЕ Контрагенты.ЭтоГруппа
    |    И Контрагенты.ИНН = &ИНН
    |    И Контрагенты.КПП = &КПП
    |
    |УПОРЯДОЧИТЬ ПО
    |    Код";
    
    РезЗапроса = Запрос.Выполнить();
    Если РезЗапроса.Пустой() Тогда 
        Возврат Неопределено;
    КонецЕсли;
    
    Выборка = РезЗапроса.Выбрать();
    Выборка.Следующий();
    
     Возврат Выборка.Ссылка;
КонецФункции
   DrZombi
 
22 - 19.02.21 - 22:46
(20) И если не нашли...

Контрагент = СоздатьНовогоКонтрагента(COM_Выборка.Контрагент, пГУИД_Строкой_Контрагент, БазаИсточник);

Функция:...

Функция СоздатьНовогоКонтрагента(COM_Контрагент, пГУИД_Строкой, БазаИсточник)
    
    ГруппаКонтрагента = Справочники.Контрагенты.НайтиПоКоду("БП-000775");//Группа - "Потребители газа (УПП)"

    Если ЗначениеЗаполнено(ГруппаКонтрагента) и не ГруппаКонтрагента.ЭтоГруппа Тогда
        ГруппаКонтрагента = Неопределено;
    КонецЕсли;
    
    СсылкаЭлемента = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(пГУИД_Строкой));
            
    НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
    НовыйКонтрагент.УстановитьСсылкуНового(СсылкаЭлемента);
    НовыйКонтрагент.ОбменДанными.Загрузка = Истина;
    НовыйКонтрагент.Родитель = ГруппаКонтрагента;
    //

    НовыйКонтрагент.Код = СокрЛП(COM_Контрагент.Код);
    НовыйКонтрагент.Наименование = СокрЛП(COM_Контрагент.Наименование);
    НовыйКонтрагент.НаименованиеПолное = СокрЛП(COM_Контрагент.НаименованиеПолное);
    
    пНазваниеИдентификатораCOM_Перечисления = ПолучитьНазваниеИдентификатораПеречисления(COM_Контрагент.ЮрФизЛицо,БазаИсточник);
    Если ВРег(СокрЛП(пНазваниеИдентификатораCOM_Перечисления)) = ВРег("ФизЛицо") Тогда
        ЮрФизЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
    Иначе 
        ЮрФизЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
    КонецЕсли;
    НовыйКонтрагент.ЮридическоеФизическоеЛицо = ЮрФизЛицо;
    
    НовыйКонтрагент.СтранаРегистрации = Справочники.СтраныМира.Россия;
    НовыйКонтрагент.ИНН = СокрЛП(COM_Контрагент.ИНН);
    НовыйКонтрагент.КПП = СокрЛП(COM_Контрагент.КПП);
    
    НовыйКонтрагент.Комментарий = СокрЛП(COM_Контрагент.Комментарий)+" (создан из обработки 'Загрузка документов из УПП' от "+Формат(ТекущаяДатаСеанса(),"ДФ='dd.MM.yyyy HH:mm:ss'")+")";
    НовыйКонтрагент.Записать();
    
    //Пока нет создания адреса и других источников информации - их заполнять руками... (нет времени на это...)

    
    Возврат НовыйКонтрагент.Ссылка;
КонецФункции

Функция ПолучитьНазваниеИдентификатораПеречисления(COM_ЗначениеПеречисления,БазаИсточник)
    
    Возврат Строка(БазаИсточник.String(БазаИсточник.XMLСтрока(COM_ЗначениеПеречисления)));
    
КонецФункции

//Бонусом... вдруг понадобится :)

Функция ПолучитьНазваниеИдентификатораПеречисления(COM_ЗначениеПеречисления,БазаИсточник)
    
    Возврат Строка(БазаИсточник.String(БазаИсточник.XMLСтрока(COM_ЗначениеПеречисления)));
    
КонецФункции
   dark70
 
23 - 19.02.21 - 22:46
блин, конкретно затупил.
Не проставил остальные ИНН, Родитель, вместо Контрагента подсунул Наименование, а Контрагента в третьей таблице вообще не выбрал
https://s8.hostingkartinok.com/uploads/images/2021/02/a4d4dd7dc3c6f3ea97aaa7bfc21cef1a.jpg
   DrZombi
 
24 - 19.02.21 - 22:47
(23) Всегда пожалуйста :)
   dark70
 
25 - 19.02.21 - 22:52
имел ввиду, что было вот так
 |ВЫБРАТЬ
    |    NULL,
    |    NULL,
    |    Хозрасчетный_1007.Субконто1.Наименование,
    |    NULL,
    |    NULL,
    |    NULL,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)

а надо было вот так
|ВЫБРАТЬ
    |    Хозрасчетный_1007.Субконто1.Наименование,
    |    Хозрасчетный_1007.Субконто1.Родитель.Наименование,
    |    Хозрасчетный_1007.Субконто1.ИНН,
    |    NULL,
    |    NULL,
    |    NULL,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)
   dark70
 
26 - 19.02.21 - 22:52
(24) В след. раз воспользуюсь.

Всем спасибо.
   dark70
 
27 - 20.02.21 - 08:25
рано радовался. Все равно вот так не работает через COM
|ВЫБРАТЬ
    |    Хозрасчетный_1007.Субконто1.Наименование,
    |    Хозрасчетный_1007.Субконто1.Родитель.Наименование,
    |    Хозрасчетный_1007.Субконто1.ИНН,
    |    NULL,
    |    NULL,
    |    NULL,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)

Надо вот так
|ВЫБРАТЬ
    |    Хозрасчетный_1007.Субконто1.Наименование,
    |    Хозрасчетный_1007.Субконто1.Родитель.Наименование,
    |    Хозрасчетный_1007.Субконто1.ИНН,
    |    0,
    |    0,
    |    0,
    |    ЕСТЬNULL(Хозрасчетный_1007.СуммаОстатокДт, 0)
   DrZombi
 
28 - 20.02.21 - 08:27
(27) Используй вместо NULL НЕОПРЕДЕЛЕНО


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