Имя: Пароль:
1C
1С v8
Не работает бухгалтерский запрос через com-соединение
0 eGorZZZ
 
10.11.16
12:49
Обе базы обычные, БП2.0, т.е. под 8.2
1 eGorZZZ
 
10.11.16
12:51
код запроса
[code]
    СписокНоменклатуры = V8.NewObject("СписокЗначений");
    Для каждого ОстатокНоменклатуры из ОстаткиНоменклатуры Цикл
        ОстатокНоменклатуры.Остаток = ОстатокНоменклатуры.Остаток*(-1);
        НайденнаяНоменклатура = V8.Справочники.Номенклатура.НайтиПоКоду(ОстатокНоменклатуры.Код);
        Если НЕ НайденнаяНоменклатура.Пустая() Тогда
            СписокНоменклатуры.Добавить(НайденнаяНоменклатура.Ref);
        КонецЕсли;
    КонецЦикла;
    
    олеЗапрос = V8.NewObject("Query");
    олеЗапрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Код,
        |    Номенклатура.Ссылка КАК Товар,
        |    ХозрасчетныйОстатки.КоличествоОстатокДт КАК Остаток
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.Остатки(
        |            &Дата,
        |            Счет = &Счет,
        |            &ВидыСубконто,
        |            Организация = &Организация
        |                И Субконто1 В (&Товары)) КАК ХозрасчетныйОстатки
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        |        ПО ХозрасчетныйОстатки.Субконто1 = Номенклатура.Ссылка
        |ГДЕ
        |    ХозрасчетныйОстатки.КоличествоОстатокДт > 0
        |
        |СГРУППИРОВАТЬ ПО
        |    ХозрасчетныйОстатки.Субконто1,
        |    Номенклатура.Код,
        |    Номенклатура.Ссылка,
        |    ХозрасчетныйОстатки.КоличествоОстатокДт";

    олеЗапрос.УстановитьПараметр("Счет", V8.ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("ТоварыНаСкладах"));
    олеЗапрос.УстановитьПараметр("ВидыСубконто", V8.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Номенклатура"));
    олеЗапрос.УстановитьПараметр("Организация", V8.Справочники.Организации.НайтиПоРеквизиту("ИНН",ОрганизацияКонтрагент.ИНН));
    олеЗапрос.УстановитьПараметр("Товары", СписокНоменклатуры);
    олеЗапрос.УстановитьПараметр("Дата", ДатаКон);
    олеОстаткиНоменклатуры = олеЗапрос.Выполнить().Выгрузить();
[/code]
таблица получается пустая, ошибок нет - ниччё не понимаю...
2 DrShad
 
10.11.16
12:57
а параметры все заполнены?
3 Ёпрст
 
10.11.16
12:57
Список номенклатуры заполнен не элементами сторонней базы
4 eGorZZZ
 
10.11.16
12:59
(2) да, вроде всё заполнено
(3) формирование списка - выше - поиск по коду в удаленной, если найден, то добавляется
5 Cyberhawk
 
10.11.16
13:00
Сделай правое соединение и убедись, что остаток не больше нуля по всем позициям
6 DrShad
 
10.11.16
13:00
(4) так вроде или заполнено?
7 eGorZZZ
 
10.11.16
13:02
есть сомнения по поводу правильности параметров "Счет" и "ВидыСубконто", по синтаксису вроде всё нормально, и ошибок нет - с бух.запросами через COM пока ещё не работал, первый опыт.
8 eGorZZZ
 
10.11.16
13:05
(5) там свыше 300 строк номенклатуры, хотя бы по одной должен быть + остаток
9 DrShad
 
10.11.16
13:05
а вот это вообще для чего?

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        |        ПО ХозрасчетныйОстатки.Субконто1 = Номенклатура.Ссылка
10 DrShad
 
10.11.16
13:06
каков тайный смысл?
11 eGorZZZ
 
10.11.16
13:09
(9)(10) - в принципе, можно и без этого - для получения кода номенклатуры и самой ссылки на справочник номенклатура для дальнейшей обработки таблицы, хотя, конечно, можно и из Субконто1 это выдернуть, согласен
12 eGorZZZ
 
10.11.16
13:17
убрал таблицу Номенклатура с левым соединением - результат пока тот же
13 Ёпрст
 
10.11.16
13:18
убери, для начала, фильтр по субконто.
14 Ёпрст
 
10.11.16
13:18
есть че ?
15 vicof
 
10.11.16
13:18
Интересно, при чем здесь бухзапросы
16 eGorZZZ
 
10.11.16
13:23
(14) убрал - снова 0 строк
17 eGorZZZ
 
10.11.16
13:24
сейчас запрос вообще так выглядит:
        "ВЫБРАТЬ
        |    ХозрасчетныйОстатки.Субконто1.Код,
        |    ХозрасчетныйОстатки.Субконто1.Ссылка,
        |    ХозрасчетныйОстатки.КоличествоОстатокДт КАК Остаток
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.Остатки(
        |            &Дата,
        |            Счет = &Счет,
        |            &ВидыСубконто,
        |            Организация = &Организация) КАК ХозрасчетныйОстатки
//        |                И Субконто1 В (&Товары)) КАК ХозрасчетныйОстатки
        |ГДЕ
        |    ХозрасчетныйОстатки.КоличествоОстатокДт > 0
        |
        |СГРУППИРОВАТЬ ПО
        |    ХозрасчетныйОстатки.Субконто1,
        |    ХозрасчетныйОстатки.КоличествоОстатокДт";
18 Ёпрст
 
10.11.16
13:26
(17) ну, теперь удаляй по-одному параметру, пока не найдешь проблемный, далее думать как с этим жить дальше
19 Ёпрст
 
10.11.16
13:26
и это, мот того, счет в иерархии(счет) смотреть хотя бы ?
20 Ёпрст
 
10.11.16
13:26
а не просто на равенство его проверять
21 eGorZZZ
 
10.11.16
13:28
у 41.01 субсчетов нет, такой же запрос не по com-соединению работает железно
22 eGorZZZ
 
10.11.16
14:27
В общем, разобрался я с проблемой:
Дело было в счёте, нужно было его не по наименованию искать для задания в параметрах, а по коду. Все остальные параметры заданы были верно :)
23 DrShad
 
10.11.16
14:55
(22) и не по наименованию и не по коду, а использовать как предопределенный


капец
24 eGorZZZ
 
10.11.16
18:00
(23) Если ты имеешь ввиду так:
олеЗапрос.УстановитьПараметр("Счет", V8.ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
то так тоже не работало
25 Михаил Козлов
 
10.11.16
18:13
(24) Не пробовали в виртуальной таблице написать: Счет = ПланСчетов.Хозрасчетный.ТоварыНаСкладах,?
26 Михаил Козлов
 
10.11.16
18:14
(25) Виноват: ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладах).
27 eGorZZZ
 
12.11.16
02:41
(26) В принципе, всё уже работает с поиском по коду, но идея интересная, попробую - отпишусь, спасибо!
Наткнулся на другую забавную ситуацию: код у справочника номенклатуры - текстовый, определённой длины (пусть будет 12 знаков), но, если брать тот же код через Субконто, то он по значению, если откинуть все пробелы, совпадает, но вот длина его существенно больше, что-то вроде 30-ти знаков, в итоге сравнивать напрямую эти коды бессмысленно.
У меня, в принципе, задача стояла простая - получить минуса по товарам в одной базе, затем сделать запрос по полученному списку номенклатуры в другую, и, если товар на остатке есть, то требуемое количество (либо сколько есть) в первой базе поставить на приход, а во второй его списать (продажа собственной фирме), ну а оставшиеся минуса поставить на приход от "левой" фирмы (это уже головная боль руководства, если воздухом торгуют). В целом, всё уже реализовано.
28 eGorZZZ
 
12.11.16
02:45
27+ вот только видимо всё же
ЗНАЧЕНИЕ(ПланЫСчетов.Хозрасчетный.ТоварыНаСкладах).
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.