8.х УТ Не получается отправить эмейл 11.0.7.8

Тема в разделе ""1С:Управление торговлей УТ"", создана пользователем Demian, 22 ноя 2011.

  1. TopicStarter Overlay
    Demian
    Offline

    Demian

    Регистрация:
    19 сен 2011
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Добрый день, стояло обновление 11.0.6.9 - никаких проблем не было, эмейлы с прикрепленными файлами отправлялись "на ура". Поставили обновление, теперь при попытке отправить файл выдает ошибку:
    "{Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормаДокумента.Форма(1145)}: Ошибка при вызове конструктора (ДвоичныеДанные)
    Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
    по причине:
    Каталог не обнаружен 'e1cib\tempstorage\1ad61f76-7b88-49b2-babd-f27210c4292b'"
    Что может быть такое? И как это лечить? Заранее спасибо.
  2. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Смотрите что лежит в Стр.ИмяФайлаНаКомпьютере
    и смотрите, есть ли этот каталог на компе.
  3. TopicStarter Overlay
    Demian
    Offline

    Demian

    Регистрация:
    19 сен 2011
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Дело в том, что каталога такого нет (я смотрел каталог в папке пользователя, в скрытой папке AppData), а Стр.ИмяФайлаНаКомпьютере - это просто строчка из Модуля Документ.ЭлектронноеПисьмоИсходящее.ФормаДокумента.Модуль - так что к чему эта надпись возникает - я вообще понять не могу, в конфе ничего не менялось с электронной почтой, да и до изменения всё работало.
    Спасибо за ответ.
    З.Ы.: Теперь просто выдает ошибку: "Каталог не обнаружен 'e1cib\tempstorage\кучацифр - всегда разные.
  4. TopicStarter Overlay
    Demian
    Offline

    Demian

    Регистрация:
    19 сен 2011
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Ошибка вылетает в связи с тем, что 1С пытается сохранить файл, так как отправить файл хранящийся на диске - это без проблем, отправить просто письмо - тоже, а вот если попытаться отправить или сохранить вложение - то выдает ошибку и сохраняет письмо без вложения.
    Раз никто не сталкивался, то скажите, у Вас после с обновлением работает отправка созданных документов?
  5. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Про обновления не скажу - у нас другое.
    А вот ошибка связанная с тем, что не уходит письмо с вложением вполне понятна.
    Давайте посмотрим как 1С пытается отправить письмо с вложением
    1) Создается файл вложения и сохраняется где то на диске (имеем путь к нему)
    2) Создается письмо и заполняется его тело
    3) Прикрепляется файл (ш.1)

    Так вот, Стр.ИмяФайлаНаКомпьютере - должно содержать имя файла размещенного на компе (ш.1), но по факту там лежит ересь.

    Берем отладчик, и смотрим, в какой же момент эта самая ересь создается. Работы, оценочно - час - два посидеть над F11
  6. Vladimir1C
    Offline

    Vladimir1C Опытный в 1С

    Регистрация:
    19 июл 2010
    Сообщения:
    106
    Симпатии:
    0
    Баллы:
    26
    Поддерживаю тему. Не отправляются письма. Ошибка та же.

    Нашлось решение?
  7. BabySG
    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код ошибки: 10094289
    Дата публикации: 22 ноября 2011 г.
    Описание: При отправке письма через легкую электронную почту письмо отправляется, но пользователю выводится сообщения о ошибке.
  8. Vladimir1C
    Offline

    Vladimir1C Опытный в 1С

    Регистрация:
    19 июл 2010
    Сообщения:
    106
    Симпатии:
    0
    Баллы:
    26
    У нас даже не отправляется.
  9. BabySG
    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Под рукой сейчас нет УТ, но, думаю, есть какая-то ошибка и туда попадает адрес временного хранилища (судя по тексту)
  10. TopicStarter Overlay
    Demian
    Offline

    Demian

    Регистрация:
    19 сен 2011
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Письма то отправляются, то не отправляются, один раз даже отправилось со вложением. Но когда письма приходят - они без каких-либо реквизитов, ни от кого, ни куда, ни темы, ни письма.
    З.Ы.: А разве легкая почта и почтовый клиент 1С - это одно и тоже? Мне казалось, что они сделали возможность отправки почты без использования почтового клиента и назвали это "легкой почтой", или я не прав?
  11. ZOOBR
    Offline

    ZOOBR

    Регистрация:
    12 дек 2011
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Ну совершенно верно так и должно быть у каждого с версией 11.0.7.8. Вообще скажу сразу, что функционал работы с почтой весьма убогий, это поймет каждый кто пройдется F11 от создания письма до его отправки, письмо отправляется долго.. Путём доработки скорость отправки писем можно увеличить в 3-10 раз. Кроме того данный глюк при работе с почтой в данном релизе не единственный. Если используется фоновое задание для получения и отправки почты вы еще натолкнётесь обязательно на конфликт блокировок при выполнении транзакций, ну да ладно вопрос не в этом был.
    Относительно вашей проблемы можно происходит следующее
    Код:
    Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
    
    В данной строчке производится запись двоичных данных в переменную "Данные" из файла на диске, расположенному по пути содержащемся в переменной "Стр.ИмяФайлаНаКомпьютере". Естественно получается ошибка так как вместо пути к файлу в эту переменную запихнули ссылку на файл во временном хранилище. Решить данную проблему можно двумя путями.
    1) Дописать модуль формы документа для возможности приёма ссылок на файлы из временного хранилища. Для этого модифицируйте код из модуля таким образом:
    Код:
    	Если ЭтоАдресВременногоХранилища(Стр.ИмяФайлаНаКомпьютере) Тогда
    Данные=ПолучитьИзВременногоХранилища(Стр.ИмяФайлаНаКомпьютере);
    Иначе
    Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
    Стр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, "");
    КонецЕсли;
    
    
    Тем самым мы определяем что если нам передали ссылку на файл во временном хранилище, то мы просто получаем из временного хранилища, а если это просто путь то тогда уже создаем и помещаем двоичные данные во временное хранилище.
    Эта доработка уже позволит отправлять сообщения. Но останется еще одна небольшая проблемка. В письме для вложений не будет показана иконка приложения. Чтобы поправить эту досадную оплошность в строке 97 модуля формы документа "ИсходящееЭлектронноеПисьмо" нужно заменить следующий код:
    Код:
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла);
    
    
    вот таким кодом(пояснять уже не буду. :aua: ):
    Код:
    Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
    ИмяФайла=Вложение.Представление;	
    Иначе
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла);
    КонецЕсли;
    
    
    После такой доработки иконки у файлов будут отображаться.
    Но внимательно посмотрев на то что получилось замечаем еще один косяк, для таких вложений не отображается размер! :D Придётся и этот глюк побороть. Заменяем предидущий код следующим улучшенным:
    Код:
    				Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
    ИмяФайла=Вложение.Представление;	
    Данные=ПолучитьИзВременногоХранилища(Вложение.Значение);
    Если ТипЗнч(Данные)=Тип("ДвоичныеДанные") Тогда
    новСтр.Размер=Данные.Размер();
    новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер);
    КонецЕсли;
    Иначе
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла);
    Попытка
    Данные = Новый Файл(Вложение.Значение);
    новСтр.Размер= Данные.Размер();
    новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер);
    Исключение
    КонецПопытки
    КонецЕсли;
    
    
    
    Теперь размер будет отображаться, а также мы предусмотрели защиту от передачи в данную функцию некорректных данных о расположении файла.
    2) Вторым способом предполагается добраться всё-таки до момента передачи параметров на форму документа и поправить передающуюся ссылку на путь к файлу во временной директории.
    Насколько целесообразен данный способ решать каждому в индивидуальном порядке. На мой взгляд и первый и второй способ далеки от совершенства, но сууть не в этом а в том чтобы каждый решил подобную проблему с минимальными правками кода. Тем более что трешеделы из 1С когда-нибудь таки заделают эту дырку...
    Чтобы реализовать данный способ лезем в общие формы и находим форму с названием "ПечатьДокументов", открываем модуль формы и заменяем процедуру "ПоместитьТабличныеДокументыВоВременноеХранилище" следующим содержимым:

    Код:
    Процедура ПоместитьТабличныеДокументыВоВременноеХранилище(СписокФайлов, НастройкиСохранения)
    
    ЗаписьZipФайла = Неопределено;
    ИмяАрхива = Неопределено;
    Если НастройкиСохранения.ЗапаковатьZIP Тогда
    ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
    ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива);
    КонецЕсли;
    
    СписокТипов = ПолучитьСписокТиповФайловТабличныхДокументов(НастройкиСохранения);
    ДатаПредставление = Формат(ТекущаяДата(), "ДФ='yyyyMMdd HH:mm'");
    
    ИмяВременнойПапки = ПолучитьИмяВременногоФайла();
    СоздатьКаталог(ИмяВременнойПапки);
    
    Для Каждого ТабДокумент Из ИменаТабДокументов Цикл
    ТабДок = ЭтаФорма["Таб" + ТабДокумент.Значение];
    
    Для Каждого ТипФайла Из СписокТипов Цикл
    
    Если ОбъектыПечати.Количество() > 1 Тогда
    ИмяФайла = "[ИмяМакета] ([ДатаПредставление]).[Расширение]";
    Иначе
    ИмяФайла = "[Документ] ([ИмяМакета] [ДатаПредставление]).[Расширение]";
    КонецЕсли;
    
    ИмяФайла = СтрЗаменить(ИмяФайла, "[Документ]",			Строка(ОбъектыПечати[0].Значение));
    ИмяФайла = СтрЗаменить(ИмяФайла, "[ИмяМакета]",			ТабДокумент.Представление);
    ИмяФайла = СтрЗаменить(ИмяФайла, "[ДатаПредставление]",	ДатаПредставление);
    ИмяФайла = СтрЗаменить(ИмяФайла, "[Расширение]",		ТипФайла.Представление);
    
    ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла);
    
    ИмяВременногоФайла = ИмяВременнойПапки + "\" + ИмяФайла;
    ТабДок.Записать(ИмяВременногоФайла, ТипФайла.Значение);
    
    Если ТипФайла.Значение = ТипФайлаТабличногоДокумента.HTML Тогда
    ВставитьКартинкиВHTML(ИмяВременногоФайла);
    КонецЕсли;			
    
    Если ЗаписьZipФайла <> Неопределено Тогда 
    ЗаписьZipФайла.Добавить(ИмяВременногоФайла);
    Иначе
    //ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    //ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    СписокФайлов.Добавить(ИмяВременногоФайла, ИмяФайла);
    //	УдалитьФайлы(ИмяВременногоФайла);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    Если ЗаписьZipФайла <> Неопределено Тогда 
    ЗаписьZipФайла.Записать();
    ФайлАрхива = Новый Файл(ИмяАрхива);
    //ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива);
    //ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    СписокФайлов.Добавить(ИмяАрхива, ФайлАрхива.Имя);
    КонецЕсли;
    
    //УдалитьФайлы(ИмяВременнойПапки);
    
    КонецПроцедуры
    
    
    Кратко о том, что у нас изменилось. Мы убрали запихивание файла во временное хранилище, заменив на выходе ссылку во временное хранилище на путь к временному файлу. Чтобы в последующем воспользоваться созданными временными файлами было убрано удаление файлов, то есть удалять файлы нам придётся в дальнейшем после вложения в сообщение и записи. Для этого заново открываем модуль документа "ИсходящееЭлектронноеПисьмо" и модифицируем процедуру "ПередЗаписью" следующим образом:
    Код:
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    ОчиститьСообщения();
    
    Если Не ВыполняетсяОтправка Тогда
    
    Отказ = ПроверитьЗаполнениеСписковАдресатов();
    
    Если Отказ = Истина Тогда
    Возврат;
    КонецЕсли;
    
    КонецЕсли;
    
    
    #Если Не ВебКлиент Тогда
    МассивКаталоговДляУдаления=Новый Массив();
    //Перебираем вложения и после помещения во временное хранилище удаляем их
    Для Каждого Стр Из Вложения Цикл
    Если Стр.Расположение = 2 Тогда
    Если ЭтоАдресВременногоХранилища(Стр.ИмяФайлаНаКомпьютере) Тогда
    Данные=ПолучитьИзВременногоХранилища(Стр.ИмяФайлаНаКомпьютере);
    Иначе
    Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
    КаталогДляУдаления="";
    ФайлДляУдаления="";
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Стр.ИмяФайлаНаКомпьютере, КаталогДляУдаления, ФайлДляУдаления);
    Стр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, "");
    МассивКаталоговДляУдаления.Добавить(КаталогДляУдаления);
    УдалитьФайлы(Стр.ИмяФайлаНаКомпьютере);
    КонецЕсли;
    Стр.Расположение = 4;
    КонецЕсли;
    КонецЦикла;
    //Удаляем папки оставшиеся от временных файлов
    Для Каждого ФайлДляУдаления из МассивКаталоговДляУдаления Цикл
    ТекущийФайл=Новый Файл(ФайлДляУдаления);
    Если ТекущийФайл.Существует() Тогда
    УдалитьФайлы(ФайлДляУдаления);
    КонецЕсли;
    КонецЦикла;
    #КонецЕсли
    
    Объект.ЕстьВложения = (Вложения.Количество() <> 0);
    
    КонецПроцедуры
    
    
    Здесь как видите мы оставляем доработки предложенные в первом варианте и дополняем их функционалом удаления временных файлов.. Далее разжевывать не буду, код и так предельно простой. Для отображения размеров вложений также необходимо применить доработку предложенную в первом варианте..

    Сразу скажу что на этом список ваших проблем с почтой в УТ 11 только начинается. :D Думаю кому нибудь моя микростатейка поможет... Пока не забыл, если кто будет лазить по коду рекомендую обратить внимание на процедуру фонового задания для получения и отправки почты, там тоже имеются косяки... :angry:
  12. ZOOBR
    Offline

    ZOOBR

    Регистрация:
    12 дек 2011
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Так как кое-кто уже успел опробовать предложенные мной доработки и получил ошибку(ошибка совместного доступа к файлу :angry: я как то сам и не проверил толком) выкладываю поправленный вариант. Нужно заменить полностью или поправить следующий код в модуле документа "ИсходящееЭлектронноеПисьмо". Если идти по первому предложенному варианту то данные исправления не актуальны.

    Процедура "ПередЗаписью"
    Код:
    &НаКлиенте
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    ОчиститьСообщения();
    
    Если Не ВыполняетсяОтправка Тогда
    
    Отказ = ПроверитьЗаполнениеСписковАдресатов();
    
    Если Отказ = Истина Тогда
    Возврат;
    КонецЕсли;
    
    КонецЕсли;
    
    
    #Если Не ВебКлиент Тогда
    МассивКаталоговДляУдаления=Новый Массив();
    //Перебираем вложения и после помещения во временное хранилище удаляем их
    Для Каждого Стр Из Вложения Цикл
    Если Стр.Расположение = 2 Тогда
    Если ЭтоАдресВременногоХранилища(Стр.ИмяФайлаНаКомпьютере) Тогда
    Данные=ПолучитьИзВременногоХранилища(Стр.ИмяФайлаНаКомпьютере);
    Иначе
    Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
    КаталогДляУдаления="";
    ФайлДляУдаления="";
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Стр.ИмяФайлаНаКомпьютере, КаталогДляУдаления, ФайлДляУдаления);
    Если Стр.Удалять Тогда
    МассивКаталоговДляУдаления.Добавить(КаталогДляУдаления);	
    УдалитьФайлы(Стр.ИмяФайлаНаКомпьютере);
    КонецЕсли;	
    Стр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, "");
    КонецЕсли;
    Стр.Расположение = 4;
    КонецЕсли;
    КонецЦикла;
    //Удаляем папки оставшиеся от временных файлов
    Для Каждого ФайлДляУдаления из МассивКаталоговДляУдаления Цикл
    ТекущийФайл=Новый Файл(ФайлДляУдаления);
    Если ТекущийФайл.Существует() Тогда
    НайденныеФайлы = НайтиФайлы(ФайлДляУдаления,"*.*",Истина);
    Если НайденныеФайлы.Количество()=0 Тогда
    УдалитьФайлы(ФайлДляУдаления);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    #КонецЕсли
    
    Объект.ЕстьВложения = (Вложения.Количество() <> 0);
    
    КонецПроцедуры
    
    
    Процедура "ОбработатьПереданныеПараметры":
    Код:
    &НаСервере
    Процедура ОбработатьПереданныеПараметры(Параметры)
    
    Если Объект.Ссылка.Пустая() Тогда
    
    Если Параметры.Свойство("Вложения") Тогда
    
    Для каждого Вложение Из Параметры.Вложения Цикл
    
    новСтр = Вложения.Добавить();
    новСтр.Расположение = 2;
    новСтр.ИмяФайлаНаКомпьютере = Вложение.Значение;
    
    ИмяФайла   = "";
    Расширение = "";
    Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
    ИмяФайла=Вложение.Представление;	
    Данные=ПолучитьИзВременногоХранилища(Вложение.Значение);
    Если ТипЗнч(Данные)=Тип("ДвоичныеДанные") Тогда
    новСтр.Размер=Данные.Размер();
    новСтр.Удалять=Истина;
    новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер);
    КонецЕсли;
    Иначе
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла);
    Попытка
    Данные = Новый Файл(Вложение.Значение);
    новСтр.Размер= Данные.Размер();
    новСтр.Удалять=Истина;
    новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер);
    Исключение
    КонецПопытки
    КонецЕсли;
    
    новСтр.ИмяФайла = Вложение.Представление;
    
    Расширение = ВзаимодействияКлиентСервер.ПолучитьРасширениеФайла(ИмяФайла);
    новСтр.ИндексКартинки = ФайловыеФункцииКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение);
    
    КонецЦикла;
    
    КонецЕсли;
    
    Если НЕ ПустаяСтрока(Параметры.Тема) Тогда
    Объект.Тема = Параметры.Тема;
    КонецЕсли;
    
    Если НЕ ПустаяСтрока(Параметры.Тело) Тогда
    Объект.Текст = Параметры.Тело;
    КонецЕсли;
    
    Если НЕ Параметры.УчетнаяЗапись.Пустая() Тогда
    
    Объект.УчетнаяЗапись = Параметры.УчетнаяЗапись;
    РеквизитыОтправителя = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(Параметры.УчетнаяЗапись,"Ссылка,ИмяПользователя,АдресЭлектроннойПочты");
    Объект.ОтправительПредставление = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(РеквизитыОтправителя.ИмяПользователя,РеквизитыОтправителя.АдресЭлектроннойПочты,"");
    
    КонецЕсли;
    
    КонецЕсли;
    
    КонецПроцедуры
    
    

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