7.7 OLE обмен между базами

Тема в разделе "Обмен данными в "1С:Предприятие 7.7"", создана пользователем Alex007, 4 апр 2016.

  1. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте. Конфигурации ТИС-Комплексная .
    Требуется из ТиС одновременно работать в Комплексной.Главная задача- одновременно создавать определенный документ сразу в двух базах. Подскажите 1. Как сделать, чтобы при входе один раз подключиться к базе-приемнику и в ней работать.Я прописал в глобальном функцию подключения и в принципе, подключаюсь, но при записи каждого документа приходиться вновь подключаться. Вот код который прописан в глобальном и в ПриЗаписи()документа.
    Код:
     БазаИсточник = СоздатьОбъект("V77.Application"); 
        Путь=Строка("D:\1C_Base\Копия\");
        Пользователь="";
        пароль="";
        Открыта = БазаИсточник.Initialize(БазаИсточник.RMTrade, "/D" + СокрЛП(Путь) + " /N" + Пользователь + "/P" + Пароль, "");
        Если Открыта = 0 Тогда
            Предупреждение("Ошибка открытия информационной базы ");
       
            Иначе
            Сообщить("База доступна");
       
        КонецЕсли
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Пропишите один раз в процедуре ПриНачалеРаботыСистемы
  3. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Так я прописал и подключаюсь ко второй базе нормально. Но вот что прописать в процедуре модуля документа, которая собственно и должна записать во второй базе то что мне нужно. Какой командой или каким методом подключиться к уже открытой базе. Возможно надо как то обращаться к переменным в глобальном модуле, подскажите как правильно сделать?
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    к переменным гм второй базы вы не обратитесь. вам нужно просто записать документ?
  5. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Уже закрыл этот вопрос, но появился новый!
    Теперь не могу найти док через ОЛЕ по общему реквизиту.(нужно сравнить доки в текущей базе и в БазаИсточник по реквизиту "олеид"- общий реквизит документов и он одинаков в обеих базах (формат-Строка)
    Сделал следующее-
    Код:
    //////////////////////////
    олеДок=БазаИсточник.CreateObject("Документ");
    Если олеДок.ВыбратьПоЗначению(НачГода(ТекущаяДата()),ТекущаяДата(),"олеид",Док.олеид)=1 тогда
    олеСчет=олеДок.ТекущийДокумент();

    ругается- неверное имя реквизита! Проверил, имя такое же как и указал.
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    а ты наоборот... перебирай в цикле ОЛЕ и ищи в текущей базе
  7. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Пробую вот так, не находит документ по ОЛЕ. выдает "ОлеСчет - Не выбран документ" и все тут, хотя он есть. Что не так подскажите?
    Код:
    Док=СоздатьОбъект("Документ");
               олеДок=БазаИсточник.CreateObject("Документ");
    
                    Док.ВыбратьДокументы(ДатаОтчета);
                олеДок.ВыбратьДокументы(ДатаОтчета);
       
        Пока Док.ПолучитьДокумент()=1  Цикл  
          Если (Док.Вид()= "Счет") тогда
            олеДок.НайтиПоНомеру(Док.НомерДок,ДатаОтчета,"Счет");
            олеСчет=ОлеДок.ТекущийДокумент();
            олеКл.НайтиПоКоду(Док.Контрагент.Код,0);
            олеСчет.Контрагент=олеКл.ТекущийЭлемент();
         //.........................................
            олеСчет.Записать();  
            Сообщить("Обновлен"+олеСчет.ПредставлениеВида()+" №"+СокрЛП(олеСчет.НомерДок)+" от "+Шаблон("[олеСчет.ДатаДок]"));
    
    
       
    
  8. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Ничего сложного не вижу. Вот так у меня на тестовых базах добавился новый документ ПутевойЛистГА с датой и номером, как в базе-источнике. Конечно, его реквизиты пусты, но по аналогии можно и их заполнить.
    Код:
        Док=СоздатьОбъект("Документ.ПутевойЛистГА");
        олеДок=БазаИсточник.CreateObject("Документ.ПутевойЛистГА");
    
        Док.ВыбратьДокументы();
        олеДок.ВыбратьДокументы();
     
        Пока Док.ПолучитьДокумент()=1  Цикл
           Если  олеДок.НайтиПоНомеру(Док.НомерДок,Док.ДатаДок) = 0 Тогда
                   олеДок.Новый();
                   олеДок.НомерДок = Док.НомерДок;
                   олеДок.ДатаДок = Док.ДатаДок;
                олеДок.Записать();
                Сообщить("Обновлен"+олеДок.ПредставлениеВида()+" №"+СокрЛП(олеДок.НомерДок)+" от "+олеДок.ДатаДок);
            КонецЕсли;
        КонецЦикла;
    man37 нравится это.
  9. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Так мне надо не Новый док создавать, а найти существующий и в нем ковыряться. И я так понимаю не хочет ничего присваиваться переменной олеСЧЕТ. Либо я неправильно использую НайтиПоНомеру() или еще что?? Документ с искомым мне номером 100% имеется.
    олеДок.НайтиПоНомеру(Док.НомерДок,ДатаОтчета,"Счет");
    олеСчет=ОлеДок.ТекущийДокумент();
  10. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Можно и не присваивать. Главное, чтобы документ был найден. Вы уверены, что дата этого документа равна ДатаОтчета?
    По крайней мере, у меня все работает вот в таком примере
    Код:
        Док=СоздатьОбъект("Документ.ПутевойЛистГА");
        олеДок=БазаИсточник.CreateObject("Документ.ПутевойЛистГА");
    
        Док.ВыбратьДокументы(НачДата,КонДата);
        олеДок.ВыбратьДокументы();
     
        Пока Док.ПолучитьДокумент()=1  Цикл
           Если  олеДок.НайтиПоНомеру(Док.НомерДок,Док.ДатаДок) = 1 Тогда
                   олеДок.Комментарий = "Есть такой!";
                олеДок.Записать();
                Сообщить("Обновлен"+олеДок.ПредставлениеВида()+" №"+СокрЛП(олеДок.НомерДок)+" от "+олеДок.ДатаДок);
            КонецЕсли;
        КонецЦикла;
    man37 нравится это.
  11. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Спасибо. Все-таки два глаза хорошо, а четыре лучше ). Ошибка заключалась именно в этом:
    олеСчет=ОлеДок.ТекущийДокумент(); Зачем то применил ТекущийДокумент() сюда
  12. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Новая история у меня. Не могу добраться к подчиненному справочнику. Не находит Элемент и все((.
    Есть Справочник "Адреса", подчиненный Контрагенту. Нужно перебрать элементы справочника в одной базе и передать изменения в другую. До этого передается сам Контрагент( работает корректно). Вот как я реализовал:
    Код:
        Пока Кл.ПолучитьЭлемент()=1  Цикл
            Если Кл.ЭтоГруппа()=1 Тогда
                Продолжить;
            КонецЕсли;   
            Если Кл.Экспортировать=Перечисление.ДаНет.Да Тогда
       
                Если олеКл.НайтиПоКоду(Кл.Код,0)=0 тогда
                     олеКл.Новый();
    //......................
    //.......................
             Адр.ИспользоватьВладельца(Кл);
                     олеАдр.ИспользоватьВладельца(олеКл);
            //         Адр.Владелец=Кл;
            //         олеАдр.Владелец=олеКл;
                     Адр.ВыбратьЭлементы();        
                    
                     олеАдр.ВыбратьЭлементы();
                    
                     Пока Адр.ПолучитьЭлемент()=1  Цикл
                            Если олеАдр.НайтиПоКоду(Адр.Код,0)=1  Тогда
                                    олеАдр.Наименование=Адр.Наименование;
                                    олеАдр.Записать();
                                    олеКл.Записать();
                                иначе
                                    олеАдр.Новый();
                                    олеАдр.Код=Адр.Код;
                                 олеАдр.Наименование=Адр.Наименование;
                                    олеАдр.Записать();
                                    олеКл.Записать();
                            КонецЕсли;
                     КонецЦикла;
    КонецЦикла;
  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    др.ИспользоватьВладельца(Кл.ТекущийЭлемент());
  14. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Попробовал- Адр.ИспользоватьВладельца(Кл.ТекущийЭлемент()); - это находит в текущей базе. А вот в базе ОЛЕ олеАдр.ИспользоватьВладельца(олеКл.ТекущийЭлемент()); - похоже что нет. Отладчик выдает просто вот это олеКл.ТекущийЭлемент()= OLE не понятно ничего, но результата нет- в ОЛЕ база ничего не записывается((
  15. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    А что возвращает олеКл.НайтиПоКоду(Кл.Код,0)? Может все время 0 и создается новый элемент?
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    когда вы создаете подчиненный элемент справочника - владелец уже должен существовать! А вы сначала записываете подчиненный, потом владельца...
  17. TopicStarter Overlay
    Alex007
    Offline

    Alex007

    Регистрация:
    4 апр 2016
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Вы знаете, этот ОЛЕ очень тяжело отслеживать в отладчике. Во-первых надо предварительно закидывать в табло те данные, которые хочешь вычислить, в противном случае- виснут обе базы напрочь, через диспетчер потом только принудительно завершать приходиться. Но с этим я как-то разобрался, а вот по части- КАК вытянуть данные в отладчик из ОЛЕ не совсем. Например иногда выводится результат, а иногда пишет такое: олеКЛ= OLE. И что это не понятно. Но вы правы. Я заметил при переносе ДОКов, вот если всё сразу переносить, то у РасхНакл не прописывается ДокументОснование Счет, который стоит по времени раньше и следовательно переносится первее расходной, но в нее не попадает. В данном случае олеКл.НайтиПоКоду(Кл.Код,0)=1, я просто часть кода не показал. Пробовал два раза. Сперва перенес Клиента- ОК, затем уже в существующего пытаюсь прописать Адрес, не получается. Скину лучше более полный код:
    Код:
        Адр=СоздатьОбъект("Справочник.АдресДоставки");
            Кл=СоздатьОбъект("Справочник.Контрагенты"); 
        олеКл=БазаИсточник.CreateObject("Справочник.Контрагенты");
        олеАдр=БазаИсточник.CreateObject("Справочник.АдресаКонтрагентов");
        
             Кл.ВыбратьЭлементы();
             олеКл.ВыбратьЭлементы();
    
        Пока Кл.ПолучитьЭлемент()=1  Цикл
            Если Кл.ЭтоГруппа()=1 Тогда
                Продолжить;
            КонецЕсли;  
            Если Кл.Экспортировать=Перечисление.ДаНет.Да Тогда
      
                Если олеКл.НайтиПоКоду(Кл.Код,0)=0 тогда
                     олеКл.Новый();
                     олеКл.ИспользоватьДату(ДатаОтчета);
          // далее идет назначение реквизитов типа олеКл.Код=Кл.Код;          
                      олеКл.Записать(); 
                     Сообщить("Создан   "+олеКл.ПредставлениеВида()+"Код "+СокрЛП(олеКл.Код)+" "+СокрЛП(олеКл.Наименование));
      
                Иначе
                     олеКл.Блокировка();
                     олеКл.ИспользоватьДату(ДатаОтчета);
    //  назначение реквизитов
                                      олеКл.Записать();
                    
                     Адр.ИспользоватьВладельца(Кл.ТекущийЭлемент());
                     олеАдр.ИспользоватьВладельца(олеКл.ТекущийЭлемент());
                     Адр.ВыбратьЭлементы();       
                     олеАдр.ВыбратьЭлементы();
                 Пока Адр.ПолучитьЭлемент()=1  Цикл       
                          Если олеАдр.НайтиПоКоду(Адр.Код,0)=1  Тогда
                                    олеАдр.Наименование=Адр.Наименование;
                                    олеАдр.Записать();
                                    олеКл.Записать();
                                иначе
                                    олеАдр.Новый();
                                    олеАдр.Код=А.Код;
                                 олеАдр.Наименование=А.Наименование;
                                    олеАдр.Записать();
                                    олеКл.Записать();
                            КонецЕсли;
                          
                     КонецЦикла;
    
                   
                   
            Сообщить("Создан "+олеКл.ПредставлениеВида()+"Код "+СокрЛП(олеКл.Код)+" "+СокрЛП(олеКл.Наименование));
        КонецЕсли;
         Кл.Экспортировать=Перечисление.ДаНет.Нет;
         Кл.Записать();
        КонецЕсли;
            КонецЦикла;  
    Предупреждение("Готово!");  
    
  18. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    вы мое сообщение не читали?
  19. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Здравствуйте.
    Это БОЛЕЕ полный код или полный? Много лишнего. У Вас есть периодические реквизиты справочника? Зачем там ИспользоватьДату()? Зачем каждый раз перезаписывать владельца, если Вы меняете/добавляете только его адреса? Я попробую упростить код (без проверки, теоретически), а Вы скажете, работает или нет.
    Код:
     Кл.ВыбратьЭлементы();
        Пока Кл.ПолучитьЭлемент()=1  Цикл
            Если Кл.ЭтоГруппа()=1 Тогда
                Продолжить;
            КонецЕсли; 
                  олеКл.ВыбратьЭлементы();
              Если олеКл.НайтиПоКоду(Кл.Код,0)=0 тогда
                     олеКл.Новый();
                     олеКл.Код = Кл.Код;
                     олеКл.Наименование = Кл.Наименование;
                     олеКл.Записать();
                     Сообщить("Создан   "+олеКл.ПредставлениеВида()+"Код "+СокрЛП(олеКл.Код)+" "+СокрЛП(олеКл.Наименование));
                КонецЕсли;
                     Адр.ИспользоватьВладельца(Кл.ТекущийЭлемент());
                     олеАдр.ИспользоватьВладельца(олеКл.ТекущийЭлемент());
                     Адр.ВыбратьЭлементы();      
                     Пока Адр.ПолучитьЭлемент()=1  Цикл      
                          олеАдр.ВыбратьЭлементы();
                         Если олеАдр.НайтиПоКоду(Адр.Код,0)=0  Тогда
                              олеАдр.Новый();
                            олеАдр.Код=Адр.Код;
                          КонецЕсли;
                          олеАдр.Наименование=Адр.Наименование;
                          олеАдр.Записать();
                     КонецЦикла;
         КонецЦикла; 
        Предупреждение("Готово!");  
Похожие темы
  1. AlexFIG
    Ответов:
    3
    Просмотров:
    773
  2. qazaq1
    Ответов:
    14
    Просмотров:
    1.842
  3. djmix777
    Ответов:
    7
    Просмотров:
    1.202
  4. xxx949
    Ответов:
    8
    Просмотров:
    781
  5. TODD22
    Ответов:
    9
    Просмотров:
    682
Загрузка...

Поделиться этой страницей