Имя: Пароль:
1C
1С v8
Глюк 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
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший