Имя: Пароль:
1C
1С v8
Не получается запрос через COMОбъект.
,
0 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

В чем может быть причина ?
1 dark70
 
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
Параметры запроса вестимо не правильно заполнил. Покажи код где параметры устанавливаешь
3 dark70
 
19.02.21
21:34
Не, параметры правильные.
Счет_1007 = Connection.ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.07");
4 dark70
 
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?
7 dark70
 
19.02.21
22:03
8 DrZombi
 
гуру
19.02.21
22:15
(0) Зачем тут "ПОЛНОЕ СОЕДИНЕНИЕ"?         (Странная конструкция)
Почему тут все в ЕстьNull "ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0) "?   (Из-за странной конструкции, еще все странней)
А это что за чудо "ХозрасчетныйОстатки.Субконто1.Наименование"?     (Таки по ссылке из другой базы можно все что угодно получить)
Это помогает "NULL,"?      (Удобнее использовать Неопределено)
9 DrZombi
 
гуру
19.02.21
22:18
(4) "ЕСТЬNULL " - все работает, в запросе.
А вот в цикле, вам бы запустить отладчик.

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

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

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


Функции:

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

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


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

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

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

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

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

Функции:...

Функция ОЛЕ_НайтиКонтрагента(ОЛЕ_Контрагент)
    
    Код = СокрЛП(ОЛЕ_Контрагент.Код);
    ИНН = СокрЛП(ОЛЕ_Контрагент.ИНН);
    КПП = СокрЛП(ОЛЕ_Контрагент.КПП);
    
    Если Не ЗначениеЗаполнено(Код) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    СсылкаКод = Справочники.Контрагенты.НайтиПоКоду(Код);
    Если СсылкаКод <> Неопределено Тогда
        Возврат СсылкаКод;
    КонецЕсли;
    
    Если ПустаяСтрока(ИНН) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ИНН",ИНН);
    Запрос.УстановитьПараметр("КПП",КПП);
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Контрагенты.Ссылка КАК Ссылка,
    |    Контрагенты.Код КАК Код
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    НЕ Контрагенты.ЭтоГруппа
    |    И Контрагенты.ИНН = &ИНН
    |    И Контрагенты.КПП = &КПП
    |
    |УПОРЯДОЧИТЬ ПО
    |    Код";
    
    РезЗапроса = Запрос.Выполнить();
    Если РезЗапроса.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Выборка = РезЗапроса.Выбрать();
    Выборка.Следующий();
    
     Возврат Выборка.Ссылка;
КонецФункции
22 DrZombi
 
гуру
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_ЗначениеПеречисления)));
    
КонецФункции
23 dark70
 
19.02.21
22:46
блин, конкретно затупил.
Не проставил остальные ИНН, Родитель, вместо Контрагента подсунул Наименование, а Контрагента в третьей таблице вообще не выбрал
https://s8.hostingkartinok.com/uploads/images/2021/02/a4d4dd7dc3c6f3ea97aaa7bfc21cef1a.jpg
24 DrZombi
 
гуру
19.02.21
22:47
(23) Всегда пожалуйста :)
25 dark70
 
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)
26 dark70
 
19.02.21
22:52
(24) В след. раз воспользуюсь.

Всем спасибо.
27 dark70
 
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)
28 DrZombi
 
гуру
20.02.21
08:27
(27) Используй вместо NULL НЕОПРЕДЕЛЕНО
2 + 2 = 3.9999999999999999999999999999999...