Имя: Пароль:
1C
1C 7.7
v7: ОЛЕ-соединение. "Незвестная ошибка"
0 palpetrovich
 
26.04.12
11:46
1 - подключение из Бух к ТиС
2 - в ТиС-е:  ВременныйРасчет + РассчитатьРегистрыНа + ВыгрузкаРезультата в ТЗвТиС-е  
Время от времени на выгрузке в ТЗ - "Незвестная ошибка"

Вроде-бы баян, напомните пожалуйста старому склеротику пути решения ...если они есть конечно
зы: мопед не мой, я только объяву разместил :)
1 palpetrovich
 
26.04.12
11:50
+(0)  "монопольность" работы - от ошибки не спасает.  Сам наблюдал удаленно, из 10 попыток, раза 4 - вылет
2 palpetrovich
 
26.04.12
11:58
на глаз время работы невелико, заподозрить "засыпание" подключения вроде как нельзя

зы: я почему вообще обратился за помощью, друг у меня там работает...
3 palpetrovich
 
26.04.12
12:16
апну разок
4 andrewks
 
26.04.12
13:15
(2) ну, показывайте вашего друга  )))
5 palpetrovich
 
26.04.12
14:51
(4) правда правда
6 dk
 
26.04.12
14:55
Может ТЗ офигенная и оперативка кончается
отладчик не предлагать?
7 Kreont
 
26.04.12
14:57
может банально вирусы в сетке, если ч-з ОЛЕ и по сети
8 andrewks
 
26.04.12
14:58
(5) сдаётся мне, что это как-то связано с Крайной.

локаль какая стоит?
9 palpetrovich
 
26.04.12
14:59
(7) хм, я че-т сомневаюсь
зы: действие происходит в терминале
10 palpetrovich
 
26.04.12
14:59
(8) Крайной=Окраиной=Украиной? ;)
11 andrewks
 
26.04.12
14:59
(10) ага
12 andrewks
 
26.04.12
15:02
13 palpetrovich
 
26.04.12
15:03
(11) ну дык ... а что, у нас тут так и должно быть? :)
2003 сервер. Терминалка.

   Фр  = БазаОЛЕ.CreateObject("Справочник.Фирмы");
   Скл = БазаОЛЕ.CreateObject("Справочник.МестаХранения");
   Скл.НайтиПоКоду(Склад.Код,0);
   
   Рег  = БазаОЛЕ.CreateObject("Регистры");                              

   РегП = Рег.ПартииТоваров;
   РегП.УстановитьЗначениеФильтра("Фирма", БазаОЛЕ.Константа.ОсновнаяФирма);
   РегП.УстановитьЗначениеФильтра("Склад", Скл.ТекущийЭлемент());
   РегП.ВременныйРасчет(1);          
   
   Рег.РассчитатьРегистрыПо(КонДата);                
   
   ТаблИтог = БазаОЛЕ.CreateObject("ТаблицаЗначений");
   
   РегП.ВыгрузитьИтоги(ТаблИтог);
// тут вылет
14 palpetrovich
 
26.04.12
15:06
(12) спасибо конечно, но малехо не то
15 palpetrovich
 
26.04.12
15:12
+13 я вот думаю, в строке
Рег.РассчитатьРегистрыПо(КонДата);
не могла собака порыться в части "КонДата"?
16 andrewks
 
26.04.12
15:13
если дата за ТА?
17 palpetrovich
 
26.04.12
15:16
(16) ну и это наверное ...но я подумал вот о чем:  а не может-ли быть сбоев при преобразовании Дата-Строка-Дата?
18 palpetrovich
 
26.04.12
15:16
+17 "дата"  по оле все-равно ж передается как строка?
19 dk
 
26.04.12
15:17
если совсем капец, по ОЛЕ не можешь настроить, то можно через ExecuteBatch все выполнить, загрузить все в OLE-ную глРасшифровка
А потом просто получить
МояТЗ = ОЛЕ.EvalExpr("глРасшифровка");
20 palpetrovich
 
26.04.12
15:18
(19) не, там не совсем капец, там "Время от времени"
21 andrewks
 
26.04.12
15:18
попробуй в след. раз при ошибке выполнить этот же код в той базе, но зайдя в неё нормально, не по оле. возможно, там она пишет что-то более осмысленное
22 palpetrovich
 
26.04.12
15:21
(21) отловить будет трудно, я удаленно раз 10 подряд пробовал. Ошибка - раза 4 была
23 palpetrovich
 
