Книга знаний | 
	 | 
| 1С:Предприятие / Приемы программирования / Обмен данными, УРБД | 
 | 
| 1. Создание плана обмена. 
 2. Выгрузка изменений в XML-файл и отправка по электронной почте 3. Получение обновлений по электронной почте и запись их в ИБ 4. Настройка автоматического обмена  | Автор статьи: Волшебник | Редакторы: Asmody, iva_nov Последняя редакция №26 от 03.03.12 | История URL: http://kb.mista.ru/article.php?id=7  | 
| Имя | Тип | 
| ИспользоватьОбменПоSMTP | Булево | 
| АдресСервераSMTPОбмена | Строка(50) | 
| ПортСервераSMTPОбмена | Число(4,0) | 
| ПользовательСервераSMTPОбмена | Строка(10) | 
| ПарольПользователяSMTPОбмена | Строка(10) | 
| АдресСервераPOP3Обмена | Строка(50) | 
| ПортСервераPOP3Обмена | Число(4,0) | 
| Строка(10) | |
| Строка(10) | |
| Число(3,0) | |
| Булево | 
Процедура рбОтправитьСообщенияОбмена() Экспорт ИспользоватьSMTP = Константы.ИспользоватьОбменПоSMTP.Получить(); //Сначала создаем объект Почта, который в зависимости от настроек будет типа ИнтернетПочта, //если используется прямое обращение к серверам, либо Почта если используется MAPI. Если ИспользоватьSMTP Тогда //Для объекта типа ИнтернетПочта создаем и заполняем почтовый профиль. ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль; ПочтовыйПрофиль.АдресСервераSMTP = Константы.АдресСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПортSMTP = Константы.ПортСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПользовательSMTP = Константы.ПользовательСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПарольSMTP = Константы.ПарольПользователяSMTPОбмена.Получить(); ПочтовыйПрофиль.ВремяОжидания = Константы.ВремяОжиданияСервера.Получить(); Почта = Новый ИнтернетПочта(); Попытка Почта.Подключиться(ПочтовыйПрофиль); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! Обмен не выполнен! " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; Иначе Почта = Новый Почта(); Попытка Почта.Подключиться(); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю пользователя! |Обмен не выполнен! " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; КонецЕсли; //Далее выбираем все узлы из плана обмена, за исключением текущего, //у которых установлен реквизит ВыполнятьОбмен. ВыборкаУзлов = ПланыОбмена.РаспределеннаяБаза.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл Если Не ВыборкаУзлов.ВыполнятьОбмен Тогда Продолжить; КонецЕсли; Если ВыборкаУзлов.Ссылка = ПланыОбмена.РаспределеннаяБаза.ЭтотУзел() Тогда Продолжить; КонецЕсли; ЭлектронныйАдрес = СокрЛП(ВыборкаУзлов.ЭлектронныйАдрес); Если ЭлектронныйАдрес = "" Тогда Продолжить; КонецЕсли; //С помощью объектов ЗаписьXML и ЗаписьСообщения выполняем запись изменений //для выбранного узла в xml-файл. Узел = ВыборкаУзлов.Ссылка; ЗаписьXML = Новый ЗаписьXML(); ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_" + СокрЛП(ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код) + "_" + СокрЛП(Узел.Код) + ".xml"; ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел); ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения); ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); //Затем создаем новое письмо, прикрепляем к нему полученный xml-файл и //отправляем по адресу, указанному в реквизите ЭлектронныйАдрес узла. Файл = Новый Файл(ИмяФайлаСообщения); ТемаСообщения = "1С:Обмен " + СокрЛП(ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код) + "_" + СокрЛП(Узел.Код); Если ИспользоватьSMTP Тогда ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; ПочтовоеСообщение.Тема = ТемаСообщения; ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаСообщения, Файл.Имя); ПочтовоеСообщение.Получатели.Добавить(ЭлектронныйАдрес); Почта.Послать(ПочтовоеСообщение); Иначе ПочтовоеСообщение = Новый ПочтовоеСообщение; ПочтовоеСообщение.Тема = ТемаСообщения; ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаСообщения); ПочтовоеСообщение.Получатели.Добавить(ЭлектронныйАдрес); Почта.Послать(ПочтовоеСообщение, Ложь); КонецЕсли; Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда Сообщить("ОБМЕН: Сообщение обмена для узла " + Узел.Наименование + " отправлено!", СтатусСообщения.Информация); КонецЕсли; УдалитьФайлы(ИмяФайлаСообщения); КонецЦикла; Почта.Отключиться(); КонецПроцедуры
Процедура рбПолучитьСообщенияОбмена() Экспорт 
   ИспользоватьSMTP = Константы.ИспользоватьОбменПоSMTP.Получить(); 
        //так же, как в процедуре рбОтправитьСообщенияОбмена(),  сначала создаем объект 
Почта
   Если ИспользоватьSMTP Тогда 
      ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль; 
      ПочтовыйПрофиль.АдресСервераPOP3   = Константы.АдресСервераPOP3Обмена.Получить(); 
      ПочтовыйПрофиль.ПортPOP3           = Константы.ПортСервераPOP3Обмена.Получить(); 
      ПочтовыйПрофиль.Пользователь       = Константы.ПользовательСервераPOP3Обмена.Получить(); 
      ПочтовыйПрофиль.Пароль             = 
Константы.ПарольПользователяPOP3Обмена.Получить(); 
      ПочтовыйПрофиль.ВремяОжидания      = Константы.ВремяОжиданияСервера.Получить(); 
   
      Почта = Новый ИнтернетПочта(); 
      Попытка 
         Почта.Подключиться(ПочтовыйПрофиль); 
      Исключение 
         Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! 
                   |Обмен не выполнен!", СтатусСообщения.ОченьВажное); 
         Возврат; 
      КонецПопытки; 
   Иначе 
      Почта = Новый Почта(); 
      Попытка 
         Почта.Подключиться(); 
      Исключение 
         Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю пользователя! 
                  |Обмен не выполнен!", СтатусСообщения.ОченьВажное); 
         Возврат; 
      КонецПопытки; 
   КонецЕсли; 
   
   МассивСообщений = Новый Массив; 
   Если ИспользоватьSMTP Тогда 
      ВсеСообщения = Почта.Выбрать(Ложь); 
   Иначе 
      ВсеСообщения = Почта.Выбрать(Ложь, Ложь); 
   КонецЕсли; 
   //Отбираем среди всех писем те, которые имеют тему "1С:Обмен". 
   //Маленькое, но важное замечание:
   //считаем, что все полученные письма с темой "1С:Обмен" предназначены 
   //именно для текущего узла,
   //т.е. что у разных узлов в плане обмена РАЗНЫЕ электронные адреса.
   Для Каждого Сообщение Из ВсеСообщения Цикл 
   
      Если Лев(Сообщение.Тема, 8) <> "1С:Обмен" Тогда 
         Продолжить; 
      КонецЕсли; 
      Попытка 
         МассивСообщений.Добавить(Сообщение); 
         //Вложение письма сохраняем на диске. 
         //Аккуратную проверку вложения оставим пока "за кадром." 
         Вложение = Сообщение.Вложения[0]; 
         ИмяФайлаСообщения = КаталогВременныхФайлов() + Вложение.Name; 
         ДанныеОбмена = Вложение.Данные; 
         ДанныеОбмена.Записать(ИмяФайлаСообщения); 
   
         //С помощью объектов ЧтениеXML и ЧтениеСообщения читаем данные 
         //обновления из сохраненного файла. Перед записью обновлений в ИБ 
         //устанавливаем параметр сеанса ИдетОбменРаспределеннойБазы в Истина. 
         //Затем читаем изменения в ИБ: ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения).
         //Попутно сохраняем сообщения в массиве, чтобы потом их все сразу удалить.
         ЧтениеXML = Новый ЧтениеXML(); 
         ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения); 
         ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); 
         ЧтениеСообщения.НачатьЧтение(ЧтениеXML); 
         ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина; 
         ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); 
         ЧтениеСообщения.ЗакончитьЧтение(); 
         ЧтениеXML.Закрыть(); 
         Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда 
            Сообщить("ОБМЕН: Данные обмена приняты",СтатусСообщения.Информация); 
         КонецЕсли; 
      Исключение 
         Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(), 
                    СтатусСообщения.ОченьВажное); 
      КонецПопытки; 
      //После того, как чтение данных обмена закончено, возвращаем 
      //параметру сеанса ИдетОбменРаспределеннойБазы значение Ложь. 
      ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь; 
   
      Попытка 
         УдалитьФайлы(ИмяФайлаСообщения); 
      Исключение 
         //если не получилось, ну и ладно
      КонецПопытки; 
   
   КонецЦикла; 
   
   Если ИспользоватьSMTP Тогда 
      Почта.УдалитьСообщения(МассивСообщений); 
   КонецЕсли; 
   Почта.Отключиться(); 
   
КонецПроцедуры 
Процедура рбВыполнитьОбмен(прПользователь) Экспорт 
       Если нпПолучитьЗначениеПоУмолчанию(прПользователь, 
                                       
"ВыполнятьОбменРаспределенныхБаз")   Тогда 
                 рбПолучитьСообщенияОбмена(); 
                 рбОтправитьСообщенияОбмена(); 
       КонецЕсли; 
КонецПроцедуры 
Процедура ПроверитьПодключениеАвтообмена() Экспорт 
       Если нпПолучитьЗначениеПоУмолчанию(глТекущийПользователь, 
                                                
"ВыполнятьОбменРаспределенныхБаз") 
                  И Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить() > 0 
Тогда 
                 ПодключитьОбработчикОжидания("ВыполнитьАвтообмен", 
                                        
Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить()); 
        Иначе 
                 ОтключитьОбработчикОжидания("ВыполнитьАвтообмен"); 
        КонецЕсли; 
КонецПроцедуры 
Процедура ВыполнитьАвтообмен() Экспорт 
      рбВыполнитьОбмен(глТекущийПользователь); 
   
       ОтключитьОбработчикОжидания("ВыполнитьАвтообмен"); 
       Если нпПолучитьЗначениеПоУмолчанию(глТекущийПользователь, 
                                                             
"ВыполнятьОбменРаспределенныхБаз") 
               И Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить() > 0 Тогда 
              ПодключитьОбработчикОжидания("ВыполнитьАвтообмен",
                         
Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить()); 
       КонецЕсли; 
КонецПроцедуры 
Процедура ОтключитьАвтообмен() Экспорт 
   ОтключитьОбработчикОжидания("ВыполнитьАвтообмен"); 
КонецПроцедуры 
ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь; ПроверитьПодключениеАвтообмена();
        Описание
	 | Рубрикатор
        | Поиск
        | ТелепатБот
        | Захваченные статьи
	 | Установки
        | Форум
           |