![]() |
![]() |
|
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) т.е. думаешь
не выведет 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-обращения).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |