Имя: Пароль:
1C
1С v8
Проблема с OLE
0 SyncMaster7
 
08.08.12
11:39
Платформа 8.2.15.289. Конфигурация УПП 1.3.28.1. Необходимо по OLE перекинуть данные по договорам из обной базы в другую. Конфигурации одинаковые и без изминений.

Пишу внешную обработку. Создаю коннект. Все работает. Данные прочитать из второй базы можно.

Но как только я пробую создать в ней новый элемент - получаю ошибку:
{Форма.Форма.Форма(30)}: Ошибка при вызове метода контекста (СоздатьЭлемент)    СпрДоговорыКонтрагентов.СоздатьЭлемент(); по причине:Произошла исключительная ситуация (1C:Enterprise 8.2.15.289): {ОбщийМодуль.ОбщегоНазначения.Модуль(29,2)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
Иду по ошибке - там процедура - ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Таблица2, ТаблицаРезультат);
Зашел в ОбщийМодуль.ОбщегоНазначения там нахожу данную процедуру ДополнитьТаблицу. К тому же она - Экспорт.

Вот текст:

// Вставить содержимое обработчика.
V8 = Новый COMObject ("V82.COMConnector");
// создается объект COM -соединение
Попытка
Соединение = V8.Connect ("Srvr =""appl-srv""; Ref = ""it"";  Usr =""User"";  Pwd = ""123""");
Исключение
Предупреждение (" База данных не открыта! ");
Возврат;
КонецПопытки;
СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
СпрДоговорыКонтрагентов.СоздатьЭлемент();
СпрДоговорыКонтрагентов.Комментарий = " Перенос: cоздан автоматически ";
СпрДоговорыКонтрагентов.Наименование = " Test ";
СпрДоговорыКонтрагентов.Записать();

В чем проблема?
1 Лоботряс
 
08.08.12
11:42
7-рошник?
2 бомболюк
 
08.08.12
11:42
ну значит этот общий модуль недоступен для внешнего соединения, чего ж тут непонятного то.
3 Лоботряс
 
08.08.12
11:44
(2) Не.
Вот сюда смотри

СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
СпрДоговорыКонтрагентов.СоздатьЭлемент();
СпрДоговорыКонтрагентов.Комментарий = " Перенос: cоздан автоматически ";
СпрДоговорыКонтрагентов.Наименование = " Test ";
СпрДоговорыКонтрагентов.Записать();
4 Галахад
 
гуру
08.08.12
11:44
Не проще читать данные по оле, а писать уже нормально, в текущую базу?
5 SyncMaster7
 
08.08.12
11:45
Так везде и всюду (начиная с книжек Радченко или Габеца) приводят именно такой пример текста, как у меня.
И в 8.1 у меня оно работало. Да и с 7-й проблем не было.
Что предпринять то, вроде задачка совсем простая, а не получается.
6 DrShad
 
08.08.12
11:46
(3) а что там не так?
7 DrShad
 
08.08.12
11:46
(5) и именно со справочником договоров у Радченко или Габеца дословно так?
8 SyncMaster7
 
08.08.12
11:47
Надо именно из базы, где запускается обработка данные по договору скинуть во вторую базу. То есть, создавать новый элемент справочника надо именно там.
9 бомболюк
 
08.08.12
11:47
(3) процедура этого модуля вызывается где нить в модуле объекта. Объект создается во внешнем соединении, а модуль наверняка для внешнего соединения недоступен. Проверь, есть там галка соответствующая?
10 SyncMaster7
 
08.08.12
11:49
Галка для работы с внешним соединением есть.
11 SyncMaster7
 
08.08.12
11:51
В книжках приводят примеры для справочника Организации и Номенклатура.
Но я для примера и их пробовал - та же ошибка.
12 бомболюк
 
08.08.12
11:52
Подписки на события тоже проверь
13 SyncMaster7
 
08.08.12
11:55
Кстати, если поменять  V8 = Новый COMObject ("V82.COMConnector"); на V8 = Новый COMObject ("V82.Application"); и грузить полное приложение, то ошибка выскакивает уже другая:

{Форма.Форма.Форма(25)}: Значение не является значением объектного типа (Справочники)
   СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
14 бомболюк
 
08.08.12
11:57
(13) в Application и COMConnector по разному соединение организуется. Сделай не
Соединение = V8.Connect ("Srvr =""appl-srv""; Ref = ""it"";  Usr =""User"";  Pwd = ""123""");
а
Соединение = V8;
Соединение.Connect ("Srvr =""appl-srv""; Ref = ""it"";  Usr =""User"";  Pwd = ""123""");
15 Галахад
 
гуру
08.08.12
12:00
Гм.
ОбщегоНазначенияКлиентСервер <> ОбщегоНазначения
Или в описании ошибки ошибка?
16 Лоботряс
 
08.08.12
12:02
(6) Не рабочий код
17 DrShad
 
08.08.12
12:02
(16) почему?
18 бомболюк
 
08.08.12
12:02
(16) гыыы, точняк
19 SyncMaster7
 
08.08.12
12:04
Сорри, конечно модуль ОбщегоНазначенияКлиентСервер, а не ОбщегоНазначения.
И галка на внешнее соединение у него не стоит.
Поскольку конфу трогать нельзя - какие есть варианты обхода?
20 Лоботряс
 
08.08.12
12:04
(17)Б_ть, потому что он менеджеру присваивает значения а не элементу...
21 Галахад
 
гуру
08.08.12
12:04
(16) Покажи рабочий.
22 Галахад
 
гуру
08.08.12
12:05
(20) А, точно.
23 Лоботряс
 
08.08.12
12:05
СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
НовыйЭлемент = СпрДоговорыКонтрагентов.СоздатьЭлемент();
НовыйЭлемент.Комментарий = " Перенос: cоздан автоматически ";
НовыйЭлемент.Наименование = " Test ";
НовыйЭлемент.Записать();
24 DrShad
 
08.08.12
12:05
(20) точно, пора на свалку :)
25 Лоботряс
 
08.08.12
12:06
Я ж говорю - семерочник...
26 Лоботряс
 
08.08.12
12:06
(25)Не в обиду:))
27 SyncMaster7
 
08.08.12
12:13
Да фигня вопрос. Просто всю голову сломал с OLE, а на присвоения уже не обращал внимание.

Вернул V8 = Новый COMObject ("V82.COMConnector");
Вставил код Лоботряса - получил ошибку

{Форма.Форма.Форма(31)}: Поле объекта не обнаружено (Справочники)
   СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
28 DrShad
 
08.08.12
12:15
(27) ты же божился что у Габеца слово в слово
29 Лоботряс
 
08.08.12
12:18
Не могет быть... А соединение точно подключилось? Или у тебя в подключаемой конфе нет справочников...
30 SyncMaster7
 
08.08.12
12:22
Габец Простые примеры разработки стр.348.
Про коннект опускаю - там к файловой базе.
Далее -
МенеджерНоменклатуры = Открытие.Справочники.Номенклатура;
МенеджерОрганизации  = Открытие.Справочники.Организации;

Далее идет обработка выборки и в ней:
Если Организация.Пустая() Тогда
 Организация = МенеджерОрганизации.СоздатьЭлемент();
 Организация.Код = Код;

 Организация.Записать();
КонецЕсли;
31 DrShad
 
08.08.12
12:23
(30) ну и совсем не похоже на то что было у тебя
32 SyncMaster7
 
08.08.12
12:23
Точно подключилось. Я могу из справочника ДоговораКонтрагентов получить любые данные.
Может тут собака порылась в SQL базе, а не в файловой?
33 DrShad
 
08.08.12
12:23
(32) да разницы нет
34 hhhh
 
08.08.12
12:24
(30) ты там точно в полуобморочном состоянии? Лоботряс тебе V8= кинул для Application, а ты его в (27) В COMConnector присобачиваешь.
35 Лоботряс
 
08.08.12
12:25
(32)А как получаешь?
36 SyncMaster7
 
08.08.12
12:26
Да я уже понял, что накосячил с присвоением. Поправил, но ошибка все равно возникает. Теперь с самим справочником.
А если вернуть Application, то получаю ошибку
{Форма.Форма.Форма(31)}: Поле объекта не обнаружено (ДоговорыКонтрагентов)
   СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
37 Галахад
 
гуру
08.08.12
12:27
(36) Ты целиком код показывай. С соединением.
38 SyncMaster7
 
08.08.12
12:27
Да я уже все варианты перебираю. И с COMConnector и с Application.
Но вообще-то надо для COMConnector сделать.
39 SyncMaster7
 
08.08.12
12:30
Вот полный код:

Процедура КнопкаВыполнитьНажатие(Кнопка)
   // Вставить содержимое обработчика.
   // Вставить содержимое обработчика.
   //V8 = Новый COMObject ("V82.COMConnector");
     V8 = Новый COMObject ("V82.Application");                                      
   // создается объект COM -соединение
   Попытка
       Соединение = V8;
       Соединение.Connect ("Srvr =""appl-srv""; Ref = ""it"";  Usr =""User"";  Pwd = ""12345""");
   Исключение
       Предупреждение (" База данных не открыта! ");
       Возврат;
   КонецПопытки;

   //МенеджерДоговораУПП = Соединение.Справочники.ДоговорыКонтрагентов;
   //НовыйДоговорУПП  =  МенеджерДоговораУПП.СоздатьЭлемент();
   //НовыйДоговорУПП.Комментарий = " Перенос: cоздан автоматически ";
       //НовыйДоговорУПП.Наименование= " Перенос: cоздан автоматически ";
   //НовыйДоговорУПП.Записать();
   
   //Выборка = СпрДоговорыКонтрагентов.Выбрать();
   //Пока Выборка.Следующий() Цикл
   //    Сообщить(Выборка.Наименование);
   //    ОбработкаПрерыванияПользователя()
   //КонецЦикла;
   СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
   НовыйЭлемент = СпрДоговорыКонтрагентов.СоздатьЭлемент();
   НовыйЭлемент.Комментарий = " Перенос: cоздан автоматически ";
   НовыйЭлемент.Наименование = " Test ";
   НовыйЭлемент.Записать();
   Сообщить(" Перенос: cоздан автоматически "+НовыйЭлемент.Ссылка);

КонецПроцедуры
40 SyncMaster7
 
08.08.12
12:49
Какие-нибудь идеи еще будут? Может это трабл с платформой - и стоит перейти на 16? Или как?
41 Галахад
 
гуру
08.08.12
12:50
(40) Покажи как получаешь:
"Я могу из справочника ДоговораКонтрагентов получить любые данные"
42 SyncMaster7
 
08.08.12
13:07
V8 = Новый COMObject ("V82.COMConnector");                                  
   // создается объект COM -соединение
   Попытка

       Соединение = V8.Connect ("Srvr =""appl-srv""; Ref = ""it"";  Usr =""User"";  Pwd = ""12345""");
       Сообщить("Ок");
   Исключение
       Предупреждение (" База данных не открыта! ");
       Возврат;
   КонецПопытки;
   
   ОрганизацияУПП = Соединение.Справочники.Организации;
   Сообщить("Найдена организация с кодом 000000020 ее ИНН "+ ОрганизацияУПП.НайтиПоКоду("000000020").ИНН);

   МенеджерДоговораУПП = Соединение.Справочники.ДоговорыКонтрагентов;
   НовыйДоговор = МенеджерДоговораУПП.НайтиПоКоду("000021128");
   Сообщить("Найден договор с кодом 000021128 "+ НовыйДоговор.Наименование);
Получаю сообщения:
Ок
Найдена организация с кодом 000000020 ее ИНН 5008053412
Найден договор с кодом 000021128 Химмашстарт
43 Галахад
 
гуру
08.08.12
13:11
V8 = Новый COMObject ("V82.COMConnector");                                  
   // создается объект COM -соединение

   Попытка

       Соединение = V8.Connect ("Srvr =""appl-srv""; Ref = ""it"";  Usr =""User"";  Pwd = ""12345""");
       Сообщить("Ок");
   Исключение
       Предупреждение (" База данных не открыта! ");
       Возврат;
   КонецПопытки;
   

   СпрДоговорыКонтрагентов = Соединение.Справочники.ДоговорыКонтрагентов;
   НовыйЭлемент = СпрДоговорыКонтрагентов.СоздатьЭлемент();
   НовыйЭлемент.Комментарий = " Перенос: cоздан автоматически ";
   НовыйЭлемент.Наименование = " Test ";
   НовыйЭлемент.Записать();
44 SyncMaster7
 
08.08.12
13:14
Естественно я попробовал данный код перед отправкой предыдущего сообщения.
И получаю ошибку с которой начинал данную тему:

{Документ.Договор.Форма.ФормаДокумента.Форма(155)}: Ошибка при вызове метода контекста (СоздатьЭлемент)
   НовыйДоговор = МенеджерДоговораУПП.СоздатьЭлемент();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.15.289): {ОбщийМодуль.ОбщегоНазначения.Модуль(29,2)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
Я уже понял, что модуль ОбщегоНазначенияКлиентСервер не имеет галочки Внешнее соединение.
Вопрос прежний - как это обойти без изменения конфигурации?
45 hhhh
 
08.08.12
13:22
(44) ну проанализируй при каких условиях вызывается

ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Таблица2, ТаблицаРезультат);

и сделай, чтобы эти условия не возникли.
46 hhhh
 
08.08.12
13:23
может там константа какая-нибудь есть типа "ДополнятьТаблицы"
47 Лоботряс
 
08.08.12
13:30
(45)+ Причем вызывается эта процедура откуда-то из модуля объекта документа. Из обработки заполнения наверное?
48 SyncMaster7
 
08.08.12
13:32
Ради интереса установил галку ОбщегоНазначенияКлиентСервер у и получил очередную ошибку

{Документ.Договор.Форма.ФормаДокумента.Форма(157)}: Ошибка при вызове метода контекста (Записать)
   НовыйЭлемент.Записать();    
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.15.289): Не удалось записать: "Договор контрагента"!
49 Лоботряс
 
08.08.12
13:33
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
ОбработкаЗаполнения (Filling)
...
Возникает при вводе элемента справочника на основании, а также при выполнении метода Заполнить, при вводе на основании, а также при интерактивном вводе нового. В процедуре-обработчике этого события должен быть описан сам алгоритм заполнения реквизитов элемента справочника на основании переданного значения.
50 Лоботряс
 
08.08.12
13:34
Но тут ведь вроде как раз неинтерактивный ввод нового. Непонятно...
51 SyncMaster7
 
08.08.12
13:37
Однозначно. Создается именно новый элемент. Без всякого основания.
52 zladenuw
 
08.08.12
13:38
ну так есть подписки на события. может там участвует твой объект. вот он и лезет бог знает куда
53 Лоботряс
 
08.08.12
13:39
А если это неинтерактивный ввод, то откуда скажите мне формы взялись которые в(48)?
54 SyncMaster7
 
08.08.12
13:41
Это из первой конфигурации. В ней на форме документа Договор есть кнопка, при нажатии на которую и должен быть записан договор во вторую конфигурацию.
55 Галахад
 
гуру
08.08.12
13:42
(54) Чо-та не понял, почему же другую конфигурацию нельзя менять, если эту можно?
56 SyncMaster7
 
08.08.12
13:48
По хорошему обе конфы менять нельзя. Просто ради проверки в конфе приемнике я установил галочку на модуль ОбщегоНазначенияКлиентСервер и ошибка эта исчезла.
Появилась следующая - с записью нового элемента справочника ДоговораКонтрагентов.
57 Andreyyy
 
08.08.12
13:52
(0) СпрДоговорыКонтрагентов.ОбменДанными.Загрузка = Истина;
58 Лоботряс
 
08.08.12
13:55
(57)+1 можно попробовать...
59 SyncMaster7
 
08.08.12
14:08
Попробовал. Получил ошибку

{Документ.Договор.Форма.ФормаДокумента.Форма(154)}: Поле объекта не обнаружено (ОбменДанными)
   СпрДоговорыКонтрагентов.ОбменДанными.Загрузка = Истина;
Хотя хелп такой метод у справочника показывает. Но видимо для справочника из другой конфигурации по ОЛЕ не работает.
60 Лоботряс
 
08.08.12
14:09
НовыйЭлемент.ОбменДанными.Загрузка = истина;
61 Лоботряс
 
08.08.12
14:09
(60) опять же
62 SyncMaster7
 
08.08.12
14:33
Заработало. Большое спасибо.
Остался только вопрос с галочкой на ОбщегоНазначенияКлиентСервер.