26.04.12
15:21
+22 а вообще - это идея, надо будет в тисе аналогичный код погонять. Спасибо
24 Torquader
 
26.04.12
22:56
Ошибка возникает из-за окончания интервала времени на выполнение команды по ole-запросу.
Если вызываемое приложение выполняет долгий расчёт-то подсистема ole-может прервать вызов,но почему-то она это делает не всегда.
У меня вызов "осла" из vbscript - но ошибка та же самая - и - самое противное,что случайная -то есть иногда десять минут ждёт загрузки файла и ничего, а иногда через минуту отваливается.
Выход - использовать вызов не по ole,а каким-нить другим способом.
25 Cthulhu
 
26.04.12
23:06
(19): значение глоб.переменной оле-контекста к моменту выполнения присвоения очистится. совсем.
между обращениями к оле-контексту сохраняются переменные только в глоб.массивах.
26 Cthulhu
 
26.04.12
23:07
(25): "сохраняются значения переменных".
прим.: транзакция, кстати, активна тоже только в рамках одного обращения к оле-контексту. так, на всякий случай. ;)
27 Torquader
 
27.04.12
01:10
Если нужно выполнить только одну команду - то можно попробовать открыть базу обычным образом и послать ей dde-запрос - который может выполняться сколь угодно долго.
В случае ddeoбмена rpcвызовы не используются и никакого таймаута не будет.
28 Cthulhu
 
27.04.12
01:16
(27): а дде-шка же вроже асинхронно отрабатывает. как узнать что отработано? или все так же как по оле?
(никогда не юзал - пардон если вопрос туп)
29 Torquader
 
27.04.12
01:23
DDE,конечно,работает кривовато.
Дело в том,что 1С поддерживает только запрос Request,а с командой Execute у них не срослось.
То есть мы вызываем dde-запрос и ждём ответа.
В системе запрос отсылается одним Windows-сообщением,а ответ - другим.
Сообщения посылаются специальным невидимым окнам.
Самое печальное,что DDE-запрос прерывает код в момент перехода с одной строки на другую,например,можно открыть форму в момент проведения документа.
30 Torquader
 
27.04.12
01:32
У меня DDE работало в паре с обработкой ожидания для синхронизации - сторонняя программа говорила базе,что пора что-то делать,и база делала,но всё время выполнять обработку ожидания не было надобности.
Просто корни проблемы были в том,что работа по Ole из javascript оказалась смертельной - встроенный в javascript алгоритм обработки памяти (сборка мусора)насмерть блокирует объект 1с - и зайти второй раз в базу нельзя,пока сборка мусора не освободит объект. То есть приходилось закрывать javascript - потом я провёл эксперимент с созданием множества объектов и при переходе счётчика количества через байт  сборка мусора вызывалась - а до этого объекты торчали где-то "в заднице" у javascript-а живые,но недоступные - с тех пор я javascript как язык программирования не воспринимаю.
31 dk
 
27.04.12
08:01
(27) т.е. думаешь

Оля.Executebatch("глРасшифровка = 1;");
Сообщить(Оля.EvalExpr("глРасшифровка"));
Сообщить(Оля.глРасшифровка);
Оля.Executebatch("глРасшифровка = 2;");
Сообщить(Оля.EvalExpr("глРасшифровка"));
Сообщить(Оля.глРасшифровка);
Оля.Executebatch("глРасшифровка = 3;");
Сообщить(Оля.EvalExpr("глРасшифровка"));
Сообщить(Оля.глРасшифровка);
Оля.Executebatch("глРасшифровка = 4;");
Сообщить(Оля.EvalExpr("глРасшифровка"));
Сообщить(Оля.глРасшифровка);

не выведет 11,22,33,44?
32 Torquader
 
27.04.12
09:56
(31) Не путать OLE и DDE - в DDE нет команды ExecuteBatch - там только Eval - поэтому, присвоение можно сделать только если в глобальном модуле есть специальная функция, которая одному параметру присваивает другой.
Что касается глобальных переменных, то они прекрасно доступны через OLE.
33 dk
 
27.04.12
10:09
(31) -> (25)
34 Cthulhu
 
01.05.12
13:49
(31): да попробуй, что может быть проще-то???
35 Cthulhu
 
01.05.12
13:52
(32): см.(25),(26). так что увы, только элементы массива и объекты данных (кроме, конечно, случаев, когда переменные нужно хранить в пределах блока кода, выполняемого в рамках одного OLE-обращения).
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн