Новый двоичныеданные ошибка

Ошибка при вызове конструктора (ДвоичныеДанные), Бухгалтерия 3.0 ☑ 0

Новый1сник2

18.07.22

12:37

Доброго дня!

при попытке записать двоичные данные пишет ошибку:

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

    мФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);  

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

при этом в УНФ тот же код работает норм.

1

Новый1сник2

18.07.22

12:37

МассивСсылок = Параметры.ПараметрКоманды;

    Если ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок) Тогда

        МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок);

    КонецЕсли;

    
    ИмяФайла = ИмяТабдок + » » + СокрЛП(СтрЗаменить(МассивСсылок[0].Ссылка, «(не проведен)»,»»)) + «.PDF»;

    
    КаталогВременныхФайлов = КаталогВременныхФайлов();  

    
    ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ИмяФайла);

    
    ТабДок.Записать(ПолноеИмяФайла,»PDF»);

    
    мФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);

2

Новый1сник2

18.07.22

12:38

ПолноеИмяФайла через отладчик показывает полный путь к файлу, сам файл создается

3

ZDenis

18.07.22

12:48

(2) «сам файл создается» — где именно в коде? Путь вижу, а создание файла нет

4

ZDenis

18.07.22

12:50

А тупанул, увидел

5

Новый1сник2

18.07.22

12:51

(3) я по пути смотрел, файл создается, т.е есть в каталоге

6

Новый1сник2

18.07.22

12:53

есть варианты, почему ошибку выдает ?

7

ZDenis

18.07.22

12:56

(6) Вообще должно быть не «ТабДок.Записать(ПолноеИмяФайла,»PDF»)»

а ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.PDF)

8

Новый1сник2

18.07.22

13:00

(7) переписал ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.PDF), ошибка та же

9

RomanYS

18.07.22

13:08

(6) Базы обе файловые?

10

Новый1сник2

18.07.22

13:09

(9) база серверная, но в УНФ работает и в серверном и в файловом варианте

11

Новый1сник2

18.07.22

13:10

в отладчике такую ошибку пишет:

Новый ДвоичныеДанные(ПолноеИмяФайла)    

{<Неизвестный модуль>(1)}: Ошибка при вызове конструктора (ДвоичныеДанные)

12

Dmitrii

18.07.22

13:11

(5) >>  я по пути смотрел, файл создается, т.е есть в каталоге.

А ты в отладчике посмотри.

Что в переменной «ПолноеИмяФайла»?

13

Garykom

18.07.22

13:11

(9) ТабДок.Записать непонятно как отрабатывает для разницы клиент-сервер

14

Новый1сник2

18.07.22

13:12

(12) ПолноеИмяФайла    «E:\TempUSR1CV8\ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13:08:34.PDF»    Строка

15

Garykom

18.07.22

13:13

(14) попробуй тупую вещь

замени + «.PDF» на + «.pdf»

16

RomanYS

18.07.22

13:13

вот и ответ. Двоеточие запрещено в именах файла

17

RomanYS

18.07.22

13:14

+(16) а в УНФ возможно время убрано из представления документа

18

Новый1сник2

18.07.22

13:15

(17) похоже на то, в унф без времени записывается, сейчас проверю

19

Garykom

18.07.22

13:15

(16) хмм почему не падает ТабДок.Записать( «E:\TempUSR1CV8\ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13:08:34.PDF») ?

20

RomanYS

18.07.22

13:16

(19) и файл создает?

21

ZDenis

18.07.22

13:16

(19) + он говорит что файл создается в каталоге

22

Garykom

18.07.22

13:17

(20) (21) Вот это и интересно ))

23

Garykom

18.07.22

13:19

И да.

Запрещенные символы в именах файлов/папок это кстати раздражает с точки зрения логики и удобства.

Это же дичайший маразм и архаизм.

24

RomanYS

18.07.22

13:19

(22) тут наверное нужно разбираться с версиями ОС и платформы… только непонятно зачем.

25

Garykom

18.07.22

13:20

В случае линукс сталкивался с (15), когда расширение по дефолту маленькими буковками и имена файлов регистрозависимы

26

Злопчинский

18.07.22

13:22

(23) всегда имена файлов нормализовалось перед записью. Ненавижу такие имена как выше у ТС.

27

Новый1сник2

18.07.22

13:27

(26) а чем не нравится, «ЗаказПоставщику» дублируется, это я поправлю

28

Новый1сник2

18.07.22

13:32

получилось, проблема была видимо в запрещенных символах.

благодарю

29

Злопчинский

18.07.22

13:34

Пробелы в имени файла — копрокод

Точки в имени файла — копрокод

Форматзаписи датыф когда по нему нельзя отсортировать файлы по хронологии имени — копрокод*2

.

могу ошибаться, конечно, на вкус и цвет как говорится…

30

Новый1сник2

18.07.22

13:39

(29) сейчас выглядит как «Заказ поставщику 00000000001 от 18.07.2022.PDF», чем пробелы и точки помешали ?

31

arsik

18.07.22

13:54

(0) Зачем нагружать файловую систему? Сейчас такое делается через поток.

32

Mr_Rm

18.07.22

13:57

(19) Оно не просто не падает, а молча создаёт файл с именем «E:\TempUSR1CV8\ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13» — обрезано по двоеточие, без расширения.

То же самое для объекта ТекстовыйДокумент. Вероятно, так же и для других, имеющих метод Записать. Проверено на 8.3.21.1302. Явный баг.

33

Новый1сник2

18.07.22

14:04

(31) записывается в присоединенные файлы, временные файлы удаляются

34

Kassern

18.07.22

14:13

(33) Зачем записывать во временные файлы? Откройте СП и почитайте за метод Записать ТД и какие варианты есть там. Далее в том же СП посмотрите метод ЗакрытьИПолучитьДвоичныеДанные() У ПотокаВПамяти.

35

Kassern

18.07.22

14:14

Все это можно провернуть в оперативке, чтобы дважды к файловой системе не обращаться.

36

Новый1сник2

18.07.22

14:17

(35) сделано уже, работает быстро. переделывать нет смысла. на будущее почитаю инфу про поток

37

Kassern

18.07.22

14:20

(36) Если в упрощенно, то как-то так:

ПотокВПамяти=Новый ПотокВПамяти();

ТабДок.Записать(ПотокВПамяти,»pdf»);

ДД=ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();

38

Garykom

18.07.22

14:27

(37) Что будет если «pdf» размером больше ram ?

39

Kassern

18.07.22

14:27

(38) Тогда нужно бежать из этой конторы)

40

Новый1сник2

18.07.22

14:40

(37) благодарю, сохраню в заметки

41

Сергиус

18.07.22

15:32

(38)начнет свопить на диск)

42

Garykom

18.07.22

15:42

(26) Речь о том что нормализация имен файлов это глупость.

Банальный недостаток/недоработка файловой системы что нельзя любые символы применять.

Которое проистекает из древнейших времен наследия CP/M.

Например что имена переменных (и процедур/функций) в 1С нельзя начинать с цифры или они не могут содержать некоторых символов тоже атавизм.

Как и идиотизм с разделением Структура/Соответствие, которые прекрасно объединяются в одно.

Даже обращаться к свойствам можно было бы так Структура.»Имя свойства» что равнозначно Структура[«Имя свойства»]

43

Garykom

18.07.22

15:44

(42)+ Подумайте. Имена файлов разрешают кириллицу и даже иероглифы. А вот «:» и слеши нельзя. Маразм!

44

Kigo_Kigo

18.07.22

16:26

(43) Это спец символы, которые используются в том же пути к файлу, что может породить кучу проблем, по этому они тупо запрещены, это разве не очивидно? ничего идиотского я в этом не вижу

45

Garykom

18.07.22

16:36

(44) 1. «:» только одно после имени диска

если разрешили «.» и только последняя как разделитель имени и расширения а прочие разрешены и относятся к имени кто/что мешает тоже самое сделать с «:»?

самое первое после имени диска спецсимвол, прочие относятся к имени файла

2. «/» и «\» прекрасно можно использовать в имени файла, просто автоматически при записи создает подкаталоги и все, при чтении пытается прочитать подкаталог

т.е. запись файла «c:\блабла\блабла» создает файл «блабла» в каталоге «блабла» на диске c

46

Kassern

18.07.22

16:57

(45) а если юзвер не хочет создавать папку и он тупо очепятался в имени папки? В вашем случае создастся еще одна и юзвер это не заметит. А если еще и регламент к изначальной папке прикручен?)

47

Kassern

18.07.22

16:58

в общем, не во всех случаях эта логика правильная, а где-то она вредная. Поэтому это нормальное поведение ОС, если хотите свою, то допишите как вам надо в своей обработке записи.

48

ДедМорроз

18.07.22

23:11

Двоеточие в имени файла — это имя альтернативного потока данных.

Оно создается и записывается,а вот при проверке существования будет ошибка.

49

Злопчинский

18.07.22

23:16

(45) в Far так и сделано ;-)

50

ДедМорроз

18.07.22

23:55

В Linux,например,есть символ исключения \,который позволяет использовать в тмени файла практически любые символы.

Опять же,файловой системе,по большому счету,не важно,какая строка записана в имени файла.

Вопрос тут только в правильности понимания разбиения на составляющие.

Ну и в ntfs имена файлов и длина пути до 32768 байт,однако,и вме работает как в 1с,так и в Си,а вот проводник windows,не работает-позор да и только.

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

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

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

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

antoneus,

ЦитироватьСтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
ПутьКБД = Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) — 6);

а если это клиент-серверный вариант?
какой это путь к файлу? ПутьКБД- ?
там имя сервера  и имя СКЛ/ПГ Базы
получение файла с Сервера на Клиент — это же уже давно обкатанный велосипед! что вы его изобретаете?

если помогло нажмите: Спасибо!



э-э-э, а-а-а
ну тогда… :dfbbdrfb:

если помогло нажмите: Спасибо!


Цитата: antoneus от 15 мая 2020, 15:11
Что ж я сразу-то не спросил — серверный вариант или файловый) Тогда вся эта возня с вызовом серверной процедуры не нужна, путь к папке с базой вытаскивайте из функции СтрокаСоединенияИнформационнойБазы(), к нему прилепляйте путь до файла штампа и получите свое вложение.&НаКлиенте
Процедура ОтправитьПисьмо(Команда)

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

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

Видимо сегодня не мой день. Выдает такую ошибку при попытки отправить:

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

Добавлено: 15 мая 2020, 18:22


Цитата: Funt432286 от 15 мая 2020, 17:59

Цитата: antoneus от 15 мая 2020, 15:11
Что ж я сразу-то не спросил — серверный вариант или файловый) Тогда вся эта возня с вызовом серверной процедуры не нужна, путь к папке с базой вытаскивайте из функции СтрокаСоединенияИнформационнойБазы(), к нему прилепляйте путь до файла штампа и получите свое вложение.&НаКлиенте
Процедура ОтправитьПисьмо(Команда)

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

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

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

И еще маленький вопросик, не получается сделать запрос из справочника (не хочу из-за этой мелочи тему создавать)
из справочника Бумага необходимо вернуть значение Валюта по Наименованию (Ссылка).


&НаСервере
Функция ПолучитьВалютуБумага(Ссылка)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦифраМатериал.Наименование,
| ЦифраМатериал.Валюта КАК Валюта
|ИЗ
| Справочник.ЦифраМатериал КАК ЦифраМатериал
|ГДЕ
| ЦифраМатериал.Наименование = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

Возврат РезультатЗапроса [0].Валюта;
КонецФункции

в поцедуре наКлиенте
БумагаВалюта = ПолучитьВалютуБумага(стрБумага);
Сообщить(БумагаВалюта);

Выводит пустое сообщение (просто какой-то тупняк жуткий)


Путь к файлу валидный? Если его вставить в адресную строку проводника — файл откроется?

UPD: Если бы вы вручную захотели этот файл прикрепить к письму — где и как бы вы его взяли?


Цитата: antoneus от 15 мая 2020, 18:24
Путь к файлу валидный? Если его вставить в адресную строку проводника — файл откроется?

UPD: Если бы вы вручную захотели этот файл прикрепить к письму — где и как бы вы его взяли?

Да файл открывается, если в ручную то файл лежит E:1Cпринт_1СShtampKroy


Вставьте Сообщить(ПутьКФайлу) перед созданием двоичных данных — что выведет?

По запросу —

ГДЕ
|    ЦифраМатериал.Ссылка= &Ссылка


Цитата: antoneus от 15 мая 2020, 18:43
Вставьте Сообщить(ПутьКФайлу) перед созданием двоичных данных — что выведет?

«E:1Cпринт_1С»ShtampKroySh_150.pdf — вот что он выводит. Получается он начало пути выводит в кавычки и тем самым разбивает весь путь на две части


Funt432286,

ЦитироватьВидимо сегодня не мой день.

на прочь забыли как отладчик запускать?
ну небольшая ошибочка же была, хоть какие-то описки в советах могли бы сами поправить!!!
что же все только сильно пережованное хаваете?

Вообще странно что в каталоге базы еще какие-то подкаталоги

посмотрите как у вас путь к файлу формируется?
добавьте
ПутьКФайлу = ПутьКБД + «ShtampKroySh_150.pdf»;
Сообщить(ПутьКФайлу);//тестовая печать

возьмите его значение и вставьте в проводник, посмотрите открывается ли у вас данная папка? и есть ли там нужный файл?

жуем задачу дальше
в вашем примере не правильно путь выделяется, попробуйте так


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

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

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


или все заработает
или ругаться по другому будет, типа Каталог не обнаружен
{(7)}: Ошибка при вызове конструктора (ДвоичныеДанные): Каталог не обнаружен ‘E:!1CТестОтчетыTest11ПредложениеТур.txt’

если помогло нажмите: Спасибо!


1. Ругаться он перестал, письмо отправил и даже путь правильно указал. Только вот письмо пришло без файла, но с текстом

2. а по запросу выдает такую ошибку:


{Документ.РасчетЦифра.Форма.ФормаДокумента.Форма(546)}: Индекс находится за границами массива
Возврат РезультатЗапроса [0].Валюта;


  

Новый1сник2

18.07.22 — 12:37

Доброго дня!

при попытке записать двоичные данные пишет ошибку:

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

    мФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);  

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

при этом в УНФ тот же код работает норм.

  

Новый1сник2

1 — 18.07.22 — 12:37

МассивСсылок = Параметры.ПараметрКоманды;

    Если ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок) Тогда

        МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок);

    КонецЕсли;

    
    ИмяФайла = ИмяТабдок + » » + СокрЛП(СтрЗаменить(МассивСсылок[0].Ссылка, «(не проведен)»,»»)) + «.PDF»;

    
    КаталогВременныхФайлов = КаталогВременныхФайлов();  

    
    ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ИмяФайла);

    
    ТабДок.Записать(ПолноеИмяФайла,»PDF»);

    
    мФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);

  

Новый1сник2

2 — 18.07.22 — 12:38

ПолноеИмяФайла через отладчик показывает полный путь к файлу, сам файл создается

  

ZDenis

3 — 18.07.22 — 12:48

(2) «сам файл создается» — где именно в коде? Путь вижу, а создание файла нет

  

ZDenis

4 — 18.07.22 — 12:50

А тупанул, увидел

  

Новый1сник2

5 — 18.07.22 — 12:51

(3) я по пути смотрел, файл создается, т.е есть в каталоге

  

Новый1сник2

6 — 18.07.22 — 12:53

есть варианты, почему ошибку выдает ?

  

ZDenis

7 — 18.07.22 — 12:56

(6) Вообще должно быть не «ТабДок.Записать(ПолноеИмяФайла,»PDF»)»

а ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.PDF)

  

Новый1сник2

8 — 18.07.22 — 13:00

(7) переписал ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.PDF), ошибка та же

  

RomanYS

9 — 18.07.22 — 13:08

(6) Базы обе файловые?

  

Новый1сник2

10 — 18.07.22 — 13:09

(9) база серверная, но в УНФ работает и в серверном и в файловом варианте

  

Новый1сник2

11 — 18.07.22 — 13:10

в отладчике такую ошибку пишет:

Новый ДвоичныеДанные(ПолноеИмяФайла)    

{<Неизвестный модуль>(1)}: Ошибка при вызове конструктора (ДвоичныеДанные)

  

Dmitrii

12 — 18.07.22 — 13:11

(5) >>  я по пути смотрел, файл создается, т.е есть в каталоге.

А ты в отладчике посмотри.

Что в переменной «ПолноеИмяФайла»?

  

Garykom

13 — 18.07.22 — 13:11

(9) ТабДок.Записать непонятно как отрабатывает для разницы клиент-сервер

  

Новый1сник2

14 — 18.07.22 — 13:12

(12) ПолноеИмяФайла    «E:TempUSR1CV8ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13:08:34.PDF»    Строка

  

Garykom

15 — 18.07.22 — 13:13

(14) попробуй тупую вещь

замени + «.PDF» на + «.pdf»

  

RomanYS

16 — 18.07.22 — 13:13

вот и ответ. Двоеточие запрещено в именах файла

  

RomanYS

17 — 18.07.22 — 13:14

+(16) а в УНФ возможно время убрано из представления документа

  

Новый1сник2

18 — 18.07.22 — 13:15

(17) похоже на то, в унф без времени записывается, сейчас проверю

  

Garykom

19 — 18.07.22 — 13:15

(16) хмм почему не падает ТабДок.Записать( «E:TempUSR1CV8ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13:08:34.PDF») ?

  

RomanYS

20 — 18.07.22 — 13:16

(19) и файл создает?

  

ZDenis

21 — 18.07.22 — 13:16

(19) + он говорит что файл создается в каталоге

  

Garykom

22 — 18.07.22 — 13:17

(20) (21) Вот это и интересно ))

  

Garykom

23 — 18.07.22 — 13:19

И да.

Запрещенные символы в именах файлов/папок это кстати раздражает с точки зрения логики и удобства.

Это же дичайший маразм и архаизм.

  

RomanYS

24 — 18.07.22 — 13:19

(22) тут наверное нужно разбираться с версиями ОС и платформы… только непонятно зачем.

  

Garykom

25 — 18.07.22 — 13:20

В случае линукс сталкивался с (15), когда расширение по дефолту маленькими буковками и имена файлов регистрозависимы

  

Злопчинский

26 — 18.07.22 — 13:22

(23) всегда имена файлов нормализовалось перед записью. Ненавижу такие имена как выше у ТС.

  

Новый1сник2

27 — 18.07.22 — 13:27

(26) а чем не нравится, «ЗаказПоставщику» дублируется, это я поправлю

  

Новый1сник2

28 — 18.07.22 — 13:32

получилось, проблема была видимо в запрещенных символах.

благодарю

  

Злопчинский

29 — 18.07.22 — 13:34

Пробелы в имени файла — копрокод

Точки в имени файла — копрокод

Форматзаписи датыф когда по нему нельзя отсортировать файлы по хронологии имени — копрокод*2

.

могу ошибаться, конечно, на вкус и цвет как говорится…

  

Новый1сник2

30 — 18.07.22 — 13:39

(29) сейчас выглядит как «Заказ поставщику 00000000001 от 18.07.2022.PDF», чем пробелы и точки помешали ?

  

arsik

31 — 18.07.22 — 13:54

(0) Зачем нагружать файловую систему? Сейчас такое делается через поток.

  

Mr_Rm

32 — 18.07.22 — 13:57

(19) Оно не просто не падает, а молча создаёт файл с именем «E:TempUSR1CV8ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13» — обрезано по двоеточие, без расширения.

То же самое для объекта ТекстовыйДокумент. Вероятно, так же и для других, имеющих метод Записать. Проверено на 8.3.21.1302. Явный баг.

  

Новый1сник2

33 — 18.07.22 — 14:04

(31) записывается в присоединенные файлы, временные файлы удаляются

  

Kassern

34 — 18.07.22 — 14:13

(33) Зачем записывать во временные файлы? Откройте СП и почитайте за метод Записать ТД и какие варианты есть там. Далее в том же СП посмотрите метод ЗакрытьИПолучитьДвоичныеДанные() У ПотокаВПамяти.

  

Kassern

35 — 18.07.22 — 14:14

Все это можно провернуть в оперативке, чтобы дважды к файловой системе не обращаться.

  

Новый1сник2

36 — 18.07.22 — 14:17

(35) сделано уже, работает быстро. переделывать нет смысла. на будущее почитаю инфу про поток

  

Kassern

37 — 18.07.22 — 14:20

(36) Если в упрощенно, то как-то так:

ПотокВПамяти=Новый ПотокВПамяти();

ТабДок.Записать(ПотокВПамяти,»pdf»);

ДД=ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();

  

Garykom

38 — 18.07.22 — 14:27

(37) Что будет если «pdf» размером больше ram ?

  

Kassern

39 — 18.07.22 — 14:27

(38) Тогда нужно бежать из этой конторы)

  

Новый1сник2

40 — 18.07.22 — 14:40

(37) благодарю, сохраню в заметки

  

Сергиус

41 — 18.07.22 — 15:32

(38)начнет свопить на диск)

  

Garykom

42 — 18.07.22 — 15:42

(26) Речь о том что нормализация имен файлов это глупость.

Банальный недостаток/недоработка файловой системы что нельзя любые символы применять.

Которое проистекает из древнейших времен наследия CP/M.

Например что имена переменных (и процедур/функций) в 1С нельзя начинать с цифры или они не могут содержать некоторых символов тоже атавизм.

Как и идиотизм с разделением Структура/Соответствие, которые прекрасно объединяются в одно.

Даже обращаться к свойствам можно было бы так Структура.»Имя свойства» что равнозначно Структура[«Имя свойства»]

  

Garykom

43 — 18.07.22 — 15:44

(42)+ Подумайте. Имена файлов разрешают кириллицу и даже иероглифы. А вот «:» и слеши нельзя. Маразм!

  

Kigo_Kigo

44 — 18.07.22 — 16:26

(43) Это спец символы, которые используются в том же пути к файлу, что может породить кучу проблем, по этому они тупо запрещены, это разве не очивидно? ничего идиотского я в этом не вижу

  

Garykom

45 — 18.07.22 — 16:36

(44) 1. «:» только одно после имени диска

если разрешили «.» и только последняя как разделитель имени и расширения а прочие разрешены и относятся к имени кто/что мешает тоже самое сделать с «:»?

самое первое после имени диска спецсимвол, прочие относятся к имени файла

2. «/» и «» прекрасно можно использовать в имени файла, просто автоматически при записи создает подкаталоги и все, при чтении пытается прочитать подкаталог

т.е. запись файла «c:блаблаблабла» создает файл «блабла» в каталоге «блабла» на диске c

  

Kassern

46 — 18.07.22 — 16:57

(45) а если юзвер не хочет создавать папку и он тупо очепятался в имени папки? В вашем случае создастся еще одна и юзвер это не заметит. А если еще и регламент к изначальной папке прикручен?)

  

Kassern

47 — 18.07.22 — 16:58

в общем, не во всех случаях эта логика правильная, а где-то она вредная. Поэтому это нормальное поведение ОС, если хотите свою, то допишите как вам надо в своей обработке записи.

  

ДедМорроз

48 — 18.07.22 — 23:11

Двоеточие в имени файла — это имя альтернативного потока данных.

Оно создается и записывается,а вот при проверке существования будет ошибка.

  

Злопчинский

49 — 18.07.22 — 23:16

(45) в Far так и сделано ;-)

  

ДедМорроз

50 — 18.07.22 — 23:55

В Linux,например,есть символ исключения ,который позволяет использовать в тмени файла практически любые символы.

Опять же,файловой системе,по большому счету,не важно,какая строка записана в имени файла.

Вопрос тут только в правильности понимания разбиения на составляющие.

Ну и в ntfs имена файлов и длина пути до 32768 байт,однако,и вме работает как в 1с,так и в Си,а вот проводник windows,не работает-позор да и только.

Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

1

1C 8.x

Ошибка при вызове конструктора (ДвоичныеДанные)

28.10.2013, 10:26. Показов 15113. Ответов 3

Метки нет (Все метки)


Почему ошибка выдает
Ошибка при вызове конструктора (ДвоичныеДанные)
НовоеВложение.Хранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Каталог), Новый СжатиеДанных());
по причине:
Ошибка совместного доступа к файлу ‘C:UsersermakovAppDataLocalTempprice.xls’

1C
1
2
3
4
5
6
7
8
9
10
    
    НовоеВложение = Справочники.ВложенияЭлектронныхПисем.СоздатьЭлемент();
    НовоеВложение.Объект = Письмо.Ссылка;
    НовоеВложение.ИмяФайла = "price.xls";
    НовоеВложение.Хранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Каталог), Новый СжатиеДанных());
    Попытка
        НовоеВложение.Записать();
    Исключение
        Отказ = Истина;
    КонецПопытки;

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

28.10.2013, 11:19

2

Нужно закрывать файл перед помещением его в хранилищеЗначений

1

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

28.10.2013, 11:20

 [ТС]

3

Dethmontt, Подскажите на примере пожалуйста

0

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

28.10.2013, 11:26

4

На каком примере? У тебя тупо открыт этот файл — ‘C:UsersermakovAppDataLocalTempprice.xls’ либо висит в процессах

Добавлено через 4 минуты
Возможно ты его открываешь в коде…

0

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

  2. Offline

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

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

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

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

  4. Ошибка вылетает в связи с тем, что 1С пытается сохранить файл, так как отправить файл хранящийся на диске — это без проблем, отправить просто письмо — тоже, а вот если попытаться отправить или сохранить вложение — то выдает ошибку и сохраняет письмо без вложения.
    Раз никто не сталкивался, то скажите, у Вас после с обновлением работает отправка созданных документов?

  5. Offline

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

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

    Про обновления не скажу — у нас другое.
    А вот ошибка связанная с тем, что не уходит письмо с вложением вполне понятна.
    Давайте посмотрим как 1С пытается отправить письмо с вложением
    1) Создается файл вложения и сохраняется где то на диске (имеем путь к нему)
    2) Создается письмо и заполняется его тело
    3) Прикрепляется файл (ш.1)

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

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

  6. Offline

    Vladimir1C
    Опытный в 1С

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

    Поддерживаю тему. Не отправляются письма. Ошибка та же.

    Нашлось решение?

  7. Offline

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

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

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

  8. Offline

    Vladimir1C
    Опытный в 1С

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

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

  9. Offline

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

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

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

  10. Письма то отправляются, то не отправляются, один раз даже отправилось со вложением. Но когда письма приходят — они без каких-либо реквизитов, ни от кого, ни куда, ни темы, ни письма.
    З.Ы.: А разве легкая почта и почтовый клиент 1С — это одно и тоже? Мне казалось, что они сделали возможность отправки почты без использования почтового клиента и назвали это «легкой почтой», или я не прав?

  11. 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. Offline

    ZOOBR

    Регистрация:
    12 дек 2011
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1

    Так как кое-кто уже успел опробовать предложенные мной доработки и получил ошибку(ошибка совместного доступа к файлу :angry: я как то сам и не проверил толком) выкладываю поправленный вариант. Нужно заменить полностью или поправить следующий код в модуле документа «ИсходящееЭлектронноеПисьмо». Если идти по первому предложенному варианту то данные исправления не актуальны.

    Процедура «ПередЗаписью»

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

    Процедура «ОбработатьПереданныеПараметры»:

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

Содержание:

1. Почему может возникнуть ошибка при вызове конструктора (COM-объект 1С)?

2. С помощью чего можно исправить ошибку при вызове конструктора (COM-объект 1С)?

3. Параметры при вызове конструктора (COM-объект 1С), которые регистрируют компоненты строки кода перед регистрируемым dll-файлом    

1.      Почему может возникнуть ошибка при вызове конструктора (COM-объект 1С)?

Когда ты начинающий специалист 1С, то иногда приходится чувствовать себя шаманом с бубном, так как не знаешь причин ошибки и как её исправить тоже.

Сегодня мы разберем одну из ошибок, которые появляются при работе с базой, а именно ошибку при вызове конструктора (COM-объект 1С).

Ситуацию такую, мы можем наблюдать при загрузке с Excel при использовании (COM-объекта 1С), при обмене между базами. Ситуаций, когда возникает данное сообщение с возникшей проблемой довольно много при работе с программой.

Как правило, данная ошибка возникает из-за того, что при установке платформы1С не произошла автоматическая регистрация 64-х разрядной компоненты, которая отвечает за использование COM-соединения 1С 8.3. А почему это произошло, спросите? Все очень просто и в то же время сложно, если не знаешь, в чем все ядро проблемы. А причина в том, что те, у кого выдаются такие ошибки, используют 32(86) – разрядную операционную систему и ставят вместо платформы необходимой разрядности их системы, платформу 1С предназначенную для совсем другой системы.   

2. С помощью чего можно исправить ошибку при вызове конструктора (COM-объект 1С)?

Исправить данную ошибку, довольно легко. Для этого необходимо всего лишь зарегистрировать библиотеку dll в реестре при помощи командной строки или программы PowerShell, в зависимости от того, что любите использовать, и команды regsvr32.

Для того чтобы выполнить команду, достаточно будет в строке написать такой текст команды «regsvr32 «C:Program Files1cv88.3.ХХ.ХХХХbincomcntr.dll»». Вместо «ХХ.ХХХХ» необходимо указать необходимый релиз платформы, библиотеку которой, необходимо зарегистрировать в реестре системы.

Если все выполнено правильно и регистрация произошла успешно, то должно выдать сообщение, как на скриншоте, об успешной регистрации библиотеки.

Администратор: Командная строка   

3. Параметры при вызове конструктора (COM-объект 1С), которые регистрируют компоненты строки кода перед регистрируемым dll-файлом

Также есть некоторые особенности команды, которая регистрирует компоненты.

На данный момент я знаю только 4 параметра (которые при написании строки кода указываются перед регистрируемым dll-файлом):

·        /u — параметр, отменяет регистрацию

·        /i — параметр, который позволяет при необходимости, в зависимости от библиотеки.

·        /n —параметр используется только для установки компоненты 1С, в основном пишется вместе с предыдущим (/I);

·        /s – возможность отключить все сообщения при регистрации;

Существует, также, один немаловажный момент, что в зависимости от версии командной строки, иногда приходится прописывать путь к самой утилите.

Кстати, существуют специальные программы-инструменты, которые помогают регистрировать компоненты, без знания команд и утилит администрирования, зарегистрировать библиотеку и продолжить работать дальше.

Таких программ достаточно много и писать, какое-то одно название смысла нет.

Для того чтобы быстро и качественно решать такие проблемы, необходимо изучать разнообразные статьи, для повышения уровня знаний и квалификации.

Специалист компании «Кодерлайн»

Олег Мороз

Начиная с версии технологической платформы 8.3.9 средства для работы с двоичными данными претерпели существенные изменения. В этой статье я постараюсь рассказать как о старых, так и о новых инструментах для работы с двоичными данными. При написании статьи использовалась версия технологической платформы 8.3.12

Содержание

  1. Общая информация
  2. Двоичные данные
  3. Потоки
  4. Чтение и запись
  5. Практическая часть
  6. Двоичные данные
  7. Потоки

Общая информация

Если раньше, до версии технологической платформы 8.3.9, мы располагали только объектом ДвоичныеДанные, то к настоящему времени у нас имеется целый набор объектов, которые серьезно расширяют наши возможности по манипуляциям с двоичными данными. Рассмотрим все эти объекты чуточку подробнее.

Двоичные данные

Экземпляры объекта ДвоичныеДанные содержат двоичные данные, которые считываются из файла. При это объект ДвоичныеДанные является достаточно многофункциональным — мы можем:

  • читать двоичные данные из файла и записывать их в файл;
  • передавать их между клиентом и сервером при помощи временного хранилища;
  • передавать и получать их по сети;
  • хранить их базе данных в реквизитах вида ХранилищеЗначения;
  • превратить двоичные данные в объект вида Картинка (при определенных условиях конечно);
  • хранить двоичные данные в макетах;
  • шифровать и расшифровывать, подписывать и проверять подписи;

Наверняка я что-то пропустил, но главное должно быть понятно — несмотря на значительное развитие средств работы с двоичными данными, объект ДвоичныеДанные остается ключевым.

Потоки

Это группа объектов назначение которых заключается в работе с потоками данных.

Поток — этот объект представляет собой поток данных из которого можно читать и/или записывать в него данные. Данный объект не имеет конструктора, а получить экземпляр объекта можно при помощи различных методов других объектов.

ФайловыйПоток — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в файлах на диске.

ПотокВПамяти — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в оперативной памяти.

МенеджерФайловыхПотоков — этот объект предоставляет типовые методы для работы с файлами (открытие и создание). Создать экземпляр этого объекта нельзя — имеется объект глобального контекста ФайловыеПотоки который и предоставляет доступ к методам менеджера.

Чтение и запись

ЧтениеДанных — этот объект предназначен для чтения различных типов данных из различных источников (потоки, файлы, двоичные данные).

РезультатЧтенияДанных — этот объект содержит описание результата чтения данных из потока. Объект не имеет конструктора, получить экземпляр объекта можно при помощи методов других объектов.

БуферДвоичныхДанных — этот объект представляет собой коллекцию байтов фиксированного размера, имеется возможность произвольного доступа и изменения по месту.

ЗаписьДанных — этот объект предназначен для записи различных типов данных в приемник.

Практическая часть

Итак, у нас достаточно много различных объектов, которые, в свою очередь, имеют много разных свойств и методов. Разобраться во всем этом более подробно помогут практические примеры, к ним и перейдем.

Многие объекты — ДвоичныеДанные, Поток, ФайловыйПоток, ПотокВПамяти, ЧтениеДанных, ЗаписьДанных, РезультатЧтенияДанных имеют пары синхронных и асинхронных методов, например: Записать — НачатьЗапись, Закрыть — НачатьЗакрытие. Асинхронные методы нужны для обеспечения возможности одинаковой работы и в тонком клиенте, и в веб-клиенте.

Подробнее про синхронные и асинхронные методы можно прочесть в этой статье.

Двоичные данные

Ниже приведены примеры основных операций с объектом ДвоичныеДанные.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

&НаКлиенте

Процедура РаботаСДвоичнымиДаннымиВ1С(Команда)

//создаем двоичные данные из файла

ДвоичныеДанные = Новый ДвоичныеДанные(«D:test.png»);

//получаем размер двоичных данных

Сообщить(«Размер файла: «+ДвоичныеДанные.Размер()+» байт»);

//кодируем двоичные данные в строку по алгоритму base64

СтрокаBase64 = Base64Строка(ДвоичныеДанные);

//и раскодируем обратно

ДвоичныеДанные = Base64Значение(СтрокаBase64);

Сообщить(СтрокаBase64);

//создаем картинку из двоичных данных

Картинка = Новый Картинка(ДвоичныеДанные);

//помещаем во временное хранилище и передаем адрес на сервер

ПолучитьДвоичныеДанныеНаСервере(ПоместитьВоВременноеХранилище(ДвоичныеДанные));

КонецПроцедуры

&НаСервере

Процедура ПолучитьДвоичныеДанныеНаСервере(Адрес)

//получаем двоичные данные из временного хранилища

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

//записываем двоичные данные в файл на сервере

ДвоичныеДанные.Записать(«D:serv-test.png»);

//помещаем двоичные данные в объект ХранилищеЗначения

Хранилище = Новый ХранилищеЗначения(ДвоичныеДанные);

КонецПроцедуры

Потоки

В начале создадим файловый поток из PNG-файла и прочитаем первые 8 байт — они у изображений в формате PNG всегда такие: 137,80,78,71,13,10,26,10. При создании объекта ЧтениеДанных указан порядок байтов — BigEndian, подробнее об этом можно прочесть тут.

Заголовок PNG-файла

Заголовок PNG-файла

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

&НаКлиенте

Процедура РаботаСПотокамиВ1С(Команда)

//создадим фаловый поток

ФайловыйПоток = ФайловыеПотоки.ОткрытьДляЧтения(«D:test.png»);

//размер файла

Сообщить(«Размер файла: «+ФайловыйПоток.Размер()+» байт»);

//создадим необходимый объект для чтения данных из потока

ЧтениеДанных = Новый ЧтениеДанных(ФайловыйПоток, КодировкаТекста.ANSI, ПорядокБайтов.BigEndian);

//считаем первые восемь байт в буфер

Буфер = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(8);

//пройдемся по каждому байту буфера

Для Каждого Байт Из Буфер Цикл

Сообщить(Строка(Байт));

КонецЦикла;

//этот цикл делает тоже самое что и предыдущий

Для Номер = 0 По 7 Цикл

Сообщить(Строка(Буфер[Номер]));

КонецЦикла;

КонецПроцедуры

Теперь попробуем отправить составное (multipart) HTTP-сообщение. У меня на сервере есть PHP-скрипт вот такого содержания:

echo $_FILES[‘image1’][‘name’].»n»;

echo $_FILES[‘image1’][‘size’].»n»;

echo $_FILES[‘image2’][‘name’].»n»;

echo $_FILES[‘image2’][‘size’];

?>

Отошлем ему две картинки из библиотеки картинок и посмотрим, что получится:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

&НаКлиенте

Процедура Проверить3(Команда)

//подготавливаем вложенные сообщения

ДвоичныеДанные1 = ПодготовитьКартинку(«image1», «image1.png», БиблиотекаКартинок.АктивироватьЗадачу);

ДвоичныеДанные2 = ПодготовитьКартинку(«image2», «image2.png», БиблиотекаКартинок.АктивныеПользователи);

Разделитель = «boundary»;

//устанавливаем заголовки основного сообщения

Заголовки = Новый Соответствие();

Заголовки.Вставить(«Content-Type», «multipart/form-data; boundary=» + Разделитель);

//формируем основное сообщение

ПотокВПамяти = Новый ПотокВПамяти();

ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);

ЗаписьДанных.ЗаписатьСтроку(«—«+Разделитель);

ЗаписьДанных.Записать(ДвоичныеДанные1);

ЗаписьДанных.ЗаписатьСтроку(«»);

ЗаписьДанных.ЗаписатьСтроку(«—«+Разделитель);

ЗаписьДанных.Записать(ДвоичныеДанные2);

ЗаписьДанных.ЗаписатьСтроку(«»);

ЗаписьДанных.ЗаписатьСтроку(«—» + Разделитель + «—«);

ЗаписьДанных.Закрыть();

ТелоЗапроса = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();

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

Соединение = Новый HTTPСоединение(«server.ru»,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос(«/script.php», Заголовки);

Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Сообщить(Ответ.ПолучитьТелоКакСтроку());

КонецПроцедуры

&НаКлиенте

Функция ПодготовитьКартинку(Название, ИмяФайла, Картинка)

Поток = Новый ПотокВПамяти();

ЗаписьДанных = Новый ЗаписьДанных(Поток);

//устанавливаем заголовки

ЗаписьДанных.ЗаписатьСтроку(«Content-Disposition: form-data; name=» + Название + «; filename=» + ИмяФайла);

ЗаписьДанных.ЗаписатьСтроку(«Content-Type: image/png»);

ЗаписьДанных.ЗаписатьСтроку(«»);

ЗаписьДанных.Записать(Картинка.ПолучитьДвоичныеДанные());

ЗаписьДанных.Закрыть();

Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();

КонецФункции

Полезные ссылки: о работе с HTTP в 1С,  о составных HTTP-сообщениях.

Результат:

Передача составного HTTP-сообщения

Передача составного HTTP-сообщения

На этом все, надеюсь, что эта статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

1

1C 8.x

Ошибка при вызове конструктора (ДвоичныеДанные)

28.10.2013, 10:26. Показов 19322. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Почему ошибка выдает
Ошибка при вызове конструктора (ДвоичныеДанные)
НовоеВложение.Хранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Каталог), Новый СжатиеДанных());
по причине:
Ошибка совместного доступа к файлу ‘C:\Users\ermakov\AppData\Local\Temp\price.xls’

1C
1
2
3
4
5
6
7
8
9
10
    
    НовоеВложение = Справочники.ВложенияЭлектронныхПисем.СоздатьЭлемент();
    НовоеВложение.Объект = Письмо.Ссылка;
    НовоеВложение.ИмяФайла = "price.xls";
    НовоеВложение.Хранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Каталог), Новый СжатиеДанных());
    Попытка
        НовоеВложение.Записать();
    Исключение
        Отказ = Истина;
    КонецПопытки;



0



Модератор

Эксперт 1С

3744 / 2932 / 581

Регистрация: 10.03.2011

Сообщений: 11,539

Записей в блоге: 1

28.10.2013, 11:19

2

Нужно закрывать файл перед помещением его в хранилищеЗначений



1



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

28.10.2013, 11:20

 [ТС]

3

Dethmontt, Подскажите на примере пожалуйста



0



Модератор

Эксперт 1С

3744 / 2932 / 581

Регистрация: 10.03.2011

Сообщений: 11,539

Записей в блоге: 1

28.10.2013, 11:26

4

На каком примере? У тебя тупо открыт этот файл — ‘C:\Users\ermakov\AppData\Local\Temp\price.xls’ либо висит в процессах

Добавлено через 4 минуты
Возможно ты его открываешь в коде…



0



Дорабатывал обработку загрузки прихода из Excel. Обработка изначально была не моя, все хорошо работало, но внезапно клиент в облаке переехал с файловой базы на SQL, потому что файловая тормозила.

И тут 1С начала писать, что файл не обнаружен. Оказывается, код загрузки из Excel был написан только под толстого клиента. Пришлось дорабатывать стандартным образом:

//На клиенте
ДД = Новый ДвоичныеДанные(ПолноеИмяФайла);//На сервере
ПолноеИмяФайла = ПолучитьИмяВременногоФайла(«XLS»);
ДД.Записать(ПолноеИмяФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПолноеИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);

Доработал и забыл. Как вдруг новая напасть — попросили доработать обработку, начинаю ее отлаживать, а она не считывает данные из XLSX файла.

Причем выдает ошибку доступа к временному файлу:

Я попробовал записывать во временный каталог, но это не принесло результата:

ТекКаталог = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ТекКаталог);
ПолноеИмяФайла = ТекКаталог + «\» + Новый УникальныйИдентификатор() + ТипФайла; //ПолучитьИмяВременногоФайла(«XLS»);ДД.Записать(ПолноеИмяФайла);Ф = Новый Файл(ПолноеИмяФайла);
Сообщить(ПолноеИмяФайла » Существует: » + Ф.Существует());ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПолноеИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); //, ТипФайлаТабличногоДокумента.ODS);

Причем 1С писала, что файл существует:

Тогда почему же она не может его считать? Задачу нужно было решить срочно, причем прикладную логику я уже сделал, а споткнулся на мелочи. Я уже было хотел перейти на локальный компьютер для разработки (тем более что на сервере из соображений быстродействия отключена отладка). Но тут мне пришла мысль впервые попробовать использовать не временные файлы, а потоки:

ПотокДанных = Новый ПотокВПамяти();
ЗаписьДД = Новый ЗаписьДанных(ПотокДанных);
ЗаписьДД.Записать(ДД);
ЗаписьДД.Закрыть();
ПотокДанных.Перейти(0, ПозицияВПотоке.Начало);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПотокДанных, СпособЧтенияЗначенийТабличногоДокумента.Текст, ТипФайлаТабличногоДокумента.ODS);
ПотокДанных.Закрыть();

Увы, при этом выдавалась все та же ошибка доступа. Кроме того, в документации я посмотрел, что из памяти можно считывать не все форматы, а только MXL и ODS. Бред, конечно, но такова 1С.

И тут до меня дошло попробовать поменять расширение на XLSX:

//на клиенте
ДД = Новый ДвоичныеДанные(ПолноеИмяФайла);
Ф = Новый Файл(ПолноеИмяФайла);
ТипФайла = Ф.Расширение);//на сервере
ТекКаталог = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ТекКаталог);
ПолноеИмяФайла = ТекКаталог + «\» + Новый УникальныйИдентификатор() + ТипФайла;
ДД.Записать(ПолноеИмяФайла);ДД = Новый ДвоичныеДанные(ПолноеИмяФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПолноеИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);

И всё заработало. У 1С, как обычно, беда с диагностикой ошибок. Она пишет совсем не ту ошибку, которая вызывает проблему. Доступ к файлу есть, просто формат файла 1С определяет по расширению, а не содержимому файла.

Время факт: 0,5 час. На поиски решения проблемы.

Понравилась статья? Поделить с друзьями:
  • Новый датчик кислорода выдает ошибку 0134
  • Новый военный атташе речевая ошибка
  • Новый взгляд на классификацию переводческих ошибок читать
  • Новый бизнес цветет ошибка
  • Новый comобъект excel application ошибка