Имя: Пароль:
1C
1С v8
Передача параметров в запрос по COMconnector
,
0 TygarinZmei
 
19.12.16
13:37
Добрый день.

Столкнулся с такой ситуацией и не знаю как ее обойти. Может кто, подскажет? Спасиабо.
Ситуация следующая. Подключаюсь из одной базы в другую.
ПутьБазы1С = "D:\1CBases\БАЗА";
        Пользователь1С = "1234";
        Пароль1С = "1234";
        
        V82 = Новый COMОбъект("V82.COMConnector");
        КомСтрока = "Путь " + ПутьБазы1С + " Пользователь " + Пользователь1С + " Пароль *****";
        
        Попытка
            //Сообщить(КомСтрока);
            Connection = V82.Connect("File=""" + ПутьБазы1С + """;Usr=""" + Пользователь1С + """;Pwd=""" + Пароль1С + """;");

Далее необходимо вытащить информацию. Есть запрос:
ВЫБРАТЬ
    |    НАЧАЛОПЕРИОДА(втЗаказПокупателя.Ссылка.Дата, МЕСЯЦ) КАК Период,
    |    СУММА(ВЫБОР
    |            КОГДА втЗаказПокупателя.Номенклатура.Наименование ПОДОБНО &Номенклатура
    |                ТОГДА
    |                    ВЫБОР КОГДА втЗаказПокупателя.Ссылка.Дата > ДАТАВРЕМЯ(2016, 2, 15, 0, 0, 0)
    |                            ТОГДА втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 45 / 100
    |                    Иначе
    |
    |                   ВЫБОР
    |                        КОГДА втЗаказПокупателя.Ссылка.Дата < ДАТАВРЕМЯ(2015, 5, 18, 0, 0, 0)
    |                            ТОГДА втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 46 / 100
    |                        ИНАЧЕ втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 47 / 100
    |                    КОНЕЦ  Конец
    |            ИНАЧЕ 0
    |        КОНЕЦ + ВЫБОР
    |            КОГДА НЕ втЗаказПокупателя.Номенклатура.Наименование ПОДОБНО &Номенклатура
    |                ТОГДА втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 15 / 100
    |            ИНАЧЕ 0
    |        КОНЕЦ) КАК СуммаВсегоИзделийАксес
    |ПОМЕСТИТЬ втСебест
    |ИЗ
    |    Документ.втЗаказПокупателя.Товары КАК втЗаказПокупателя
    |ГДЕ
    |    втЗаказПокупателя.Ссылка.Проведен = ИСТИНА
    |    И втЗаказПокупателя.Ссылка.Контрагент.ИНН <> ""4632166738""    
    |    И втЗаказПокупателя.Ссылка.Дата МЕЖДУ &ДатаС И &ДатаПо И                  втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразделение.Наименование В (&Подразделение) ";    
    |
    |СГРУППИРОВАТЬ ПО
    |    НАЧАЛОПЕРИОДА(втЗаказПокупателя.Ссылка.Дата, МЕСЯЦ)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ХозрасчетныйОбороты.Период,
    |    СУММА(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаОборотДт) КАК СуммаВыручки
    |ПОМЕСТИТЬ втВыручка
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Обороты(
    |            &ДатаС,
    |            &ДатаПо,
    |            Месяц,
    |            Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями)
    |                ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным),
    |            ,
    |            Организация = &Организация,
    |            КорСчет В (&СписокСчетов),
    |            ) КАК ХозрасчетныйОбороты ГДЕ ХозрасчетныйОбороты.Субконто1.ИНН <> ""4632166738"" " + УсловиеВыручка +
    "
    |
    |СГРУППИРОВАТЬ ПО
    |    ХозрасчетныйОбороты.Период
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЕСТЬNULL(втВыручка.Период, втСебест.Период) КАК Период,
    |    ЕстьNull(втВыручка.СуммаВыручки, 0) КАК СуммаВыручки,
    |    ЕстьNull(втСебест.СуммаВсегоИзделийАксес, 0) КАК СуммаВсегоИзделийАксес
    |ИЗ
    |    втВыручка КАК втВыручка
    |        ПОЛНОЕ СОЕДИНЕНИЕ втСебест КАК втСебест
    |        ПО втВыручка.Период = втСебест.Период";                
    
    Запрос.УстановитьПараметр("ДатаС", НачПериода);
    Запрос.УстановитьПараметр("ДатаПо", КонецДня(КонПериода));
    Запрос.УстановитьПараметр("Номенклатура", "%Изделие%");
    Запрос.УстановитьПараметр("Организация", УпрОрганизация);
    Запрос.УстановитьПараметр("СписокСчетов", СписокСчетов);
    Запрос.УстановитьПараметр("Подразделение", СписокПодразделений);


В форме отчета есть ПолеСпискаПодразделений в котором можно выбрать по какому подразделению построить отчет. В оригинале отчета все работает. Переношу его в другую бзу и ругается на неверные параметры при сравнении с подразделением.

выбор подразделения реализован так:
Для Каждого Стр из ПолеСпискаПодразделений Цикл
        Если Стр.Пометка = Истина Тогда    
         СписокПодразделений.Добавить(Стр.Значение);    
         КонецЕсли;
    КонецЦикла;
Я  понимаю что запрос это сом объект и что параметры должны быть соответствующие. Но как обеспечить выбор никак не могу разобраться.
1 Альбатрос
 
19.12.16
13:41
Запрос выполняется на стороне СОМ-объекта? Вот и подразделения нужно заполнять из этого СОМ-объекта.
2 TygarinZmei
 
19.12.16
13:47
(1) Я это понимаю. Но нужно как то это связать с выставлением галочек поле списка. Уже всю головы сломал(
3 shuhard
 
19.12.16
13:48
(2) [Уже всю головы сломал(]
у подразделения есть код и есть название
4 Альбатрос
 
19.12.16
13:50
(2) Что тут ломать? У твоих подразделений в обоих базах есть что-нибудь общее? Например, если это код, то:

Для Каждого Стр из ПолеСпискаПодразделений Цикл
        Если Стр.Пометка = Истина Тогда    
         СписокПодразделений.Добавить(ТвойСом.Справочники.Подразделения.НайтиПоКоду(Стр.Значение.Код);    
         КонецЕсли;
КонецЦикла;
5 TygarinZmei
 
19.12.16
13:52
(4) Пробовал так. все равно пишет что не корректные параметры. Только писал так

Для Каждого Стр из ПолеСпискаПодразделений Цикл
        Если Стр.Пометка = Истина Тогда
            Если Стр.Значение = "Волокно" Тогда Код = "000000004" КонецЕсли;  
             СписокПодразделений.Добавить(Connection1C.Справочники.ПодразделенияОрганизаций.НайтиПоКоду(Код));
         СписокПодразделений.Добавить(Стр.Значение);    
         КонецЕсли;
    КонецЦикла;
6 h-sp
 
19.12.16
13:53
(5) не забудь для начала

СписокПодразделений = Connection.NewObject("СписокЗначений");
7 Альбатрос
 
19.12.16
13:54
Учти (6) и нахрена ты в массив добавляешь подразделение из обоих баз?
8 TygarinZmei
 
19.12.16
13:57
(7) Вторая трока косяк в теле программы она закоментирована. (6) Да ранее это добавлено.
СписокПодразделений = Connection1C.NewObject("СписокЗначений");
Для Каждого Стр из ПолеСпискаПодразделений Цикл
        Если Стр.Пометка = Истина Тогда
            Если Стр.Значение = "Волокно" Тогда Код = "000000004" КонецЕсли;  
             СписокПодразделений.Добавить(Connection1C.Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000004"));

         КонецЕсли;
    КонецЦикла;
9 TygarinZmei
 
19.12.16
13:57
и продолжает ругаться(
10 Альбатрос
 
19.12.16
13:58
Дословно напиши ошибку
11 Fish
 
19.12.16
13:58
() А если значение, отличное от "Волокно" - тогда чему будет равен код?
12 TygarinZmei
 
19.12.16
13:59
{Отчет.гоФинансовыйОтчетГО.Форма.ФормаОтчета.Форма(218)}: Ошибка при вызове метода контекста (Выполнить)
    Результат = Запрос.Выполнить();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.130): {(27, 138)}: Неверные параметры
И втЗаказПокупателя.Ссылка.Дата МЕЖДУ &ДатаС И &ДатаПо  И втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразделение.Наименование <<?>>В (&Подразделение)
13 TygarinZmei
 
19.12.16
13:59
(11) Пока ни чему. При отладке выбираю Волокно. Если заработает потом допишу.)))
14 Радим1987
 
19.12.16
14:05
А что если получить все данные без отбора (подразделений), потом делать отбор. если конечно данных не много
15 shuhard
 
19.12.16
14:09
(12)[ И втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразделение.Наименование <<?>>В (&Подразделение)]
наименование то зачем ?
16 TygarinZmei
 
19.12.16
14:11
(15) Первоначальный код писал не я. В таком виде в родной базе запрос работает.
17 shuhard
 
19.12.16
14:12
(16) ни о чем
18 TygarinZmei
 
19.12.16
14:14
(17) Без наименования такая же ошибка.
19 Радим1987
 
19.12.16
14:21
приведи полный код запроса
20 TygarinZmei
 
19.12.16
14:23
(19) так в первом сообщении он весь
21 Радим1987
 
19.12.16
14:24
втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразде
ление.Наименование В (&Подразделение) "; --ЧТО ЭТО"    
    |
    |СГРУППИРОВАТЬ ПО
    |    НАЧАЛОПЕРИОДА(втЗаказПокупателя.Ссылка.Дата, МЕСЯЦ)
22 Радим1987
 
19.12.16
14:25
для чего там ";"
23 TygarinZmei
 
19.12.16
14:29
(22) Ее там не должно быть
В запросе есть условие я просто перенес не так. Считайте что их там нет (";)
24 Галахад
 
гуру
19.12.16
14:35
В списке ссылки, а в запросе сравнение по строке.
25 Радим1987
 
19.12.16
14:41
приведи полный код
26 TygarinZmei
 
19.12.16
14:43
(25) Запрос = Connection1C.NewObject("Запрос");                            
    Если ЗначениеЗаполнено(СписокПодразделений) Тогда
        ТекстУсловия = " И втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразделение.Наименование В (&Подразделение) ";    
        УсловиеВыручка = " И ХозрасчетныйОбороты.Субконто2.Филиал.Подразделение.Наименование В (&Подразделение)";
        Запрос.УстановитьПараметр("Подразделение", СписокПодразделений);
    Иначе
        ТекстУсловия = "";
        УсловиеВыручка = "";
    КонецЕсли;    
    
    ТекстЗапроса = "ВЫБРАТЬ
    |    НАЧАЛОПЕРИОДА(втЗаказПокупателя.Ссылка.Дата, МЕСЯЦ) КАК Период,
    |    СУММА(ВЫБОР
    |            КОГДА втЗаказПокупателя.Номенклатура.Наименование ПОДОБНО &Номенклатура
    |                ТОГДА
    |                    ВЫБОР КОГДА втЗаказПокупателя.Ссылка.Дата > ДАТАВРЕМЯ(2016, 2, 15, 0, 0, 0)
    |                            ТОГДА втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 45 / 100
    |                    Иначе
    |
    |                   ВЫБОР
    |                        КОГДА втЗаказПокупателя.Ссылка.Дата < ДАТАВРЕМЯ(2015, 5, 18, 0, 0, 0)
    |                            ТОГДА втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 46 / 100
    |                        ИНАЧЕ втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 47 / 100
    |                    КОНЕЦ  Конец
    |            ИНАЧЕ 0
    |        КОНЕЦ + ВЫБОР
    |            КОГДА НЕ втЗаказПокупателя.Номенклатура.Наименование ПОДОБНО &Номенклатура
    |                ТОГДА втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество - втЗаказПокупателя.ЦенаБезСкидки * втЗаказПокупателя.Количество * 15 / 100
    |            ИНАЧЕ 0
    |        КОНЕЦ) КАК СуммаВсегоИзделийАксес
    |ПОМЕСТИТЬ втСебест
    |ИЗ
    |    Документ.втЗаказПокупателя.Товары КАК втЗаказПокупателя
    |ГДЕ
    |    втЗаказПокупателя.Ссылка.Проведен = ИСТИНА
    |    И втЗаказПокупателя.Ссылка.Контрагент.ИНН <> ""4632166738""    
    |    И втЗаказПокупателя.Ссылка.Дата МЕЖДУ &ДатаС И &ДатаПо "  + ТекстУсловия +
    "
    |
    |СГРУППИРОВАТЬ ПО
    |    НАЧАЛОПЕРИОДА(втЗаказПокупателя.Ссылка.Дата, МЕСЯЦ)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ХозрасчетныйОбороты.Период,
    |    СУММА(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаОборотДт) КАК СуммаВыручки
    |ПОМЕСТИТЬ втВыручка
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Обороты(
    |            &ДатаС,
    |            &ДатаПо,
    |            Месяц,
    |            Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями)
    |                ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным),
    |            ,
    |            Организация = &Организация,
    |            КорСчет В (&СписокСчетов),
    |            ) КАК ХозрасчетныйОбороты ГДЕ ХозрасчетныйОбороты.Субконто1.ИНН <> ""4632166738"" " + УсловиеВыручка +
    "
    |
    |СГРУППИРОВАТЬ ПО
    |    ХозрасчетныйОбороты.Период
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЕСТЬNULL(втВыручка.Период, втСебест.Период) КАК Период,
    |    ЕстьNull(втВыручка.СуммаВыручки, 0) КАК СуммаВыручки,
    |    ЕстьNull(втСебест.СуммаВсегоИзделийАксес, 0) КАК СуммаВсегоИзделийАксес
    |ИЗ
    |    втВыручка КАК втВыручка
    |        ПОЛНОЕ СОЕДИНЕНИЕ втСебест КАК втСебест
    |        ПО втВыручка.Период = втСебест.Период";                
    
    Запрос.УстановитьПараметр("ДатаС", НачПериода);
    Запрос.УстановитьПараметр("ДатаПо", КонецДня(КонПериода));
    Запрос.УстановитьПараметр("Номенклатура", "%Изделие%");
    Запрос.УстановитьПараметр("Организация", УпрОрганизация);
    Запрос.УстановитьПараметр("СписокСчетов", СписокСчетов);
    //Запрос.УстановитьПараметр("Подразделение", СписокПодразделений);

    Запрос.Текст = ТекстЗапроса;
    Результат = Запрос.Выполнить();
    ТЗ = Результат.Выгрузить();
27 Галахад
 
гуру
19.12.16
14:46
Код повыешеной секретности. :-)
28 Радим1987
 
19.12.16
14:48
Результат = Запрос.Выполнить();
Результат зарезервированное слово
29 TygarinZmei
 
19.12.16
14:50
(28) Смотрите, если я делаю отчет без указания подразделений(по всему предприятию), то проблем не возникает. Только если выбираю подразделение по кот орому сформировать.
30 Радим1987
 
19.12.16
14:52
ТекстУсловия = " И втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразделение.Наименование В (&Подразделение) ";

сделаем ТекстУсловия = " И втЗаказПокупателя.Ссылка.ДоговорКонтрагента.Филиал.Подразделение.Наименование подобно (&Подразделение) ";
Запрос.УстановитьПараметр("Подразделение", "ТвоеНаименование");
31 TygarinZmei
 
19.12.16
15:03
(30) {Отчет.гоФинансовыйОтчетГО.Форма.ФормаОтчета.Форма(218)}: Ошибка при вызове метода контекста (Выполнить)
    Результат = Запрос.Выполнить();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.130): {(27, 57)}: Неверные параметры "ПОДОБНО"
И втЗаказПокупателя.Ссылка.Филиал.Наименование ПОДОБНО <<?>>&Подразделение
32 Галахад
 
гуру
19.12.16
15:04
Опять строку с списком сравнивают.
33 TygarinZmei
 
19.12.16
15:05
(32) Будьте добры, подскажите, что не так. Как сделать? Спасибо.
34 Галахад
 
гуру
19.12.16
15:07
Посмотреть, что такое "ПолеСпискаПодразделений" и как оно заполняется.
35 TygarinZmei
 
19.12.16
15:13
(34) Что ж вы все так любите загадками писать. Я не волшебник я ток учусь)))
ПолеСпискаПодразделений.ЗагрузитьЗначения(Массив); В массиве хранятся строки. По сути  это список значений. Так же как и СписокПодразделений.
36 Галахад
 
гуру
19.12.16
15:21
(35) А откуда строки приходят? Из другой базы?
37 TygarinZmei
 
19.12.16
15:25
(36) Да.

    
    Запрос = Connection1C.NewObject("Запрос");
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ПодразделенияОрганизаций.Наименование
                   |ИЗ
                   |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
                   |ГДЕ
                   |    ПодразделенияОрганизаций.НеИспользуется = ЛОЖЬ";
                  
    Выборка = Запрос.Выполнить().Выбрать();
    
    Массив = Новый Массив;
    Пока Выборка.Следующий() Цикл
         Массив.Добавить(Выборка.Наименование);
    КонецЦикла;
    
    ПолеСпискаПодразделений.ЗагрузитьЗначения(Массив);