8.х Получение и отправка почты для обмена между РБ

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Jaivan, 15 окт 2007.

  1. TopicStarter Overlay
    Jaivan
    Offline

    Jaivan Опытный в 1С

    Регистрация:
    24 апр 2007
    Сообщения:
    79
    Симпатии:
    0
    Баллы:
    26
    Уважаемые форумчане, может кто объясним или покажет как правильно:
    у меня на работе собственные сервер (я не админ), вся почта собирается им и содержиться на локальных почтовых ящиках. Пишу план обмена, при этом передать на прямую на мой локальный сервер почтовое письмо можно (использую ИнтернетПочта, все настройки правильны: логин, пароль, порты), а принять аналогично не могу, только используя "Почта" (т. е. через почтового клиента, все настройки опять же правильные). В чем может быть проблема?
  2. TopicStarter Overlay
    Jaivan
    Offline

    Jaivan Опытный в 1С

    Регистрация:
    24 апр 2007
    Сообщения:
    79
    Симпатии:
    0
    Баллы:
    26
    Небольшое дополнение к вопросу: 2 базы соединены через выделинку (internet), что в таком случае уместней обмен или терминал?
  3. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Я использую автоматический+ручной принудительный обмен через почту - ибо для меня критична возможность работы без инета.

    ЗЫ. А по поводу ИнтернетПочта и Почта - значит, всё-таки что-то не так настроено... На что хоть ругается при попытке получения?
  4. TopicStarter Overlay
    Jaivan
    Offline

    Jaivan Опытный в 1С

    Регистрация:
    24 апр 2007
    Сообщения:
    79
    Симпатии:
    0
    Баллы:
    26
    Да ни на что вобщем то не ругаетцо, если пошагово - просто проходит код и все, код следующий:
    Код:
    ИспользоватьSMTP=Константы.ИспользоватьОбменПоSMTP.Получить(); 
    
    Если ИспользоватьSMTP Тогда 
    ПочтовыйПрофиль=Новый ИнтернетПочтовыйПрофиль; 
    SMTPАутентификация=Истина;
    ПочтовыйПрофиль.АдресСервераSMTP=Константы.АдресСервераSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.АдресСервераPOP3=Константы.АдресСервераPOP3Обмена.Получить(); 
    ПочтовыйПрофиль.ПортSMTP=Константы.ПортСервераSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.ПортPOP3=Константы.ПортСервераPOP3Обмена.Получить(); 
    
    Если SMTPАутентификация Тогда
    ПочтовыйПрофиль.ПользовательSMTP=Константы.ПользовательСервераSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.ПарольSMTP=Константы.ПарольПользователяSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.Пользователь=Константы.ПользовательСервераPOP3Обмена.Получить(); 
    ПочтовыйПрофиль.Пароль=Константы.ПарольПользователяPOP3Обмена.Получить(); 
    Иначе
    ПочтовыйПрофиль.Пользователь=Константы.ПользовательСервераPOP3Обмена.Получить(); 
    ПочтовыйПрофиль.Пароль=Константы.ПарольПользователяPOP3Обмена.Получить(); 
    КонецЕсли;
    
    ПочтовыйПрофиль.ВремяОжидания=Константы.ВремяОжиданияСервера.Получить(); 
    
    Почта=Новый ИнтернетПочта(); 
    Попытка 
    Почта.Подключиться(ПочтовыйПрофиль); 
    Исключение 
    Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! Обмен не выполнен!",СтатусСообщения.ОченьВажное); 
    Возврат; 
    КонецПопытки; 
    Иначе     
    Почта=Новый Почта(); 
    Попытка 
    Почта.Подключиться(); 
    Исключение 
    Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю пользователя! Обмен не выполнен!",СтатусСообщения.ОченьВажное); 
    Возврат; 
    КонецПопытки; 
    КонецЕсли; 
    
    МассивСообщений=Новый Массив; 
    Если ИспользоватьSMTP Тогда
    //заголовки сообщений
    //ВсеЗаголовки = Почта.ПолучитьЗаголовки();
    ВсеСообщения=Почта.Выбрать(Ложь); //выбираем zip-файл
    Иначе 
    ВсеСообщения=Почта.Выбрать(Ложь, Ложь); 
    КонецЕсли; 
    
    Для Каждого Сообщение из ВсеСообщения Цикл 
    
    Если Лев(Сообщение.Тема, 8)<>"1С:Обмен_" + ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код Тогда 
    Продолжить; 
    КонецЕсли; 
    Попытка 
    // Записываем файл обмена во временный файл
    МассивСообщений.Добавить(Сообщение); 
    Вложение=Сообщение.Вложения[0]; 
    ИмяФайлаСообщенияZIP=Вложение.Name; 
    ДанныеОбмена=Вложение.Данные; 
    ДанныеОбмена.Записать(ИмяФайлаСообщенияZIP); 
    
    //распаковываем zip-файл для каждого сообщения
    ИмяФайлаСообщения = КаталогВременныхФайлов()+РазархивироватьФайл(ИмяФайлаСообщенияZIP);
    //конец распаковки
    
    ЧтениеXML=Новый ЧтениеXML(); 
    ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения); 
    ЧтениеСообщения=ПланыОбмена.СоздатьЧтениеСообщения(); 
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML); 
    ПараметрыСеанса.ИдетОбменРаспределеннойБазы=Истина; 
    ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); 
    ЧтениеСообщения.ЗакончитьЧтение(); 
    ЧтениеXML.Закрыть(); 
    Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда 
    Сообщить("ОБМЕН: Данные обмена приняты",СтатусСообщения.Информация); 
    Иначе
    Сообщить("ОБМЕН: Нет данных для обмена",СтатусСообщения.Информация); 
    КонецЕсли; 
    Исключение 
    Сообщить("ОБМЕН: Ошибка при получении данных обмена: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное); 
    КонецПопытки; 
    ПараметрыСеанса.ИдетОбменРаспределеннойБазы=Ложь; 
    
    Попытка 
    УдалитьФайлы(ИмяФайлаСообщения); 
    Исключение 
    КонецПопытки; 
    
    КонецЦикла; 
    
    Если ИспользоватьSMTP Тогда 
    Почта.УдалитьСообщения(МассивСообщений); 
    КонецЕсли; 
    Почта.Отключиться();
    
  5. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код:
            ВсеСообщения=Почта.Выбрать(Ложь); //выбираем zip-файл
    
    Это выбирает ВСЕ письма сервера, а не только зип файл (что вообще будет вложение в письмо)

    Дальше вообще что-то накручено (по инструкции в 4 шага :) ), пиши лучше так сразу:
    Код:
    Письмо.Вложения[0].Данные.Записать(ИмяФайлаИзмененийZIP);
    
    Напиши вот так:
    Код:
            Если Лев(Сообщение.Тема, 8)<>"1С:Обмен_" + ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код Тогда 
    Продолжить; 
    
    // Вставь вот эти две строки у себя
    ИНАЧЕ
    СООБЩИТЬ("УРА! У НАС ЕСТЬ ПИСЬМО!");
    
    КонецЕсли; 
    
    
    Судя по всему - просто не находит такого заголовка - пожтому и молча выходит. Если найдёт - должен написать УРА! :)
  6. TopicStarter Overlay
    Jaivan
    Offline

    Jaivan Опытный в 1С

    Регистрация:
    24 апр 2007
    Сообщения:
    79
    Симпатии:
    0
    Баллы:
    26
    Нипоняятноо! :) Код
    Письмо.Вложения[0].Данные.Записать(ИмяФайлаИзмененийZIP); - к чему относиться?
  7. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код:
     // Записываем файл обмена во временный файл
    Вложение=Сообщение.Вложения[0];
    ИмяФайлаСообщенияZIP=Вложение.Name;
    ДанныеОбмена=Вложение.Данные;
    ДанныеОбмена.Записать(ИмяФайлаСообщенияZIP);
    
    За меняется на
    Код:
    Сообщение.Вложения[0].Данные.Записать(ИмяФайлаСообщенияZIP)
    
    ЗЫ. Дык он у тебя написал УРА! или как?
    ЗЗЫ. Покажи, как отправляешь, кусок кода, где генериться заголовок.


    ДОБАВЛЕНО:

    Ээээ, батенька, я тут вчитался вот в этот код
    Код:
            Если Лев(Сообщение.Тема, 8)<>"1С:Обмен_" + ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код
    
    Естессно, что он ничего читать не будет...
  8. TopicStarter Overlay
    Jaivan
    Offline

    Jaivan Опытный в 1С

    Регистрация:
    24 апр 2007
    Сообщения:
    79
    Симпатии:
    0
    Баллы:
    26
    Если Лев(Сообщение.Тема, 8)<>"1С:Обмен_" + ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код - пол беды...
    методом проб ошибок и научного тыка получилось, диктую код:
    Код:
    Процедура рбПолучитьСообщенияОбмена() Экспорт 
    ИспользоватьSMTP=Константы.ИспользоватьОбменПоSMTP.Получить(); 
    
    Если ИспользоватьSMTP Тогда 
    ПочтовыйПрофиль=Новый ИнтернетПочтовыйПрофиль; 
    SMTPАутентификация=Истина;
    ПочтовыйПрофиль.АдресСервераSMTP=Константы.АдресСервераSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.АдресСервераPOP3=Константы.АдресСервераPOP3Обмена.Получить(); 
    ПочтовыйПрофиль.ПортSMTP=Константы.ПортСервераSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.ПортPOP3=Константы.ПортСервераPOP3Обмена.Получить(); 
    
    Если SMTPАутентификация Тогда
    ПочтовыйПрофиль.ПользовательSMTP=Константы.ПользовательСервераSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.ПарольSMTP=Константы.ПарольПользователяSMTPОбмена.Получить(); 
    ПочтовыйПрофиль.Пользователь=Константы.ПользовательСервераPOP3Обмена.Получить(); 
    ПочтовыйПрофиль.Пароль=Константы.ПарольПользователяPOP3Обмена.Получить(); 
    Иначе
    ПочтовыйПрофиль.Пользователь=Константы.ПользовательСервераPOP3Обмена.Получить(); 
    ПочтовыйПрофиль.Пароль=Константы.ПарольПользователяPOP3Обмена.Получить(); 
    КонецЕсли;
    
    ПочтовыйПрофиль.ВремяОжидания=Константы.ВремяОжиданияСервера.Получить(); 
    
    Почта=Новый ИнтернетПочта(); 
    Попытка 
    Почта.Подключиться(ПочтовыйПрофиль); 
    Исключение 
    Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! Обмен не выполнен!",СтатусСообщения.ОченьВажное); 
    Возврат; 
    КонецПопытки; 
    Иначе     
    Почта=Новый Почта(); 
    Попытка 
    Почта.Подключиться(); 
    Исключение 
    Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю пользователя! Обмен не выполнен!",СтатусСообщения.ОченьВажное); 
    Возврат; 
    КонецПопытки; 
    КонецЕсли; 
    
    МассивСообщений=Новый Массив; 
    Если ИспользоватьSMTP Тогда
    ВсеСообщения=Почта.Выбрать(Ложь); //выбираем zip-файл
    Иначе 
    ВсеСообщения=Почта.Выбрать(Ложь, Ложь); 
    КонецЕсли; 
    
    Для Каждого Сообщение из ВсеСообщения Цикл 
    
    Если Лев(Сообщение.Тема, 9)<>"1С:Обмен_" Тогда //ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код  
    Продолжить;
    Иначе 
    СООБЩИТЬ("УРА! У НАС ЕСТЬ ПИСЬМО!");
    КонецЕсли; 
    Попытка 
    // Записываем файл обмена во временный файл
    МассивСообщений.Добавить(Сообщение); 
    Вложение=Сообщение.Вложения[0];
    //ИмяФайлаСообщенияZIP =  Вложение.Name;
    ИмяФайлаСообщенияZIP = КаталогВременныхФайлов() + Вложение.Name; 
    ДанныеОбмена=Вложение.Данные; 
    ДанныеОбмена.Записать(ИмяФайлаСообщенияZIP); 
    
    //распаковываем zip-файл для каждого сообщения
    //ИмяФайлаСообщения = КаталогВременныхФайлов()+РазархивироватьФайл(ИмяФайлаСообщенияZIP);
    ИмяФайлаСообщения = КаталогВременныхФайлов() + РазархивироватьФайл(Вложение.Name);
    //конец распаковки
    
    ЧтениеСообщения=ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеXML=Новый ЧтениеXML(); 
    ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
    /////////////////////////
    ЧтениеXML.Прочитать();
    /////////////////////////
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML); 
    ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина; 
    ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); 
    ЧтениеСообщения.ЗакончитьЧтение(); 
    ЧтениеXML.Закрыть(); 
    Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда 
    Сообщить("ОБМЕН: Данные обмена приняты",СтатусСообщения.Информация); 
    Иначе
    Сообщить("ОБМЕН: Нет данных для обмена",СтатусСообщения.Информация); 
    КонецЕсли; 
    Исключение 
    Сообщить("ОБМЕН: Ошибка при получении данных обмена: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное); 
    КонецПопытки; 
    ПараметрыСеанса.ИдетОбменРаспределеннойБазы=Ложь; 
    
    Попытка 
    УдалитьФайлы(ИмяФайлаСообщения); 
    Исключение 
    КонецПопытки; 
    
    КонецЦикла; 
    
    Если ИспользоватьSMTP Тогда 
    Почта.УдалитьСообщения(МассивСообщений); 
    КонецЕсли; 
    Почта.Отключиться(); 
    
    КонецПроцедуры
    
    фишка еще в том, что я пытался отправляемой базой еще и считать обновления (по ходу так нельзя?)
    в оригинале Если Лев(Сообщение.Тема, 9)<>"1С:Обмен_" Тогда можно заменить на Если Лев(Сообщение.Тема, 9)<>"1С:Обмен_" + <код текущего узла> Тогда
  9. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Этого не понял...
    Если ты имеешь ввиду, что после отправки письма прочитать письмо для себя и прочитать изменения - то это можно.

    Хм... Смотри - сделаешь код узла больше одного символа или два кода типа "а1" и "а2" - опять будет криво работать :)
  10. TopicStarter Overlay
    Jaivan
    Offline

    Jaivan Опытный в 1С

    Регистрация:
    24 апр 2007
    Сообщения:
    79
    Симпатии:
    0
    Баллы:
    26
    ну можно задать принудительно ввод 4ёх символьного кода, а насчет чтения своих изменений - по мойму у меня с этим опять же какой то косяк, да и зачем это нужно
  11. Mirage
    Offline

    Mirage

    Регистрация:
    3 дек 2007
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Реализую практически такую же систему :unsure:
    Архивировать и отправлять файлы 1с-ка у меня уже "научилась", а вот с распаковкой полученного файла проблемы. Не выложишь код своей функции Разархивировать?
    Заранее спасибо.
  12. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    СП еще никто не отменял :) Так подробно все написано.

    ЗЫ. Смотри ЧтениеZIPФайла
  13. Mirage
    Offline

    Mirage

    Регистрация:
    3 дек 2007
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Спасибо за ответ :)
    Вот только проблема у меня малость не в этом, а в путях к файлу. А самая большая проблема - это отсутствие 1с-ника (уволился), а я даже не программист, а аналитик в комотделе :)
  14. Kossstya
    Offline

    Kossstya

    Регистрация:
    4 дек 2007
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Почта - зло. Используй ftp. Или http (с этим сложнее)
  15. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Когда инет работает через полное ж - почта - отличный выход.
    ЗЫ. Естеснно, электронная, не дискетками же слать в конвертах :unsure:
  16. Mirage
    Offline

    Mirage

    Регистрация:
    3 дек 2007
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Ребята, спасибо :)
    аналогиный обмен через почту у меня прекрасно работает :) Как и Jaivan, я воспользовалась книгой знаний на мисте. Пришлось поправить пару ошибок и добавить проверку темы письма по последней букве - ибо она должна совпадать с кодом текущего узла (у меня код односимвольный).
    Но при этом есть одно НО. Файлы слишком большие - особенно если приходится отсылать изменения конфигурации. Архивирование + отправка работает. А вот разархивировать я не могу :( Походу неправильно задаю имя файла в ЧтениеZIPФайла. Ну да ладно, разберемся :)
  17. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Если файлы большие:
    1. Несколько транзакций применять (честно говоря, никогда не пользовался)
    2. Чаще обмен делать.
  18. dedomsk
    Offline

    dedomsk

    Регистрация:
    3 фев 2010
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Подскажите пожалуйста, не могу принять обмен по почте.

    Делал все по инструкции с http://www.mista.ru/v8/urbd.htm при приеме пишет:

    ОБМЕН: Ошибка при получении данных обмена: (План обмена.Распределенная база.Форма списка(171)): Ошибка при вызове метода контекста (Записать): Недопустимое значение параметра (параметр номер '1')

    ошибка ссылается на строку:

    ДанныеОбмена.Записать(ИмяФайлаСообщения);

    что не так?

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