Ошибка при вызове конструктора двоичныеданные каталог не обнаружен

Есть база SQL в ней хранилище файлов.

Открываю файл во временный каталог C:UsersМарковичБНAppDataLocalTemp14v8_959C_6.xls

Изменяю, сохраняю, при сохранении пишет

{Документ.Документ.Форма.ФормаДокумента.Форма(812)}: Ошибка при вызове конструктора (ДвоичныеДанные)

    ВнешнийФайл = Новый ДвоичныеДанные(ИмяВременногоФайлаДляЗаписи);

по причине:

Каталог не обнаружен ‘C:UsersМарковичБНAppDataLocalTemp14v8_959C_6.xls’

Каталог есть файл есть, в чем проблема.

Если базу загрузить в файловую систему, то все работает. Проблема в SQL. Берет не ток каталог???

Ну совершенно верно так и должно быть у каждого с версией 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:

  1. Добрый день, стояло обновление 11.0.6.9 — никаких проблем не было, эмейлы с прикрепленными файлами отправлялись «на ура». Поставили обновление, теперь при попытке отправить файл выдает ошибку:
    «{Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормаДокумента.Форма(1145)}: Ошибка при вызове конструктора (ДвоичныеДанные)
    Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
    по причине:
    Каталог не обнаружен ‘e1cibtempstorage1ad61f76-7b88-49b2-babd-f27210c4292b'»
    Что может быть такое? И как это лечить? Заранее спасибо.


  2. uza

    Offline

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29

    Смотрите что лежит в Стр.ИмяФайлаНаКомпьютере
    и смотрите, есть ли этот каталог на компе.

  3. Дело в том, что каталога такого нет (я смотрел каталог в папке пользователя, в скрытой папке AppData), а Стр.ИмяФайлаНаКомпьютере — это просто строчка из Модуля Документ.ЭлектронноеПисьмоИсходящее.ФормаДокумента.Модуль — так что к чему эта надпись возникает — я вообще понять не могу, в конфе ничего не менялось с электронной почтой, да и до изменения всё работало.
    Спасибо за ответ.
    З.Ы.: Теперь просто выдает ошибку: «Каталог не обнаружен ‘e1cibtempstorageкучацифр — всегда разные.

  4. Ошибка вылетает в связи с тем, что 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
    Симпатии:
    18
    Баллы:
    29

    Код ошибки: 10094289
    Дата публикации: 22 ноября 2011 г.
    Описание: При отправке письма через легкую электронную почту письмо отправляется, но пользователю выводится сообщения о ошибке.


  8. Vladimir1C

    Offline

    Vladimir1C
    Опытный в 1С

    Регистрация:
    19 июл 2010
    Сообщения:
    106
    Симпатии:
    0
    Баллы:
    26

    У нас даже не отправляется.


  9. BabySG

    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Под рукой сейчас нет УТ, но, думаю, есть какая-то ошибка и туда попадает адрес временного хранилища (судя по тексту)

  10. Письма то отправляются, то не отправляются, один раз даже отправилось со вложением. Но когда письма приходят — они без каких-либо реквизитов, ни от кого, ни куда, ни темы, ни письма.
    З.Ы.: А разве легкая почта и почтовый клиент 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;
    новСтр.ИмяФайлаНаКомпьютере = Вложение.Значение;
    
    ИмяФайла   = "";
    Расширение = "";
    Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
    ИмяФайла=Вложение.Представление;	
    Данные=ПолучитьИзВременногоХранилища(Вложение.Значение);
    Если ТипЗнч(Данные)=Тип("ДвоичныеДанные") Тогда
    новСтр.Размер=Данные.Размер();
    новСтр.Удалять=Истина;
    новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер);
    КонецЕсли;
    Иначе
    ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла);
    Попытка
    Данные = Новый Файл(Вложение.Значение);
    новСтр.Размер= Данные.Размер();
    новСтр.Удалять=Истина;
    новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер);
    Исключение
    КонецПопытки
    КонецЕсли;
    
    новСтр.ИмяФайла = Вложение.Представление;
    
    Расширение = ВзаимодействияКлиентСервер.ПолучитьРасширениеФайла(ИмяФайла);
    новСтр.ИндексКартинки = ФайловыеФункцииКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение);
    
    КонецЦикла;
    
    КонецЕсли;
    
    Если НЕ ПустаяСтрока(Параметры.Тема) Тогда
    Объект.Тема = Параметры.Тема;
    КонецЕсли;
    
    Если НЕ ПустаяСтрока(Параметры.Тело) Тогда
    Объект.Текст = Параметры.Тело;
    КонецЕсли;
    
    Если НЕ Параметры.УчетнаяЗапись.Пустая() Тогда
    
    Объект.УчетнаяЗапись = Параметры.УчетнаяЗапись;
    РеквизитыОтправителя = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(Параметры.УчетнаяЗапись,"Ссылка,ИмяПользователя,АдресЭлектроннойПочты");
    Объект.ОтправительПредставление = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(РеквизитыОтправителя.ИмяПользователя,РеквизитыОтправителя.АдресЭлектроннойПочты,"");
    
    КонецЕсли;
    
    КонецЕсли;
    
    КонецПроцедуры
    
    


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Отправка письма со вложенным файлом

Автор Funt432286, 12 мая 2020, 16:07

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

Цитата: antoneus от 14 мая 2020, 19:46
Платформа 1С какая?

8.3

Там неправильно было написано smtp и адрес почты. Почта для отправки mail
Код получился такой:


// Сформировать почтовый профиль.
// При отправке нет необходимости указывать настройки, связанные с POP сервером.
ИПП = Новый ИнтернетПочтовыйПрофиль;
ИПП.АдресСервераSMTP = "smtp.mail.ru";//для gmail, для других серверов может быть другой 
ИПП.ВремяОжидания = 30;
ИПП.Пользователь = "432286@mail.ru";
ИПП.Пароль = "s*********";
ИПП.ПользовательSMTP = "432286@mail.ru";
ИПП.ПарольSMTP = "s*********";
ИПП.ПортSMTP = 465;//для gmail, для других серверов может быть другой
ИПП.ИспользоватьSSLSMTP = Истина;
ИПП.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;

// Создать сообщение.
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить(ЭтаФорма.Адрес);
Сообщение.Отправитель.Адрес = "432286@mail.ru";
Сообщение.Тема = "Срочно в номер!";
Сообщение.Тексты.Добавить("Доброе время суток!");

//Вложение = Новый ДвоичныеДанные(ПутьКФайлуВложения);

//Сообщение.Вложения.Добавить(Вложение,"прикрепленный файл.pdf");

// Подключиться и отправить.
Почта = Новый ИнтернетПочта;
Почта.Подключиться(ИПП);
Почта.Послать(Сообщение);
Почта.Отключиться();

Но выдает ошибку

{ОбщаяФорма.ОтправкаПочты.Форма(31)}: Ошибка при вызове метода контекста (Подключиться)
Почта.Подключиться(ИПП);
по причине:
Can not authenticate to SMTP server: 535 Authentication failed. Please verify your account by going to https://e.mail


С логином-паролем что-то. У себя проверил — с mail.ru отправляется, сначала вбил неверный пароль — в точности такая ошибка.


Цитата: antoneus от 14 мая 2020, 20:32
С логином-паролем что-то. У себя проверил — с mail.ru отправляется, сначала вбил неверный пароль — в точности такая ошибка.

Да, была проблема с паролем.

1. Сейчас все отправляет, но появилась другая проблемка с прикрепленным файлом.


{ОбщаяФорма.ОтправкаПочты.Форма(25)}: Ошибка при вызове конструктора (ДвоичныеДанные)
Вложение = Новый ДвоичныеДанные("ShtampKroySh_150.pdf");
по причине:
Каталог не обнаружен 'ShtampKroySh_150.pdf'

2. И есть еще один вопрос. Данная форма отправки открывается модально из карточки штампа, в карточке есть номер штампа, как сделать так чтобы этот номер (Sh_150) передавался автоматически на эту модальную форму, так как он соответствует имени файлу который должен отправляться.


1. Скорее всего, это сетевая папка, к которой есть доступ с сервера, а с клиентского компа нет. Нужно получать файл на сервере и передавать на клиента или перенести весь функционал отправки на сервер.

2. Номер надо передавать в параметрах открываемой формы (это второй параметр процедуры открытия)

ОткрытьФормуМодально(ИмяФормы, Новый Структура("НомерШтампа", НомерШтампа))

Параметры доступны в открываемой форме в обработчике события ПриСозданииНаСервере

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    НомерШтампа = Параметры.НомерШтампа;


Цитата: antoneus от 15 мая 2020, 10:31
1. Скорее всего, это сетевая папка, к которой есть доступ с сервера, а с клиентского компа нет. Нужно получать файл на сервере и передавать на клиента или перенести весь функционал отправки на сервер.

Поставил &НаСервере, вообще перестала отправлять письмо, а &НаКлиенте отправляет


&НаСервере
Процедура ОтправитьПисьмо(Команда)
// Сформировать почтовый профиль.
// При отправке нет необходимости указывать настройки, связанные с POP сервером.
ИПП = Новый ИнтернетПочтовыйПрофиль;
ИПП.АдресСервераSMTP = "smtp.mail.ru";//для gmail, для других серверов может быть другой 
ИПП.ВремяОжидания = 30;
ИПП.Пользователь = "432286@mail.ru";
ИПП.Пароль = "stavropol151283";
ИПП.ПользовательSMTP = "432286@mail.ru";
ИПП.ПарольSMTP = "stavropol151283";
ИПП.ПортSMTP = 465;//для gmail, для других серверов может быть другой
ИПП.ИспользоватьSSLSMTP = Истина;
ИПП.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;

// Создать сообщение.
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить(ЭтаФорма.Адрес);
Сообщение.Отправитель.Адрес = "432286@mail.ru";
Сообщение.Тема = "Срочно в номер!";
Сообщение.Тексты.Добавить("Доброе время суток!");

    Вложение = Новый ДвоичныеДанные("ShtampKroySh_150.pdf");

    Сообщение.Вложения.Добавить(Вложение,"прикрепленный файл.pdf");

// Подключиться и отправить.
Почта = Новый ИнтернетПочта;
Почта.Подключиться(ИПП);
Почта.Послать(Сообщение);
Почта.Отключиться();
КонецПроцедуры


Потому что сам вызов надо переделать. Кнопка, которая на форме, ищет процедуру с директивой &НаКлиенте и если ее не находит — ничего не делает.

&НаКлиенте
Процедура ОтправитьПисьмо(Команда)
    ОтправитьПисьмоНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтправитьПисьмоНаСервере()
        // Сформировать почтовый профиль.
    // При отправке нет необходимости указывать настройки, связанные с POP сервером.
    ИПП = Новый ИнтернетПочтовыйПрофиль;
и т.д.

И там слэш первый куда-то делся в имени файла.


все равно не может найти путь к файлу

{ОбщаяФорма.ОтправкаПочты.Форма(29)}: Ошибка при вызове конструктора (ДвоичныеДанные)
Вложение = Новый ДвоичныеДанные("ShtampKroySh_150.pdf");
по причине:
Каталог не обнаружен 'ShtampKroySh_150.pdf'

может неправильно указан путь. код получился такой:

Вложение = Новый ДвоичныеДанные("ShtampKroySh_150.pdf");
Сообщение.Вложения.Добавить(Вложение,"прикрепленный файл.pdf");

ShtampKroy — путь где лежит файл
Sh_150.pdf — сам файл который должен прикрепляться


Так это сетевая папка или где она находится вообще? В корне диска C на сервере?

Где эти файлы еще фигурируют? В пользовательском режиме 1С вы делаете что-нибудь с ними?


Цитата: antoneus от 15 мая 2020, 12:29
Так это сетевая папка или где она находится вообще? В корне диска C на сервере?

Где эти файлы еще фигурируют? В пользовательском режиме 1С вы делаете что-нибудь с ними?

Папка Stamp лежит в той же папке, что и база. База хранится на диске Е, но так же к базе подключаются другие пользователи по локальной сети.


Что ж я сразу-то не спросил — серверный вариант или файловый) Тогда вся эта возня с вызовом серверной процедуры не нужна, путь к папке с базой вытаскивайте из функции СтрокаСоединенияИнформационнойБазы(), к нему прилепляйте путь до файла штампа и получите свое вложение.

&НаКлиенте
Процедура ОтправитьПисьмо(Команда)

    СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
    ПутьКБД = Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6);
    ПутьКФайлу = ПутьКБД + "ShtampKroySh_150.pdf";
    Вложение = Новый ДвоичныеДанные(ПутьКФайлу);

    ИПП = Новый ИнтернетПочтовыйПрофиль;
    ....
    и т.д.

   


Теги:

  • Форум База

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Отправка письма со вложенным файлом

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

Рейтинг@Mail.ru

Rambler's Top100

Поиск

Бухгалтерия предприятия ред 3.0, релиз 3.0.43.155. Две базы, центральная и периферийная. Внесены изменения для работы со сканером штрихкодов: добавлен регистр сведений, несколько общих модулей, внесены некоторые изменения в стандартные объекты (делал не я). Начал обновлять на 3.0.43.206 (на копии). Аккуратно перетащил все изменения, проверил этот дополнительный функционал — все работает. Делаю выгрузку в подчиненную базу. Там сообщение обмена читается, предлагает запустить конфигуратор — запускаю, обновляю конфигурацию базы данных, запускаю предприятие — и тут вылезает ошибка: «Ошибка загрузки приоритетных данных из сообщения обмена. Подробности см. в журнале регистрации». В журнале вижу 2 сообщения об ошибках: {ОбщийМодуль.ОбменДаннымиСервер.Модуль(5091)}: Ошибка при вызове конструктора (ДвоичныеДанные)             НовоеСообщение = Новый ДвоичныеДанные(СообщениеОбмена); по причине: Каталог не обнаружен » {ОбщийМодуль.ОбменДаннымиСервер.Модуль(1254)}: Ошибка загрузки приоритетных данных из сообщения обмена. См. подробности в журнале регистрации.             НСтр(«ru = ‘Ошибка загрузки приоритетных данных из сообщения обмена. Не пойму, какой каталог не обнаружен? Что посоветуете?

«какой каталог» — путь к сообщению обмена

А где его надо прописать? Изначально же сообщение прочитано, изменения из него загрузились, конфигурация базы данных обновилась…

посмотри в ОбщийМодуль.ОбменДаннымиСервер.Модуль(5091)} откуда берется СообщениеОбмена

База, в которой ошибка — файловая или серверная?

Не на линуксе каком-нибудь или через http?

Все утро угробил на эксперимент, чтобы понять, проблема в изменениях конфигурации или это очередной подарочек от 1С… Вернул конфигурацию на поддержку (рел. 3.0.43.155). Выгрузил данные в подчиненную базу. Все в порядке. Обновил конфигурацию на 3.0.43.206. Выгрузил в подчиненную базу. В результате — та же ошибка. Получается, заморочка в обновлении от 1С? Никто с подобным не сталкивался?

Насколько я Вас понял правильно, то это не совсем «заморочка 1С», это программа не может записать временный файл в каталог пользователя ОС для временных файлов.

Т.е. до обновления она записать может, а после обновления на рел. 206 — уже нет?

так у вас 4 базы по факту. И какие с какими обменялись? Что-то вы чудите.

Ты после обнолвления в режиме предприятия в базу заходил?Для запуска обработки обновления данных.

Есть одна мысль: попробуй ещё раз выгрузить сообщение обмена из ЦУ и принять в подчиненном узле. Не откатывай конфигурацию, а именно повторно, уже после того, как изменения конфигурации были получены и приняты в подчиненном узле, не используя архивирование.

«Ты после обнолвления в режиме предприятия в базу заходил?Для запуска обработки обновления данных.» Разумеется. В главной базе все отработало нормально. Проблема в подчиненной при первом входе в режиме предприятия после обновления.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове 1004 bigbluebutton
  • Ошибка при вызове конструктора двоичные данные файл не обнаружен
  • Ошибка при вызова контекста при обмене данными
  • Ошибка при вызове конструктора wsпрокси сервис не найден
  • Ошибка при выделении памяти майнкрафт