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

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

Вкратце: в 1С 7.7 заводится экспортная переменная (масссив), в неё присваивается нужное значение через EvalExpr и уже на неё ставится условие
8 azernot
 
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) Давно я не брал в руки клюшек...
Попробуй БазаОЛЕ.ИмяПеременной = ОЛЕЗначение
14 azernot
 
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
Поле объекта не обнаружено (ГруппаТов)
    БазаОЛЕ.ГруппаТов = ТекЭл;
17 azernot
 
13.08.19
17:30
(15) Пропишите в глобальнике 7.7 функцию

Функция УстановитьПеременнуюГруппаТов(Наименование = "")

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

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

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


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

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


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

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

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

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

Всё то же самое.
32 azernot
 
14.08.19
17:07
ГруппаТов - точно ЭКСПОРТНАЯ переменная в глобальном модуле 7.7?

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

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

Что сообщит?
33 Мисти
 
14.08.19
18:57
1 там
34 Мисти
 
14.08.19
18:57
я в отладчике вижу
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс