|
Глюк v83.ComConnector | ☑ | ||
---|---|---|---|---|
0
kalleka
02.03.14
✎
07:18
|
цепляюсь через v83.ComConnector с бп 3.0 к бп 3.0
... нд = б.Документы.реализациятоваровуслуг.СоздатьДокумент(); Смотрю в отладчике - все странно. то что должно быть датой - comобъект, ссылочные реквизиты - имеют тип дата или число, табличная часть товары - вообще строка. И каждый раз может все это отличаться. http://s018.radikal.ru/i507/1403/1b/4c31e1f0aa36.png Никто не сталкивался с таким? |
|||
1
Wobland
02.03.14
✎
07:27
|
увидевши необъяснимое, сразу объявил глюком?
|
|||
2
kalleka
02.03.14
✎
07:31
|
(1) Сие есть субъективное толкование) Если дадите разумное объяснение, то плюс вам в карму)
|
|||
3
Wobland
02.03.14
✎
07:31
|
нд не похож на новый документ
|
|||
4
kalleka
02.03.14
✎
07:33
|
(3) вообще не пойми на что похоже
|
|||
5
Мимохожий Однако
02.03.14
✎
07:42
|
(0)Что не получилось? я не понял
|
|||
6
kalleka
02.03.14
✎
07:44
|
(5) Пытаюсь создать новый документ РТУ, а создает не пойми что, счет учета - ложь, руководитль - строка, таб часть товары - строка, соответственно ругается на добавление строки
|
|||
7
kalleka
02.03.14
✎
07:44
|
{Форма.Форма.Форма(269)}: Метод объекта не обнаружен (Добавить)
нстр = нд.Товары.Добавить(); |
|||
8
Мимохожий Однако
02.03.14
✎
07:45
|
Пытаешься создать в чужой базе?
|
|||
9
kalleka
02.03.14
✎
07:45
|
(8) да, все верно
|
|||
10
Wobland
02.03.14
✎
07:45
|
никто кроме ТС не знает, как получился нд на скрине
|
|||
11
kalleka
02.03.14
✎
07:46
|
(10)
б = новый COMОбъект("v83.ComConnector"); //RMTrade сообщить("устанавливается подключение к базе "+стр.путькбазе+""); стрп = "File="""+стр.путькбазе+""";Usr="+стр.имяпользователя+";Pwd="+стр.пароль+""; V8 = б.Connect(стрп);//"File=""c:\InfoBases\Trade"";Usr=""Director"";") |
|||
12
Мимохожий Однако
02.03.14
✎
07:47
|
(7)Внешнее соединение не может работать с формой
|
|||
13
kalleka
02.03.14
✎
07:47
|
(12) у меня создание документа идет
б.Документы.реализациятоваровуслуг.СоздатьДокумент(); Там документобъект возвращается |
|||
14
Wobland
02.03.14
✎
07:47
|
(12) зато может работать в модуле формы
|
|||
15
Мимохожий Однако
02.03.14
✎
07:50
|
(14)Об этом не спорю. Но сообщение об ошибках никак не согласуется с приведенным кодом.
|
|||
16
Wobland
02.03.14
✎
07:51
|
кода тут вообще кот нагадил. смущает слово "форма"? зря
|
|||
17
Hmster
02.03.14
✎
07:55
|
тут такое уже бывало, да и сам видел.
попробуй почистить кэш |
|||
18
hhhh
02.03.14
✎
07:56
|
(13) ком коннектор не работает с формой вообще-то. Зачем вы в форму полезли?
|
|||
19
kalleka
02.03.14
✎
07:59
|
(18) я в нее не лез.
|
|||
20
mdocs
02.03.14
✎
08:14
|
глюк как глюк, чего еще от бетки хотите.
|
|||
21
hhhh
02.03.14
✎
09:02
|
(19) вы (7) почитайте. Вы же написали.
|
|||
22
mdocs
02.03.14
✎
09:18
|
(21) Код в модуле формы уже запрещено писать?
|
|||
23
hhhh
02.03.14
✎
09:20
|
(22) можно. но вызывать из ком-коннектора не надо.
|
|||
24
mdocs
02.03.14
✎
09:21
|
(23) Так вроде ж никто не вызывает
|
|||
25
mdocs
02.03.14
✎
09:23
|
(7) просто ошибка в контексте формы откуда вызывается ком-соединение (если не ошибаюсь).
|
|||
26
kalleka
02.03.14
✎
14:08
|
(25)
если кратко - то я цепляюсь к нескольким базам бп 2 и бп 3 и засовываю соединения в массив, все это на сервере. Функция соединениявернуть() массивбаз = новый Массив; для каждого стр из Объект.таблбаз цикл б = новый COMОбъект("v83.ComConnector"); сообщить("устанавливается подключение к базе "+стр.путькбазе+""); стрп = "File="""+стр.путькбазе+""";Usr="+стр.имяпользователя+";Pwd="+стр.пароль+""; V8 = б.Connect(стрп); //Объект.массивбаз.Добавить(v8); массивбаз.Добавить(v8); сообщить("установлено подключение к базе "+стр.путькбазе+""); конеццикла; возврат массивбаз; КонецФункции выполняю там разные действия, потом пытаюсь в этих базах создать РТУ. И если например работать с 2 базами бп 2.0 и бп 3.0, то он начинает косячить. Причем то в бп 3 корректно заведет рту, а в бп 2 нет, то наоборот. И как с этим справится - не пойму |
|||
27
kalleka
02.03.14
✎
14:11
|
перем образец;
//б = Объект.массивбаз[номбазы-1]; образец = б.документы.РеализацияТоваровУслуг.найтипономеру(Объект.таблбаз[номбазы-1].НомДокаОбразца,Объект.таблбаз[номбазы-1].ДатаДокаОбразца); кк = б.справочники.контрагенты.НайтиПоКоду(Объект.таблбаз[номбазы-1].КодПокупателя); в83 = Объект.таблбаз[номбазы-1].версия83; нд = б.Документы.реализациятоваровуслуг.СоздатьДокумент(); б.ЗаполнитьЗначенияСвойств(нд,образец); //заполним по образцу сначала Если не в83 Тогда нд.УчитыватьНДС = истина; Иначе КонецЕсли; нд.СуммаВключаетНДС=док.СуммаВключаетНДС; нд.контрагент = кк.ссылка; нд.договорконтрагента = кк.ОсновнойДоговорКонтрагента; нд.дата = док.дата; нд.номер = ""; для каждого стр из док.товары цикл нстр = нд.Товары.Добавить(); и вот на добавлении строки в табл товары в новосозданном документе он спотыкается. Если смотреть через отладчик, то там как будто не документобъект создается посредством СоздатьДокумент(), а что то неведомое с набором реквизитов от рту, а типами значений совсем другими |
|||
28
Franchiser
гуру
02.03.14
✎
14:18
|
(27) что такое б у тебя?
|
|||
29
Franchiser
гуру
02.03.14
✎
14:21
|
Делать коннет в цикле и писать в массив это неправильно, возможно в массиве базы переопеределяются, может получится что все базы в результате сошлются на одну единственную имхо.
|
|||
30
Franchiser
гуру
02.03.14
✎
14:24
|
Проверь какие базы у тебя в массив записались в результате после добавления.
|
|||
31
kalleka
02.03.14
✎
14:25
|
(28)
создатьдокументвдопбазе(док,номб,массивбаз[номб-1]) ... процедура создатьдокументвдопбазе(док,номбазы,б) (29) ну а как работать с несколлькими базами? Эта обработка изначально работала на 8.2 с бп 2.0 и еще и с 7-ми базами. |
|||
32
kalleka
02.03.14
✎
14:25
|
(31) Даже если не на те базы, то во всех из них есть РТУ, с табличной частью товары.
|
|||
33
Franchiser
гуру
02.03.14
✎
14:39
|
Попробуй добавлять массив не используя переменную v8. И вообще приведе весь код, в одном месте б у тебя ком-обьект в другом б это база, где и как используется соединениявернуть().
|
|||
34
Franchiser
гуру
02.03.14
✎
14:56
|
И попробуй еще вместо v83.comConnector использовать v82.comconnector для баз 8.2
|
|||
35
kalleka
02.03.14
✎
15:14
|
(33)
&НаКлиенте Процедура создатьдокументы(Команда) // Вставить содержимое обработчика. если не ЗначениеЗаполнено(объект.Образец) тогда сообщить("Не заполнено поле образец!"); Возврат; конецесли; ОсновныеДействияФормыСоздатьДокументыСервер(); КонецПроцедуры Процедура ОсновныеДействияФормыСоздатьДокументыСервер() массивбаз = новый массив; массивбаз = соединениявернуть(); // Вставить содержимое обработчика. вртабл1 = новый ТаблицаЗначений; вртабл1 =объект.табл1.Выгрузить(); вртабл1.Колонки.Добавить("ЦенаЗ"); для каждого стр из вртабл1 цикл стр.ценаз = стр.ценапр; продолжить; если ЗначениеЗаполнено(стр.цена) и ЗначениеЗаполнено(стр.стоимость) тогда стр.ценаз = (стр.цена+стр.стоимость)/2; иначеесли стр.стоимость <> 0 тогда стр.ценаз = стр.стоимость * (1+Объект.Наценка/100); иначе стр.ценаз = 0.01; стр.ценаз = окр(стр.цена * (1-Объект.наценкапр / 100),2); конецесли; Если Объект.тольконаценкапр тогда стр.ценаз = окр(стр.цена * (1-Объект.наценкапр / 100),2); Конецесли; конеццикла; вртабл1.Сортировать("База,Дата"); номб=0; док = документы.ПоступлениеТоваровУслуг.СоздатьДокумент(); для каждого стрб из Объект.таблбаз цикл номб=номб+1; стардата = -1; для каждого стр из вртабл1 цикл если стр.база <> номб тогда продолжить; конецесли; Если стардата =-1 или стардата <> стр.дата тогда остж = Объект.ЖелаемаяСумма; если док.Товары.Количество()>0 тогда док.Записать(РежимЗаписиДокумента.запись); создатьсчф(док); //док.УстановитьНовыйНомер(""+стрб.ПрефиксНомераТек); //док.Записать(РежимЗаписиДокумента.Запись); сообщить("Записан документ "+док.Ссылка); создатьдокументвдопбазе(док,номб,массивбаз[номб-1]); конецесли; док = документы.ПоступлениеТоваровУслуг.СоздатьДокумент(); ЗаполнитьЗначенияСвойств(док,Объект.Образец); док.СуммаВключаетНДС = ложь; Если не объект.версия83 Тогда док.УчитыватьНДС = истина; док.ПредъявленСчетФактура = Ложь;//истина; Конецесли; док.дата = стр.дата; //док.УстановитьНовыйНомер(""+сокрлп(стрб.ПрефиксНомераТек)); //док.ПредъявленСчетФактура = Ложь;//истина; //док.ДатаВходящегоСчетаФактуры = док.Дата; //док.НомерВходящегоСчетаФактуры="1"; док.Контрагент = стрб.поставщик; док.ДоговорКонтрагента = стрб.договор;//док.Контрагент.ОсновнойДоговорКонтрагента; док.Комментарий = "авто"; док.Номер=""; стардата = стр.дата; Конецесли; нстр = док.Товары.Добавить(); ЗаполнитьЗначенияСвойств(нстр,Объект.Образец.Товары[0]); нстр.Номенклатура = стр.товар; нстр.ставкандс = нстр.Номенклатура.ставкандс; нстр.Количество = стр.колво; нстр.Цена = стр.ценаз; ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуТабЧасти(нстр); ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуНДСТабЧасти(нстр); остж = остж - нстр.сумма; конеццикла; если док.Товары.Количество()>0 тогда док.Записать(РежимЗаписиДокумента.Запись); создатьсчф(док); //док.УстановитьНовыйНомер(""+стрб.ПрефиксНомераТек); //док.Записать(РежимЗаписиДокумента.Запись); сообщить("Записан документ "+док.Ссылка); создатьдокументвдопбазе(док,номб,массивбаз[номб-1]); конецесли; конеццикла; КонецПроцедуры процедура создатьдокументвдопбазе(док,номбазы,б) перем образец; //б = Объект.массивбаз[номбазы-1]; образец = б.документы.РеализацияТоваровУслуг.найтипономеру(Объект.таблбаз[номбазы-1].НомДокаОбразца,Объект.таблбаз[номбазы-1].ДатаДокаОбразца); кк = б.справочники.контрагенты.НайтиПоКоду(Объект.таблбаз[номбазы-1].КодПокупателя); в83 = Объект.таблбаз[номбазы-1].версия83; нд = б.Документы.реализациятоваровуслуг.СоздатьДокумент(); б.ЗаполнитьЗначенияСвойств(нд,образец); //заполним по образцу сначала Если не в83 Тогда нд.УчитыватьНДС = истина; Иначе КонецЕсли; нд.СуммаВключаетНДС=док.СуммаВключаетНДС; нд.контрагент = кк.ссылка; нд.договорконтрагента = кк.ОсновнойДоговорКонтрагента; нд.дата = док.дата; нд.номер = ""; для каждого стр из док.товары цикл нстр = нд.Товары.Добавить(); и тут обычно спотыкается |
|||
36
Wobland
02.03.14
✎
15:23
|
прошло 8 часов. наконец-то начались подробности
|
|||
37
Franchiser
гуру
02.03.14
✎
15:28
|
Возможно объект в процедуре на сервере утебы нет сам объет а псевдообъект, попробуй еобразовать его в ревизитформывзначение(). Процедура создатьдокументы() расположена в модуле формы что ли? Не проще было сделать процедуру в модуле объекта или в модуле менеджера? Тогда директива наклиенте не нужна.
|
|||
38
kalleka
02.03.14
✎
15:37
|
(37) Команда да, но потом на сервере идет подключение, и работа в подключении же и идет на сервере
|
|||
39
kalleka
02.03.14
✎
15:39
|
Вообще можно как то уточнить - в какой именно базе соединение? для проверки, а то я уже сам сомневаюсь
|
|||
40
Franchiser
гуру
02.03.14
✎
15:44
|
Обратись к какой нибудь константе базы, например заголовок окна программы. Ну и что что на сервере идет подключение, на сервере можно обратиться к реквизитам формы . Директива насервере это позволяет, ошибка будет только если директива насерверебезконтекста.
|
|||
41
Franchiser
гуру
02.03.14
✎
15:51
|
Ты передаешь контекст текущей формы на сервер, реквизит объект - реквизит формы, а не сам объект, думаю в этом и ошибка.
|
|||
42
kalleka
02.03.14
✎
15:56
|
(41) а можно подробнее?? Что то я недопонимаю чьей именно контекст и в каком месте передается
|
|||
43
Franchiser
гуру
02.03.14
✎
16:00
|
У тебя процедура есть в форме Процедура ОсновныеДействияФормыСоздатьДокументыСервер()
У нее ты не указал директиву, поэтому считается что директива у нее &насервере. При этом возможно обращение как к реквизитам формы так и к рекизитам объекта. Если откроешь документ то в нем есть реквизит который называется Объект - это псевдореквизит самого объекта, к нему ты по ошибке и обращаешься. |
|||
44
Franchiser
гуру
02.03.14
✎
16:01
|
Я имею ввиду в форме документа есть реквизит объект.
|
|||
45
Franchiser
гуру
02.03.14
✎
16:03
|
Напиши перед этой процедурой &насерверебезконтекста тогда у тебя вообще будет ошибка так как объект будет недоступен вообще.
|
|||
46
Franchiser
гуру
02.03.14
✎
16:06
|
Тебе нужно использовать реквизитформывзначение() тогда ты преобразуешь все что есть на форме в объект прикладного типаи дальше будешь работать с ним.
|
|||
47
Franchiser
гуру
02.03.14
✎
16:08
|
В серверно процедуре пишешь Док = реквизитформывзначение("объект") дальше обращаешься к доку.
|
|||
48
Franchiser
гуру
02.03.14
✎
16:18
|
Что- то я сам запутался, объект у тебя обработка
|
|||
49
kalleka
02.03.14
✎
16:18
|
Спасибо, это я сейчас отработаю, но мне не ясно как это связано с
нд = б.Документы.реализациятоваровуслуг.СоздатьДокумент(); где б - из массива массивбаз, переменной объявленной на сервере. причем б.документы.РеализацияТоваровУслуг.найтипономеру срабатывает корректно - данные действительно похожи на документссылка |
|||
50
Franchiser
гуру
02.03.14
✎
16:27
|
Убери пока заполнитьзначениясвойств() посмотри какие типы у созданного документа в отладчике
|
|||
51
Franchiser
гуру
02.03.14
✎
16:28
|
И какие типы в образец
|
|||
52
Franchiser
гуру
02.03.14
✎
16:31
|
Насколько корректно платформа относится к хранению com-объектов в реквизите формы непонятно, нужно было в серверной процедуре создавать массив, а на форме хранить строки в списке аверно.
|
|||
53
Franchiser
гуру
02.03.14
✎
16:34
|
Просто выходит что ты хранишь ком-объекты полученные подключением на сервере на клиенте что ли, что-то непонятное.
|
|||
54
kalleka
02.03.14
✎
16:35
|
(52) в серверной процедуре создается массив и в нем хранятся эти подключения, с клиентом не пересекается. Переменная создается в серверной части, на форме и в объекте переменной с таким именем нет
|
|||
55
kalleka
02.03.14
✎
16:37
|
(51) я не понял как посмотреть эти типы в сом соединении
и поиск по мисте не помог |
|||
56
Franchiser
гуру
02.03.14
✎
16:51
|
образец у тебя com объект ссылка, нд -- comобъет -объект. Непонятно как тут отработает заполнитьзначения свойств. Может оба сделать объектами. Или запрлнять как то иначе.
|
|||
57
kalleka
02.03.14
✎
17:10
|
(56)
Кажется начинаю разбираться. Если переоткрыть программу и оставить в списке баз только одну базу, то он подключится, без проблем, хоть к бп 2, хоть к бп 3 Если он например подключится к бп 2.0, то пока не переоткрыть клиента, он некорректно будет работать с бп 3.0 И соответственно наоборот. Получается что нельзя работать с бп 2 и с бп 3 по-очереди. Что то глючит. А по отдельности, все ок |
|||
58
Franchiser
гуру
02.03.14
✎
17:16
|
Ну так разрывай соединение, подключайся по-очереди.
|
|||
59
kalleka
02.03.14
✎
17:24
|
(58) вот нашел похожую тему, только там человек с 8.1 и 8.2 работал одновременно
Так и не нашел вопроса как корректно закрывать |
|||
60
kalleka
02.03.14
✎
17:25
|
мне даже переоткрытие обработки не помогает. Приходится переоткрывать клиента, чтобы все заработало.
Моэно конечно инструкцию накатать - сначала работайте с базами бп 2, потом переоткройте 1с и работайте с базами бп 3.0)))) |
|||
61
Franchiser
гуру
02.03.14
✎
17:25
|
Вероятно надо избавиться от такой записи б = новый COMОбъект("v83.ComConnector"); может массив какой то сделать куда писать все ком-соединения. Без использования б
|
|||
62
kalleka
02.03.14
✎
17:27
|
(61) Это локальная переменная, в маленькой процедурке. я пробовал переименовать, я даже пробовал новое создавание подключения каждый раз - не помогает
|
|||
63
Franchiser
гуру
02.03.14
✎
17:27
|
Или же сделать б83 = новый COMОбъект("v83.ComConnector"); и б82 = новый COMОбъект("v83.ComConnector");
|
|||
64
kalleka
02.03.14
✎
17:28
|
"Сделал две переменные, т.к. вариантов просто не было. Но это не помогло. "
v8: Как правильно разорвать COM соединение (7.7 - 8.2) |
|||
65
Franchiser
гуру
02.03.14
✎
17:29
|
в управляемых формах хитро все работает. Соединение будет существовать до тех пор пока не обнулишь все объекты которые имеют отношение к соединению сам сталкивался с эти, то есть всякие ком-справочники и документы нужно очищать.
|
|||
66
Franchiser
гуру
02.03.14
✎
17:31
|
Присвой значение неопреределено всем созданным справочника , документам , тч, найденным ссылкам и тд.
|
|||
67
kalleka
02.03.14
✎
17:33
|
(66) Так если я обработку закрываю и все-равно не срабатывает? Сейчас конечно попробую обнулить
|
|||
68
Franchiser
гуру
02.03.14
✎
17:35
|
После выполнения процедуры не должно оставаться com-объекта иначе косяки были такие же при подключении к следующей базе. Кстати вспомнил натыкался как раз на то же самое) подключение правда делал к 1с7.7 из тонкого клиента бп 3.0. И проблема решилась после обнуления.
|
|||
69
Franchiser
гуру
02.03.14
✎
17:37
|
могу поискать свою обработку и выслать на почту
|
|||
70
Franchiser
гуру
02.03.14
✎
17:41
|
Точнее там даже не косяк был просто ошибка неизвестная при попытке соединиться со следующей базой.
|
|||
71
Franchiser
гуру
02.03.14
✎
17:54
|
Тогда занимался трансформацией обработки с обычных форм на управляемые...
|
|||
72
kalleka
02.03.14
✎
18:10
|
(71) я обработку с бп 2 на бп 3 переделываю.
Я сами подключения обнуляю. Неужели и все переменные надо обнулять, что использовались? Они же локальные и закрываются, по сути |
|||
73
ДенисЧ
02.03.14
✎
18:11
|
(72) "закрываются, по сути"
А ты их локально объявляешь явно? |
|||
74
Franchiser
гуру
02.03.14
✎
18:14
|
(72) у меня также было в обычных формах работало, перевел на управляемые подключалась только первая база. Обнулял подключения не помогло, как все ком-объекты обнулил, стали подключаться остальные базы.
|
|||
75
kalleka
02.03.14
✎
18:14
|
(73) часть неявно кстати
|
|||
76
Franchiser
гуру
02.03.14
✎
18:15
|
Ухожу, буду вечером, если нужен будет пример обработки пиши.
|
|||
77
ДенисЧ
02.03.14
✎
18:16
|
(75) Ну вот. Тогда они у тебя не локальные а глобальные. Или явно обнуляй, или явно объявляй в пределах функции.
|
|||
78
kalleka
02.03.14
✎
19:27
|
(77) все вроде обнуляю, а все-равно. Упускаю может что
|
|||
79
kalleka
02.03.14
✎
20:09
|
для каждого стр из Объект.таблбаз цикл
б = новый COMОбъект("v83.ComConnector"); сообщить("устанавливается подключение к базе "+стр.путькбазе+""); стрп = "File="""+стр.путькбазе+""";Usr="+стр.имяпользователя+";Pwd="+стр.пароль+""; V8 = б.Connect(стрп);//"File=""c:\InfoBases\Trade"";Usr=""Director"";") текДок = V8.документы.РеализацияТоваровУслуг.СоздатьДокумент(); Тстр = текдок.товары.Добавить(); текДок =Неопределено; Тстр =Неопределено; v8 = Неопределено; б=Неопределено; сообщить("установлено подключение к базе "+стр.путькбазе+""); конеццикла; вот тестовое соединение - все обнуляю в цикле, но все-равно вываливается с ошибкой на 2 строчке |
|||
80
Franchiser
гуру
02.03.14
✎
21:06
|
Попробуй каждый объект явно определять и в конце устанавливать в неопределено. Тч товары опиши как то . Может порядок обнуления имеет значение. Контроллируй в отладчике что значение неопределено устанавливается.
|
|||
81
Franchiser
гуру
02.03.14
✎
21:21
|
Еще можешь контроллировать что ком-соединение пропало, открыв базу к которой подключаешься и посмотрев активные подключения.
|
|||
82
Franchiser
гуру
02.03.14
✎
21:25
|
Для баз 1с 8 возможна так надо:
Может так попробуете: Если НЕ База Тогда ВывестиСообщение("Подключение не было установлено!"); Иначе Попытка КомСоединитель.Terminate(Ложь); Исключение КонецПопытки; База = Ложь; КонецЕсли; |
|||
83
Franchiser
гуру
02.03.14
✎
22:31
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |