Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 18:31

Выгрузка через OLE соединение

Автор СерьезныйЧеловек, 13 сен 2010, 11:15

0 Пользователей и 1 гость просматривают эту тему.

СерьезныйЧеловек

Еще на один вопрос моя душа требует ответа :D
Как з УТ в БП выгрузить документ Реализация товаров и услуг. Уже все перерыл нигде не могу найти хотя бы пример, везде только всякая вода, типа оле - это технология и бла бла бла.... Если есть какой примерчик можете выложить или отправить или показать.

Dvdovin

А можете уточнить вопрос? просто если я вас правельно понял, то я нашёл один примерчик. Только он не через ОЛЕ:


Как из одной базы перенести документ в другую базу?
Необходимо экземпляр документа РеализацияТоваровУслуг (ссылка на который выбирается в диалоге создаваемой обработки) перенести в другую базу данных. Структура конфигураций идентична. Справочники (и другие сопутствующие объекты) синхронизированы по значениям внутренних идентификаторов.
Для выгрузки потребуется выполнить следующий фрагмент кода (листинг 9.5):
Листинг 9.5. Выгрузка данных в XML
// Выгрузить в файл xml.
ЗаписьXML = Новый ЗаписьXML();

ЗаписьXML.ОткрытьФайл("c:\doc.xml");
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");

// Получить объект по ссылке.
ВыгружаемыйОбъект = Документ.ПолучитьОбъект();

// С помощью средств сериализации записать объект в файл.
ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект);
   
ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.Закрыть();

При выгрузке создаем элемент Root исходя из соображений, что в XML-документе должен быть только один корневой узел, а в общем случае (но не в нашем) выгружаться может не один объект.
Для загрузки выгруженного значения используем следующий фрагмент кода (листинг 9.6):
Листинг 9.6. Загрузка данных из XML
ЧтениеXML = Новый ЧтениеXML();

ЧтениеXML.ОткрытьФайл("c:\doc.xml");

// Текущим становится элемент Root.
ЧтениеXML.Прочитать();

// Текущим становится элемент с документом.
ЧтениеXML.Прочитать();

// Проверить, сможет ли с данным значением "справиться"
// система сериализации в данной базе.
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда

   // Получить ДокументОбъект.РеализацияТоваровУслуг
   ЗагружаемыйОбъект = ПрочитатьXML(ЧтениеXML);
   ЗагружаемыйОбъект.Записать();

КонецЕсли;   

ЧтениеXML.Закрыть();

СерьезныйЧеловек

Мне надо по заданию из ут в бп используя OLE соединение выгрузить документы Реализация товаров и услуг. Вот все что написано.

Dvdovin

 // Присоединение к базе 1С через OLE.
БазаОле=СоздатьОбъект("V77.Application"); // Получаем доступ к OLE объекту 1С
// Локальная версия (на одного пользователя):   V77L.Application
// Сетевая версия:   V77.Application
// Версия SQL:   V77S.Application


КаталогБазыОЛе  = "C:\program files\1cv77\МояБаза\";
ПользовательОле = "Администратор";
ПарольОле       = "qwerty";
МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 1;       // для появления заставки (например, чтобы наблюдать
                             // процесс запуска базы OLE визуально) поставьте здесь "0"
РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
                       СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле)+
                       " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
                       ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
Если РезультатПодключения = 0 Тогда
     Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
КонецЕсли;





Б) Доступ к справочникам и документам базы OLE (через функцию "CreateObject"):СпрOLE = БазаОле.CreateObject("Справочник.Фирмы"); // "СоздатьОбъект" в OLE не работает!
ДокOLE = БазаОле.CreateObject("Документ.РасходнаяНакладная");


После создания объекта справочника или документа к ним применимы все методы, касающиеся таких объектов в 1С:СпрОле.ВыбратьЭлементы();
Пока СпрОле.ПолучитьЭлемент()=1 Цикл
    Сообщить(Спр.Наименование);
КонецЦикла;


Заметьте, что если вместо "Сообщить(Спр.Наименование)" вы укажете "Сообщить(Спр.ТекущийЭлемент())", то вместо строкового/числового представления этого элемента программа выдаст вам в окошке сообщение "OLE". Именно это я и имел в виду, когда говорил, что напрямую мало что можно перенести. Т.е. не будут работать следующие методы (ошибки 1С не будет, но и результат работы будет нулевой). Рассмотрим следующий пример: СпрOLE = БазаОле.CreateObject("Справочник.Фирмы");  // это справочник в базе OLE
Док = СоздатьОбъект("Документ.РасходнаяНакладная"); // а это документ в местной базе
Док.Новый();                                        // создаем новый документ в местной базе
СпрOLE.НайтиПоКоду(1,0);                  // спозиционируем в базе OLE
                                                           // на фирме с кодом "1".
Док.Фирма = СпрOLE.ТекущийЭлемент(); // такой метод не сработает, т.к. справа от "=" стоит
                                                                // объект не местной базы, и местная база 1С его не понимает!


Однако,  сработает следующий метод:Спр = СоздатьОбъект("Справочник.Фирмы");                   // создаем объект справочника местной базы
Спр.НайтиПоНаименованию(СпрОле.Наименование,0,0); // Или Спр.найтиПоКоду(СпрОле.Код,0);
                                                         // т.е. СпрОле.Код и Спр.наименование
                                                         // являются обычными числовыми/строковыми
                                                         // значениями, которые понимает местная база!
Док.Фирма = Спр.ТекущийЭлемент(); // Вот теперь все в порядке, т.к. с обоих сторон метода
                                                          // стоят объекты только местной базы!


Отсюда вывод: возможность доступа к объектам базы 1С через OLE требуется, в основном, только для определенной задачи - получить доступ к реквизитам определенного элемента справочника или документа. Однако, не забываем, что объекты базы OLE поддерживают все методы работы с ними, в т.ч. и "Новый()", т.е. приведем пример противоположный предыдущему:ДокОле = CreateObject("Документ.РасходнаяНакладная"); // Создаем документ в базе OLE
ДокОле.Новый();
Спр = СоздатьОбъект("Справочник.Фирмы"); // В местной базе получаем доступ к справочнику
Спр.НайтиПоКоду(1,0);                                  // Находим в местной базе фирму с кодом 1 (если есть)
ДокОле.Фирма = Спр.ТекущийЭлемент();      // такой метод не сработает


Однако,  сработает следующий метод:СпрОле = БазаОле.CreateObject("Справочник.Фирмы"); // создаем объект справочника базы OLE
СпрОле.НайтиПоНаименованию(Спр.Наименование,0,0);  // Или СпрОле.найтиПоКоду(Спр.Код,0);
// т.е. Спр.Код и Спр.Наименование являются обычными числовыми/строковыми значениями,
// которые понимает база OLE!
ДокОле.Фирма = СпрОле.ТекущийЭлемент(); // Вот теперь все в порядке, т.к. с обоих сторон
                                                                     // метода стоят объекты базы OLE!
ДокОле.Записать();                                        // запишем документ в базе OLE
Если ДокОле.Провести()=0 тогда
     Сообщить("Не смогли провести документ!");
КонецЕсли;

Dvdovin

Правда это для семёрки, но я думаю что для 8 будет примерно тоже самое

СерьезныйЧеловек

Спасибо большое всем, попробую сегодня проверить, потом отпишусь подошел код или нет ;)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск