Имя: Пароль:
1C
1C 7.7
v7: Не работает запрос по OLE
0 Pasha-Buh
 
08.02.18
21:29
Помогите разобраться. Подключаюсь по ОЛЕ к базе делаю запрос и получаю ошибку
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
{S:\BASES\1C\ERT\СКЛАД\ОТЧЕТ ПО ОСТАТКАМ И ЗАЯВКАМ.ERT(130)}: Неизвестная ошибка

В самой базе (без ОЛЕ) запрос отрабатывает на ура.
Вод код:

    Оле=СоздатьОбъект("V77.Application");    
    ПутьКБазе="\\10.10.10.5\DB\";
    Пользователь="ser";
    Пароль="258";    
    МонопольныйРежимOLE = "";
    СтрокаПодключения = "/d"+СокрЛП(ПутьКБазе) + " /n" + СокрЛП(Пользователь)+ " /p" + Пароль + МонопольныйРежимOLE;
    Рез = Оле.Initialize ( Оле.RMTrade , СтрокаПодключения,"NO_SPLASH_SHOW");
    Если Рез=0 Тогда
        Предупреждение("Не могу открыть базу",3);
        Оле="";
        ФлОткрыта=0;  
    Иначе            
        ФлОткрыта=1;  
    КонецЕсли;
    
    Если ФлОткрыта=0 Тогда
        Предупреждение("Сначала необходимо подключить базу !");
        Возврат;
    КонецЕсли;

    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НОваяКолонка("Товар");
    ТЗ.НОваяКолонка("КодТовар");
    ТЗ.НОваяКолонка("ОстатокНаНД","Число",15,2);    
    ТЗ.НОваяКолонка("Приход","Число",15,2);
    ТЗ.НОваяКолонка("Заказано","Число",15,2);
    ТЗ.НОваяКолонка("Остаток","Число",15,2);
    ТЗ.НОваяКолонка("Фасовка");

    Запрос = Оле.CreateObject("Запрос");
    Состояние("Заполнение выходной таблицы...");

    //Создание объекта типа Запрос
    ВНП = Дата1-7; ВКП = Дата2+3;
    ТекстЗапроса =
    "Период с '"+ВНП+ "' по '"+ВКП+"';
    |Док = Документ.ЗаказТовара.ТекущийДокумент;
    |ДокДт = Документ.ЗаказТовара.ДатаДок;
    |Товар = Документ.ЗаказТовара.ТОвар;  
    |НеСобрана = Документ.ЗаказТовара.НеСобрана;  
    |Количество = Документ.ЗаказТовара.Количество;
    |НаДату = Документ.ЗаказТовара.НаДату;  
    |ЕдИзм = Документ.ЗаказТовара.ЕдИзм;
    |Фасовка = Документ.ЗаказТовара.Фасовка;
    |КолСФ = Документ.ЗаказТовара.КолСФ;
    |Заказчик = Документ.ЗаказТовара.Клиент;
    |Менеджер = Документ.ЗаказТовара.Клиент.НомерМенеджера;
    |ВидК = Документ.ЗаказТовара.ВидК;
    |СкладД = Документ.ЗаказТовара.Склад;
    |Группировка Док;
    |Группировка Фасовка;
    |Группировка Товар Без Групп;
    |Функция КолВсего = Сумма(Количество);
    |Функция КолСФВсего = Сумма(КолСФ);
    |Условие ((НаДату>="+ВНП+") и (НаДату<="+ВКП+"));";//}}ЗАПРОС
    
    скл = Оле.CreateObject("Справочник.Склады");
    ВыбСклад="";
    Если СкладЗаявочной.ТекущаяСтрока()>1 Тогда
        кодСкл = "";
        СкладЗаявочной.ПолучитьЗначение(СкладЗаявочной.ТекущаяСтрока(),кодСкл);
        Если скл.НайтиПоНаименованию(кодСкл)=0 Тогда
            Сообщить("Не нашли склад в заявочной базе "+кодСкл);
        КонецЕсли;
        ВыбСклад = скл.ТекущийЭлемент();
    КонецЕсли;
    Если (ПустоеЗначение(ВыбСклад) = 0) Тогда
        ТекстЗапроса = ТекстЗапроса + "Условие(СкладД = ВыбСклад);";
    КонецЕсли;            
    
    
     //Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ТЗ1 = СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(тз1);
    глПечатьТЗ(ТЗ1);
1 Смотрящий
 
08.02.18
21:35
Дату в условии в апострофы возьми
2 Cthulhu
 
09.02.18
00:00
вот тут собака порылась:
ТекстЗапроса = ТекстЗапроса + "Условие(СкладД = ВыбСклад);"
-- все используемые в запросе переменные должны существовать в контексте оле-базы данных. причем между обращениями к оле любые глобальные переменные оле-контекста очищаются - КРОМЕ массивов (и их элементов). поэтому выход навскидку:
1) в ГМ оле-базы данных: Перем глПарам[1] Экспорт;
2) у тебя:
//ВыбСклад = скл.ТекущийЭлемент();
скл.глПарам[1] = скл.CurrentItem();
...
//ТекстЗапроса = ТекстЗапроса + "Условие(СкладД = ВыбСклад);";
ТекстЗапроса = ТекстЗапроса + "Условие(СкладД = глПарам[1]);";
3 Cthulhu
 
09.02.18
00:01
прим.: и - да, никогда, НИКОГДА не используйте для OLE кириллическую нотацию функций и методов
4 GreyK
 
09.02.18
00:30
(0) Такой запрос и не может быть создан. По ОЛЕ можно выдергивать только дату, строку и число.
5 GreyK
 
09.02.18
00:35
(3) А это не правда, текст запроса передается нормально, есть непонятные глюки с "Без итогов".
6 DrZombi
 
гуру
09.02.18
06:35
(0)В ОЛЕ БД можно использовать глобальные переменные в качестве задаваемого отбора.
Получается куда симпатично, главное, что бы глобальных переменных хватило :)
7 1dvd
 
09.02.18
06:54
а ещё, при вызове функций через ОЛЕ нужно указывать все, даже необязательные, параметры
8 VladZ
 
09.02.18
07:02
(0) ОЛЕ накладывает определенные ограничения. Выкинь ее.
9 NikVars
 
09.02.18
10:09
Любой язык программирования - формализованные ограничения!
10 Pasha-Buh
 
09.02.18
11:34
(1) Спасибо, помогло.
(2) Спасибо, вышел из ситуации в запросе: СкладД = Документ.ЗаказТовара.Склад.код
В нахождении выбсклада: ВыбСклад = скл.ТекущийЭлемент().Код;
В условии: ТекстЗапроса = ТекстЗапроса + "Условие(СкладД = СокрЛП("+ВыбСклад+");";