Имя: Пароль:
1C
1C 7.7
v7: проблема с OLE
0 vsy
 
28.02.12
07:56
Задача простая нужно по оле получить цену товара. По оле подключаюсь нормально, но используя функцию ничего не получаю.
вот кусок кода:
   База = СоздатьОбъект("v77s.Application");
   СтрокаПодключения = "/D"""+СокрЛП(ПутьКБазе)+""" /N"""+СокрЛП(Пользователь)+""" /P"""+СокрЛП(Пароль)+"""";
   РезультатПодключения=База.Initialize(База.RMTrade,СтрокаПодключения,?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
   Если РезультатПодключения = 0 Тогда
       Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
   КонецЕсли;
   спрном=База.CreateObject("Справочник.Номенклатура");
...........
спрном.ВыбратьЭлементы();
   Пока спрном.ПолучитьЭлемент()=1 Цикл  
       если спрном.ЭтоГруппа()=1 Тогда  
           Продолжить;
       КонецЕсли;
.....
       ВремЦена= База.EvalExpr("глВернутьЦену(спрном.наименование,"+База.Константа.РозничнаяКатегорияЦен+").Цена.Получить(РабочаяДата())");
Вот здесь подвох База.Константа.РозничнаяКатегорияЦен не возвращает константу.
Что то не догоняю, кто по оле спец подскажите пожалуйста, где ошибка.
1 andrewks
 
28.02.12
08:04
конкатенация со строкой
2 andrewks
 
28.02.12
08:06
спрном.наименование - тоже строка
3 vsy
 
28.02.12
08:14
А как надо спрном.текущийэлемент()
4 DJ Anthon
 
28.02.12
08:18
в принципе по-другому надо.

База.Константа.РозничнаяКатегорияЦен без кавычек пробовал?
5 vsy
 
28.02.12
08:18
База.Константа.РозничнаяКатегорияЦен должна вернуть строку тогда и склеится нормально
6 DJ Anthon
 
28.02.12
08:19
почему ты думаешь, что там по наименованию ищется? туда объекты надо подставлять, которые сначала найти надо
7 vsy
 
28.02.12
08:19
База.Константа.РозничнаяКатегорияЦен должна вернуть строку, тогда и склеится нормально
8 DJ Anthon
 
28.02.12
08:20
ничего страшного, мы на грамматику внимания не обращаем.
9 ЧеловекДуши
 
28.02.12
08:22
Сделай проще:

База.EvalExpr("глВернутьЦену(спрном.наименование,"+База.Константа.РозничнаяКатегорияЦен+").Цена.Получить(РабочаяДата())");

можно вот так

База.EvalExpr("глВернутьЦену(спрном.наименование,Константа.РозничнаяКатегорияЦен).Цена.Получить(РабочаяДата())");

Все ровно все выполняется там, накой тебе это тут получать?
10 andrewks
 
28.02.12
08:24
(9) всё равно не взлетит. ему нужно объект передать 1-м параметром
11 ЧеловекДуши
 
28.02.12
08:25
+ если точнее, то я делал вот так...

ИБПр.ExecuteBatch("глУсловие1 = Перечисление.ВидыОперацийСчетаФактурыВыданного.Реализация;");
ИБПр.ExecuteBatch("глУсловие2 = СчетПоКоду(""91.2"");");
ИБПр.ExecuteBatch("глУсловие3 = глЗначениеПоУмолчанию(""ОсновнойБанковскийСчет"");");
ИБПр.ExecuteBatch("глУсловие4 = СчетПоКоду(""90.3"");");

Т.е. По существу я в глобальнике ОЛЕ БД добавил ряд глобальных переменных и использовал их для плучения - установки тех или иных параметров, в плоть до запроса :)
12 ЧеловекДуши
 
28.02.12
08:25
(10)Он не передаст :)
13 vsy
 
28.02.12
08:26
ЧеловекДуши спасибо это мысль
14 andrewks
 
28.02.12
08:26
думаю, без написания отдельной функции в ГМ оле-базы будет туго

например, глВернутьЦенуПоКоду(КодНом,...
15 andrewks
 
28.02.12
08:27
либо переписать глВернутьЦену в этой базе для работы с данными по оле
16 DJ Anthon
 
28.02.12
08:28
я бы глВернуть цену выполнил не в ОЛЕ, а код ее скопировал и переделал на ОЛЕ, а то по-деревянному как-то получается
17 DJ Anthon
 
28.02.12
08:28
(15) успел раньше )))
18 vsy
 
28.02.12
08:28
andrewks, не понял, а чем сейчас функция отличается от предложенной.
19 andrewks
 
28.02.12
08:29
(18) сейчас она 1-м параметром принимает ссылку на объект, а в (14) 1-м параметром будет код, который является простым типом, и его можно завернуть в строку
20 ЧеловекДуши
 
28.02.12
08:30
(14)Ага, вот пример того, как туго без Гл процедур :)

Процедура ЗаписьЖурналаРегистрацииОЛЕ(Коммент,ТипСобытия,Событие,ОбъектОЛЕ,Категория)
   Перем ТЗ_ОЛЕ;
   
   ИБПр.глУсловие12="";
   ИБПр.ExecuteBatch("глУсловие12 = СоздатьОбъект(""ТаблицаЗначений"");
   |глУсловие12.НоваяКолонка(""Коммент"",""Строка"");
   |глУсловие12.НоваяКолонка(""ТипСобытия"",""Строка"");
   |глУсловие12.НоваяКолонка(""Событие"",""Строка"");
   |глУсловие12.НоваяКолонка(""ОбъектОЛЕ"");
   |глУсловие12.НоваяКолонка(""Категория"",""Число"");");
   
   //ТЗ_ОЛЕ = СоздатьОбъект("ТаблицаЗначений");
   //ТЗ_ОЛЕ.НоваяКолонка(""Коммент"",""Строка"");
   //ТЗ_ОЛЕ.НоваяКолонка(""ТипСобытия"",""Строка"");
   //ТЗ_ОЛЕ.НоваяКолонка(""Событие"",""Строка"");
   //ТЗ_ОЛЕ.НоваяКолонка(""ОбъектОЛЕ"");
   //ТЗ_ОЛЕ.НоваяКолонка(""Категория"",""Число"");");
   ТЗ_ОЛЕ = ИБПр.глУсловие12;
   ТЗ_ОЛЕ.НоваяСтрока();
   ТЗ_ОЛЕ.Коммент      = СокрЛП(Коммент);
   ТЗ_ОЛЕ.ТипСобытия = СокрЛП(ТипСобытия);
   ТЗ_ОЛЕ.Событие      = СокрЛП(Событие);
   ТЗ_ОЛЕ.ОбъектОЛЕ  = ОбъектОЛЕ;
   ТЗ_ОЛЕ.Категория  = Число(Категория);
   
   ИБПр.ExecuteBatch("ЗаписьЖурналаРегистрации(глУсловие12.Коммент,глУсловие12.ТипСобытия,глУсловие12.Событие,глУсловие12.ОбъектОЛЕ,глУсловие12.Категория);");
   
КонецПроцедуры    // ЗаписьЖурналаРегистрацииОЛЕ(Коммент,ТипСобытия,Событие,ОбъектОЛЕ,Категория)


или

   //БИ = СоздатьОбъект("БухгалтерскиеИтоги");
   БИ = ИБПр.CreateObject("БухгалтерскиеИтоги");
   ДержательОЛЕ = БИ;
   
   ИБПр.ExecuteBatch("глУсловие1 = Дата("+ДатаГод(НачДата)+","+ДатаМесяц(НачДата)+","+ДатаЧисло(НачДата)+")");
   ИБПр.ExecuteBatch("глУсловие2 = Дата("+ДатаГод(КонДата)+","+ДатаМесяц(КонДата)+","+ДатаЧисло(КонДата)+")");
   ИБПр.ExecuteBatch("глУсловие3 = ВидыСубконто.Контрагенты;");
   
   БИ.ИспользоватьСубконто(ИБПр.глУсловие3, , 1);
   БИ.ВыполнитьЗапрос(ИБПр.глУсловие1, ИБПр.глУсловие2, "62",,, 1, "Проводка", "С");//Проводка - Период
   

Вот типо такого ;)
21 andrewks
 
28.02.12
08:30
но лучше таки (15)(16)
22 vsy
 
28.02.12
08:30
мысль ясна буду пробовать