Вход | Регистрация
 

Запрос в 7 через оле

Запрос в 7 через оле
Я
   Мисти
 
13.08.19 - 15:08
ГрТовара = БазаОле.CreateObject("Справочник.Номенклатура");
    Если ГрТовара.НайтиПоНаименованию(СокрЛП(ГруппаТов.Наименование),0,1) >0 Тогда
        ТекЭл = ГрТовара.ТекущийЭлемент();
    Иначе
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("не найдена гр. товара в 7 "+ГруппаТов);
        ТекЭл = "";
    КонецЕсли;
    
    ТекстЗапроса = " Период с '"+Объект.Дата2+ "' по '"+Объект.Дата2+"';     
    | Товар = Регистр.ПартииТоваров.Товар;
    | ОстатокКол = Регистр.ПартииТоваров.ОстатокТовара;
    | ОстатокСум = Регистр.ПартииТоваров.Стоимость;
    | Группировка Товар без групп;
    | Функция КонКол = КонОст(ОстатокКол);
    | Функция КонСум = КонОст(ОстатокСум);
    | Условие (Товар в ГрТовара)";
Ругается на условие! Ошибка, говорит.
А как?
 
 
   Birmingem
 
1 - 13.08.19 - 15:25
ГрТовара - это что?
Справочник в другой базе БазаОле?
И ты запросом пытаешься найти в этой базе товары, которые находятся в другой базе?
   Мисти
 
2 - 13.08.19 - 15:46
запрос - к базе Оле и ГрТовары - в базе Оле
   Мисти
 
3 - 13.08.19 - 15:46
Запрос = БазаОле.CreateObject("Запрос");
    Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
        //Предупреждение("Запрос безутешен!");

        Возврат;
    КонецЕсли;
   hhhh
 
4 - 13.08.19 - 15:48
(2) так может
   | Условие (Товар в ТекЭл)";
   GreyK
 
5 - 13.08.19 - 15:50
(0) Ни как. Если коды уникальные, то можешь по списку кодов отобрать.
   ДенисЧ
 
6 - 13.08.19 - 15:52
(5) Почему никак? Можно в той базе создать глобальную переменную, и через неё передать...
   azernot
 
7 - 13.08.19 - 15:52
Вот тут ответы на ваши вопросы:
http://my1c-archive.narod.ru/knowhow/v7_OLE.html

Вкратце: в 1С 7.7 заводится экспортная переменная (масссив), в неё присваивается нужное значение через EvalExpr и уже на неё ставится условие
   azernot
 
8 - 13.08.19 - 16:01
ТОлько очень медленно работают запрос по OLE, рекомендую написать свою функцию в глобальном модуле 7.7, в которую передавать текст запроса, а функция будет выполнять запрос и укладывать результат в ТЗ, которую уже будет возвращать. Работает существенно быстрее.
   Злопчинский
 
9 - 13.08.19 - 16:28
ГрТовара - клюшка ничего не знает про эту переменную, так как это переменная в другом контексте. Если это ТиС - то там есть штатно в ГМ куча экспортных переменных. используй их в условии
   Мисти
 
10 - 13.08.19 - 16:37
Перем ГруппаТов Экспорт; - вставила в 7 в глоб. модуль. Теперь что?
Мне скорость не важна, сейчас для отладки - да, а потом одноразовая перегрузка.
   ДенисЧ
 
11 - 13.08.19 - 16:37
(10) Буть мужиком, присвой ей значение!
   Мисти
 
12 - 13.08.19 - 16:42
Денис, ну напиши уже строчку! Когда научусь молиться - помолюсь! (это в планах на пенсию)
   ДенисЧ
 
13 - 13.08.19 - 16:47
(12) Давно я не брал в руки клюшек...
Попробуй БазаОЛЕ.ИмяПеременной = ОЛЕЗначение
   azernot
 
14 - 13.08.19 - 17:03
Вот это вставить в глобальник 7.7

Перем СписокЗначенийЗапроса[10] Экспорт; 
// Мы в них запихнем"значения для запроса


Функция СкорректироватьСписок(
ИндексМассива,
Действие,
ТипОбъекта = "",
ВидОбъекта = "",
Параметр1 = "",
Параметр2 = "",
Параметр3 = "", 
// Ну и далее, сколько надо

// ...
Параметр99 = "") Экспорт 

ИндексМассива=Число(ИндексМассива); 

Если ИндексМассива = 0 Тогда
Возврат -99; 
// Не указали индекс массива 

КонецЕсли; 

Если Действие = 1 Тогда
// Очистить список значений

СпЗапроса[ИндексМассива].УдалитьВсе();
Возврат 1; 

ИначеЕсли Действие = 2 Тогда 
// Добавить объект в список


Если ТипОбъекта = "Документ" Тогда

Если ВидОбъекта = "" Тогда
Возврат -99; 
// Передавайте нормальный вид объекта!

КонецЕсли; 

Попытка
Док = СоздатьОбъект("Документ."+ВидОбъекта);
Исключение
Возврат -99; 
// Попытка обращения к неверному объекту

КонецПопытки; 

Если 
Док.НайтиПоНомеру(Параметр1,Параметр2)=1 
Тогда
СпЗапроса[ИндексМассива].ДобавитьЗначение(
Док.ТекущийДокумент());
Возврат 1;// Нашли документ

Иначе
Возврат 0;// Не нашли документ :(

КонецЕсли; 

ИначеЕсли ТипОбъекта = "Справочник" Тогда

Если ВидОбъекта = "" Тогда
Возврат -99; 
// Передавайте нормальный вид объекта!

КонецЕсли;

Попытка
Спр = СоздатьОбъект("Справочник."+ВидОбъекта);
Исключение
Возврат -99; 
// Попытка обращения к неверному объекту

КонецПопытки;

// Параметр1 – Код

// Параметр2 – наименование
// Параметр3 – флаг глобального поиска 


Если 
Спр.НайтиПоКоду(Параметр1,Число(Параметр3))=1 
Тогда
СпЗапроса[ИндексМассива].ДобавитьЗначение(
Спр.ТекущийЭлемент());
Возврат 1;// Нашли элемент 


ИначеЕсли 
Спр.НайтиПоНаименованию(
Параметр2,
Число(Параметр3))=1
Тогда
СпЗапроса[ИндексМассива].ДобавитьЗначение(
Спр.ТекущийЭлемент());
Возврат 1;// Нашли элемент


Иначе
Возврат 0;// Не нашли элемент :(

КонецЕсли; 

ИначеЕсли ТипОбъекта = "Счет" Тогда

// Вид объекта – Идентификатор плана счетов

// Параметр1 – Код счета 

Если ВидОбъекта<>"" Тогда
ИскомыйСчет = СчетПоКоду(Параметр1,
ПланСчетов.ЗначениеПоИдентификатору(
ВидОбъекта));
Иначе
ИскомыйСчет = СчетПоКоду( Параметр1);
КонецЕсли;

Если ПустоеЗначение(ИскомыйСчет) = 1 Тогда
Возврат 0;// не нашли счет :(

Иначе
СпЗапроса[ИндексМассива].ДобавитьЗначение(
ИскомыйСчет);
Возврат 1;// нашли счет

КонецЕсли; 

Иначе
Возврат -99; 
// Неверный тип объекта

КонецЕсли; 

ИначеЕсли Действие = 3 Тогда 
// Вернуть размер списка

Возврат 
СпЗапроса[ИндексМассива].РазмерСписка();

Иначе
Возврат -99; 
// Неверное действие

КонецЕсли; 

Возврат -999; 
КонецФункции

Процедура ПриНачалеРаботыСистемы() 

// Данная процедура уже есть в глобальном модуле, 

// просто надо дописать в неё несколько строк: 

Для к=1 По 10 Цикл
СпЗапроса[к]=СоздатьОбъект("СписокЗначений");
КонецЦикла;

КонецПроцедуры

Вот этот код выполнить там, где пытаетесь выполнить запрос

Результат = БазаОле.EvalExpr("СкорректироватьСписок(1,1)");

Результат = БазаОле.EvalExpr("СкорректироватьСписок(1,2,
""Справочник"", ""Номенклатура"",, """ + 
СокрЛП(ГруппаТов.Наименование) + """)");


В запросе
 | Условие (Товар в СписокЗначенийЗапроса[1])";
   Мисти
 
15 - 13.08.19 - 17:17
Спасибо! Очень много. Мне бы всего одну переменную?
Перем ГруппаТов Экспорт; - вставила в 7 в глоб. модуль.
    Если ГрТовара.НайтиПоНаименованию(СокрЛП(ГруппаТов8.Наименование),0,1) >0 Тогда
        ТекЭл = ГрТовара.ТекущийЭлемент();
    Иначе
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("не найдена гр. товара в 7 "+ГруппаТов8);
        ТекЭл = "";
    КонецЕсли;
    БазаОЛЕ.ГруппаТов = ТекЭл;

Так не понимает.
   Мисти
 
16 - 13.08.19 - 17:20
Поле объекта не обнаружено (ГруппаТов)
    БазаОЛЕ.ГруппаТов = ТекЭл;
   azernot
 
17 - 13.08.19 - 17:30
(15) Пропишите в глобальнике 7.7 функцию
Функция УстановитьПеременнуюГруппаТов(Наименование = "")

    СпрТовары = СоздатьОбъет("Справочник.Номенклатура"); 

    Если СпрТовары.НайтиПоНаименованию(СокрЛП(Наименование),0,1) >0 Тогда 
        ГруппаТов = СпрТовары.ТекущийЭлемент(); 
    Иначе 
        Возврат 0;
    КонецЕсли; 

    Возврат 1;
КонецФункции


Вот этот код выполнить там, где пытаетесь выполнить запрос

Результат = БазаОле.EvalExpr("УстановитьПеременнуюГруппаТов("+СокрЛП(ГруппаТов.Наименование)+")");


Если Результат = 0 Тогда 
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("не найдена гр. товара в 7 "+ГруппаТов); 
КонецЕсли;
   Мисти
 
18 - 13.08.19 - 17:48
Мне же надо в запрос засунуть!
Как туда-то?
   azernot
 
19 - 13.08.19 - 17:50
| Условие (Товар в ГруппаТов)";
   azernot
 
20 - 13.08.19 - 17:51
ГруппаТов - это экспортная переменная из глобальника 7.7
   GreyK
 
21 - 13.08.19 - 18:01
(6) Ну и как? Дальше будешь советовать глобальные переменные?
   azernot
 
22 - 13.08.19 - 18:07
(0) Можете сделать вообще вот так:

| Условие (СокрЛП(Товар.Наименование) = СокрЛП("+ГруппаТов.Наименование+"))";
   azernot
 
23 - 13.08.19 - 18:09
+(22)  А не, гоню :)
   Мисти
 
24 - 13.08.19 - 18:09
как же так, когда мне нужно в группе.
   azernot
 
25 - 13.08.19 - 18:10
(21) Вот тут я кавычки пропустил
Результат = БазаОле.EvalExpr("УстановитьПеременнуюГруппаТов("""+СокрЛП(ГруппаТов.Наименование)+")""");
   Мисти
 
26 - 13.08.19 - 18:35
нет, так с кавычками еще хуже. Наверное, лишние.
   ДенисЧ
 
27 - 13.08.19 - 18:55
(21) Буду. А что такого? Пусть девочка хоть к пенсии научится что-то делать...
   Birmingem
 
28 - 13.08.19 - 18:57
А может не черным запросом, а методами регистров попробовать:

РегОле=БазаOLE.CreateObject("Регистр.ОстаткиТоваров");
РегОле.ВыбратьИтоги();

Пока РегОле.ПолучитьИтог()=1 Цикл
Сообщить("Остаток для " +
Рег.Товар.Наименование +
" на складе " +
Рег.Склад.Наименование +
" равен " + Рег.ОстатокТовара
);
КонецЦикла;
   azernot
 
29 - 14.08.19 - 10:16
(26) Блин, ну вот так же
Результат = БазаОле.EvalExpr("УстановитьПеременнуюГруппаТов("""+СокрЛП(ГруппаТов.Наименование)+""")");
   Мисти
 
30 - 14.08.19 - 13:35
(28) Да это не важно! Мне главное - отобрать по группе. А то для отладки - невозможно 4 часа ждать пока там что-то считается.
 
 Рекламное место пустует
   Мисти
 
31 - 14.08.19 - 13:45
Ошибка при вызове метода контекста (Выполнить)
    Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
по причине:
Произошла исключительная ситуация (1С:Предприятие):  Условие (Товар в ГруппаТов <<?>> )
Запрос[8] : Ошибка в выражении 'ГруппаТов'

Всё то же самое.
   azernot
 
32 - 14.08.19 - 17:07
ГруппаТов - точно ЭКСПОРТНАЯ переменная в глобальном модуле 7.7?
Результат = БазаОле.EvalExpr("УстановитьПеременнуюГруппаТов("""+СокрЛП(ГруппаТов.Наименование)+""")");

Сообщить("Результат присовениия группы тов = "+Результат);

Что сообщит?
   Мисти
 
33 - 14.08.19 - 18:57
1 там
   Мисти
 
34 - 14.08.19 - 18:57
я в отладчике вижу


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.