|
Не получается запрос через 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
|
И как я сделаю 0 ?
Вот скрин https://s8.hostingkartinok.com/uploads/images/2021/02/4d744f12610be07a419eeed7cb63019d.jpg |
|||
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 НЕОПРЕДЕЛЕНО
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |