Обмен ОЛЕ

1. Lik2707 25.04.09 14:55 Сейчас в теме
Здравствуйте, уважаемые специалисты!
Пришло время заняться обменом при помощи ОЛЕ, возникли вопросики, подскажите, пожалуйста. Подключаюсь так:

Оле = СоздатьОбъект("V1CEnterprise.Application");
…….
//подключение
Рез = Оле.Initialize(Оле.RMTrade,СтрокаЗапуска,);

Подключение проходит нормально. Затем в базе приемнике создаю новый справочник.

НовСпр = Оле.CreateObject("Справочник.Контры");
НовСпр.Новый();
НовСпр.Код = НовСпрКод;
НовСпр.Наименование = НовСпрНаименование;
НовСпр.Записать();
//здесь нужно заполнить реквизиты
//периодический реквизит
НовСпр.ИспользоватьДату(РабочаяДата());
НовСпр.ЮридическийАдрес = НовСпрЮрАдрес;
//далее тип реквизита Перечисление, (ПромВидКлиента – тип Строка, определен ранее)
Если СокрЛП(ПромВидКлиента) = "Организация" Тогда
НовСпр.ВидКлиента = Перечисление.ВидыКонтрагентов.Организация;
ИначеЕсли СокрЛП(ПромВидКлиента) = "ЧастноеЛицо" Тогда
НовСпр.ВидКлиента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо;
КонецЕсли;
НовСпр.Записать();

В итоге, справочник записывается, периодические реквизиты записываются – все нормально, но вот с перечисление – никак не хочет записываться…
В таком варианте ругается
НовСпр.ВидКлиента = Перечисление.ВидыКонтрагентов.Организация;
{C:\1\ЗАГРУЗКА.ERT(142)}: Плохой тип переменной

Были попытки записывать и без условий Если, просто НовСпр.ВидКлиента = Перечисление.ВидыКонтрагентов.Организация;
Ругается точно также…
Если убирать запись реквизита с типом Перечисление – все нормально записывается.
Подскажите, что делаю не так с перечислением и как же его записать?
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
11. Lik2707 02.05.09 19:12 Сейчас в теме
Пытаюсь привести свое творение к нормальному виду. Для этого пробую добавить проверку на блокировку объекта при записи в базу приемник. Есть функция Ожидание разблокировки:
Функция ОжиданиеРазблокировки(Спр)
Если Спр.Блокировка(1)=0 Тогда //сначала заблокируем
Возврат ОжиданиеРазблокировки(Спр);
КонецЕсли;
Спр.Блокировка(0); //а теперь разблокируем
Возврат 2;
КонецФункции
До ее вызова определяется - есть ли уже элемент справочника или нет, и если есть, то вызывается функция для проверки блокировки объекта:
Если ОжиданиеРазблокировки(ТекКонтр) <> 2 Тогда
Возврат;
КонецЕсли;
ТекКонтр определяется нормально, но вот в функции, на строке Если Спр.Блокировка(1)=0 Тогда
сразу возникает ошибка - Поле агрегатного объекта не обнаружено (Блокировка)
Наверное, так неправильно передавать в функцию полученный объект, но вот как нужно правильно - пока не понимаю. Или, возможно, сама функция в корне неверна. Направьте, пожалуйста, на путь истинный, спасибо!
14. Ёпрст 1063 10.06.09 16:14 Сейчас в теме
(11) Таким способом блокировку не снимешь с элемента..
Записывайте в Попытке-Исключение...
и выдавайте ошибку методом ОписаниеОшибки() в ветке Исключения...
2. biv75 25.04.09 15:36 Сейчас в теме
При работе через OLE в лоб можно указывать только простые типы значений, строка или число, для присвоения значения ссылочному объекту надо сначала спозиционироваться на нём. В данном случае найти перечисление с помощью методов ЗначениеПоНомеру(Номер), ЗначениеПоИдентификатору(<Идентификатор>) в базе к которой подключились, и найденое значение присваивать.
3. Lik2707 25.04.09 16:39 Сейчас в теме
(2) Спасибо! Вроде понятно... Получается, наверное, и, если будет значение типа Справочник - то тоже надо сначала на нем спозиционироваться. Попробую.
4. Lik2707 25.04.09 18:50 Сейчас в теме
Значение = Перечисление.ВидыКонтрагентов.ЗначениеПоИдентификатору(ПромВидКлиента);
Здесь значение = Организация
потом
НовСпр.ВидКлиента = Значение;
- выдает все ту же ошибку
пробую
НовСпр.ВидКлиента = Перечисление.ВидыКонтрагентов.ЗначениеПоИдентификатору(ПромВидКлиента);
- та же ошибка (уже как родная...)
на грани помешательства...
5. biv75 25.04.09 20:24 Сейчас в теме
(4) Так вы значение где ищите, в этой же базе из которой подключились к OLE базе, а надо в OLE базе искать

Значение=Оле.Перечисление.ВидыКонтрагентов.ЗначениеПоИдентификатору(ПромВидКлиента);
НовСпр.ВидКлиента = Значение;

как-то так
6. Lik2707 26.04.09 06:53 Сейчас в теме
(5) Спасибо огромное! Получилось!!! Ну вот, когда уже знаешь - кажется все так просто... И ведь написано в (2) <в базе к которой подключились>. Побольше внимания мне, конечно, не помешает...
Еще раз спасибо за терпение!!!
7. biv75 26.04.09 08:19 Сейчас в теме
(6) Не за что, такая-же потеха и со справочниками и документами если понадобится, ищите по коду, по наименованию, по дате, по номеру.
8. Lik2707 26.04.09 11:21 Сейчас в теме
(7) Да, так и представляла про справочники. Есть пара реквизитов с типом Справочник, нужно так же их искать. И еще есть подчиненный справочник Договоры. Тоже нужно переносить. В общем, есть что пробовать!
9. Andzhej 01.05.09 10:22 Сейчас в теме
Гм, посмотрите Универсал 2.7 http://infostart.ru/projects/3459/ и все ясно станет.
10. Lik2707 02.05.09 06:26 Сейчас в теме
(9) Спасибо большое! По ссылке обработку посмотрела. Конечно, с моим опытом пока все ясно не стало, но надежда есть! Своя простенькая обработка сделана, вроде работает.
12. psyterror 10.06.09 11:19 Сейчас в теме
Пробую сделать так:
Код
      СпрНИОле =    БазаОле.EvalExpr("CreateObject(""Справочник.НалоговыеИнспекции"")");
      ОлеНалИнсп = СпрНИОле.НайтиПоНаименованию(НалоговаяИнспекция,0);
Показать полностью


пишет - Плохой тип переменной

Подскажите, как правильно сделать?
13. psyterror 10.06.09 12:36 Сейчас в теме
Решение оказалось проще, чем казалось

Код
   СпрНИОле =    БазаОле.EvalExpr("CreateObject(""Справочник.НалоговыеИнспекции"")"); 
   ОлеНалИнсп = СпрНИОле.НайтиПоНаименованию(НалоговаяИнспекция.Наименование,0);
Показать полностью
15. Ёпрст 1063 10.06.09 16:15 Сейчас в теме
(12,13) Свои вопросы - в своей ветке...
так, на будующее...
16. psyterror 11.06.09 11:24 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот