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

Ошибка при вызове конструктора (ДвоичныеДанные), Бухгалтерия 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,не работает-позор да и только.

  

Новый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,не работает-позор да и только.

Новый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. Показов 18986. Ответов 3

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


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

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

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

0

Модератор

Эксперт 1С

3724 / 2918 / 575

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

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

Записей в блоге: 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С

3724 / 2918 / 575

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

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

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

28.10.2013, 11:26

4

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

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

0

Не могу вызвать из временного хранилища, ошибка «Файл не обнаружен»

Автор maxxi, 26 сен 2022, 14:41

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

Есть xml-файл На сервере.(«E:projectcontr.xml»)

Из клиента запускаю регламентное задание:

Процедура ЗаписьДанныхНаСервере() Экспорт

        ЧтениеXML=Новый ЧтениеXML;

        ЧтениеXML.ОткрытьФайл(""E:projectcontr.xml"");

        Результат = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

            Для каждого Элемент Из Результат.ЭлементСправочника Цикл

                Если ТипЗнч(Элемент.Наименование) <> Тип("Строка") Тогда
            Продолжить
        КонецЕсли;

                        НайденнаяКарта = Справочники.ДисконтКарты.НайтиПоРеквизиту("Наменование", Число(Элемент.Наименование));
        //ЧтениеXML.ЗначениеАтрибута("УНП");
        //Справочники.Контрагенты.НайтиПоРеквизиту("Наименование", Число(ЧтениеXML.Наименование));
        Если НайденнаяКарта <> Неопределено Тогда
            Продолжить;
        КонецЕсли;

                НоваяКарта = Справочники.ДисконтКарты.СоздатьЭлемент();
        НоваяКарта.Наименование = Элемент.Наименование;
        НоваяКарта.Имя = Элемент.Имя;
        НоваяКарта.Фамилия = Элемент.Фамилия;
        НоваяКарта.ФИО = Элемент.ФИО;
        НоваяКарта.ПроцентКарта = Элемент.ПроцентКарта;
        НоваяКарта.СрокДействия = Элемент.СрокДействия;
        НоваяКарта.ДатаРегистрация = Элемент.ДатаРегистрация;
        НоваяКарта.Активный = Элемент.Активный;
        НоваяКарта.Адрес = Элемент.Адрес;
        НоваяКарта.ДатаРождения = Элемент.ДатаРождения;
        НоваяКарта.Активный = Элемент.Активный;
        НоваяКарта.Телефон = Элемент.Телефон;

        НоваяКарта.Записать();


Выдает ошибку:

{ОбщийМодуль.ОбщийМодуль1.Модуль(3)}: Ошибка при вызове конструктора (ДвоичныеДанные)
по причине:

по причине:
Файл не обнаружен 'E:projectcontr.xml'


Затем помести файлы в Временное Хранилище по коду:

Процедура ЗаписьДанныхНаСервере() Экспорт

        ДанныеФайла= Новый ДвоичныеДанные("E:projectcontr.xml");
    АдресДанных=ПоместитьВоВременноеХранилище(ДанныеФайла);

        Данные=ПолучитьИзВременногоХранилища(АдресДанных);
    ПутьКФайлуНаСервере=ПолучитьИмяВременногоФайла("xml");

        Данные.Записать(ПутьКФайлуНаСервере);

                ЧтениеXML=Новый ЧтениеXML;

        ЧтениеXML.ОткрытьФайл(ПутьКФайлуНаСервере);

        Результат = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

            Для каждого Элемент Из Результат.ЭлементСправочника Цикл

                Если ТипЗнч(Элемент.Наименование) <> Тип("Строка") Тогда
            Продолжить
        КонецЕсли;

                        НайденнаяКарта = Справочники.ДисконтКарты.НайтиПоРеквизиту("Наменование", Число(Элемент.Наименование));
        //ЧтениеXML.ЗначениеАтрибута("УНП");
        //Справочники.Контрагенты.НайтиПоРеквизиту("Наименование", Число(ЧтениеXML.Наименование));
        Если НайденнаяКарта <> Неопределено Тогда
            Продолжить;
        КонецЕсли;

                НоваяКарта = Справочники.ДисконтКарты.СоздатьЭлемент();
        НоваяКарта.Наименование = Элемент.Наименование;
        НоваяКарта.Имя = Элемент.Имя;
        НоваяКарта.Фамилия = Элемент.Фамилия;
        НоваяКарта.ФИО = Элемент.ФИО;
        НоваяКарта.ПроцентКарта = Элемент.ПроцентКарта;
        НоваяКарта.СрокДействия = Элемент.СрокДействия;
        НоваяКарта.ДатаРегистрация = Элемент.ДатаРегистрация;
        НоваяКарта.Активный = Элемент.Активный;
        НоваяКарта.Адрес = Элемент.Адрес;
        НоваяКарта.ДатаРождения = Элемент.ДатаРождения;
        НоваяКарта.Активный = Элемент.Активный;
        НоваяКарта.Телефон = Элемент.Телефон;

        НоваяКарта.Записать();

            КонецЦикла;
КонецПроцедуры

Все равно Выдает ошибку:

{ОбщийМодуль.ОбщийМодуль1.Модуль(3)}: Ошибка при вызове конструктора (ДвоичныеДанные)
по причине:

по причине:
Файл не обнаружен 'E:projectcontr.xml'

Подскажите пожалуйста, где допускаю ошибку.
Спасибо всем.


maxxi, может это, надо так, с такими кавычками

   ЧтениеXML.ОткрытьФайл("E:projectcontr.xml");

  • 1 пользователь сказал спасибо!

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



antoneus, Файловая система, а это серверная.


LexaK, это при копировании так получилось))


maxxi, еще раз, точнее проверьте имя файла! загружаете Дисконтные карты,
и файл называется contr.xml — очень похоже на Контрагентов!

  • 1 пользователь сказал спасибо!

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


Вообще, временное хранилище нужно, чтобы запулить данные с клиента на сервер, например. А то я не улавливаю логики: создаем двоичные данные из файла на сервере, кладем их в хранилище, тут же вытаскиваем, тут же на сервере их сохраняем во временный файл и открываем чтением xml. Ну странно как-то.

  • 1 пользователь сказал спасибо!

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

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


ручном режиме, без проблем находить эту папку и загружает.


прописала, путь такого вида:

\serverprojectcontr.xmlПока все норм.


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

Обновлено: 20.09.2023

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

Текст: «Ошибка при вызове конструктора (COMObject) по причине: -2147221005(0x800401F3): Недопустимая строка с указанием класса».

Решение — в регистрации библиотеки comcntr.dll из каталога программы для корректного вызова COMConnector.

Подготовительные действия

  • отключите службу Агента сервера 1С:Предприятия и программы, возможно использующие регистрируемую DLL;
  • если ранее использовалась библиотека устаревшей версии, удалите регистрацию comcntr.dll, запустив команду вызова regsvr32 с ключом /u.

Подходы к решению

В командной строке с правами Администратора выполните команду:

2. Переустановка платформы с внесением исправлений

  • запускаем консоль «Службы компонентов»;
  • добавляем новый элемент, переходим «Компьютеры» — «Мой компьютер» — из списка выбираем «Приложения COM+»;
  • выбираем «Создать» — «Приложение»;
  • в Мастере установки выбираем второй вариант «Создать новое приложение», в поле «Введите имя нового приложения:» вводим «V83COMConnector», «Способ активации» устанавливаем «Серверное приложение», нажимаем «Далее»;
  • выбираем учетную запись под которой запускается приложение, по умолчанию — «Текущий (вошедший в систему) пользователь»;
  • на этапах «Добавление ролей приложения» и «Добавление пользователей для ролей» нажимаем «Далее», а затем «Готово».

В ветке только что созданного приложения переходим в подветку «Компоненты» и создаем компонент:

  • в контекстном меню выбираем «Создать» — «Компонент»;
  • кликаем по первому варианту «Установка новых компонентов»;
  • в открывшемся диалоге выбираем необходимый файл comcntr.dll и нажимаем «Открыть»;
  • нажимаем «Далее» и «Готово».

Обратите внимание: после установки измените свойства объекта. Для этого переходим к ветке V83COMConnector:

  • открываем свойства созданного компонента, переходим в ветку V83COMConnector — «Свойства»;
  • на вкладке «Безопасность», в «Авторизация» снимаем флаг «Принудительная проверка доступа для приложений»;
  • в «Политика программных ограничений» устанавливаем флаг «Применить политику программных ограничений» и выбираем «Уровень ограничений:» — «Неограниченный»;
  • нажимаем «Применить» — «ОК».

Полная версия со снимками экранов — в статье на Дзен-канале.

Использование COMOбъектов в 1С это прошлый век, сейчас уже ни кто так не пишет. Раньше с его помощью реализовали печать документов. Они выгружались в Open\Libre Office и от туда уже печатались.

Появиться такая ошибка может после

1 Обновления платформы

2 Переустановки ОС и 1С

3 Обновление конфигурации

4 Проблем с офисными пакетами

Это самые распространенные.

Три способа избавиться от ошибки «Ошибка при вызове конструктора…»

И так после каких либо манипуляций с 1С у вас стала появляться ошибка.

Первый способ

Самое простое это переустановить офисные пакеты Open\Libre, так же как вариант если у вас стоял Open поставить Libre и на оборот. Это нужно для того чтобы обновить специальный компонент.

Второй способ

Попробовать зарегистрировать самостоятельно, для этого запускаем командную строку от имени администратора, переходим в каталог введя команду.

regsvr32 «C:\Program Files (x86)\1cv8\8.3.16.18.14\comcntr.dll»

Кстати данную манипуляцию нужно проводить на сервере.

Третий способ

Установить 32 битную версию клиента 1С, можно даже поверх х64. В итоге у вас появиться два ярлычка для запуска, один для х32 второй х64.

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

Версию можно указать и в ярлыке запуска 1С.

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

Так же проблема может быть непосредственно в самом коде.

Ошибка (COMOбъект) : 1 комментарий

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

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

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

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

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

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

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

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

Потоки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Анна Викулина

Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).

Объект сериализуется

Данный объект может быть сериализован в/из XML, может использоваться в реквизитах управляемой формы, а также он может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO может быть любым из перечисленных: base64Binary, hexBinary.

Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.

Задачи, для решения которых можно использовать двоичные данные:

Работа с двоичными данными:

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

Примеры по работе с двоичными данными

Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).

Заполнение:

Получение (фрагмент кода, выполняемый на сервере):

Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.

Рис.1 Скачивание картинки из интернета

Рис.1 Скачивание картинки из интернета

Функция, скачивающая картинку из интернета:

Использование функции:

Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».

Рис.2 Поле картинки

Рис.2 Поле картинки

По событию ПриСозданииНаСервере

Готово, на форме у нас картинка.

Двоичные данные и потоки

Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).

Последовательность действий при работе с двоичными данными без использования потоков:

  • Получить двоичные данные из базы;
  • Записать их во временный файл;
  • Разархивировать;
  • Удалить временный файл;
  • Прочитать разархивированный файл.

Последовательность действий при работе с потоками:

  • Получить двоичные данные из базы;
  • Открыть поток для чтения;
  • Разархивировать;
  • Прочитать разархивированный файл.

Пример кода без использования потоков:

Пример кода по работе с потоком:

Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.

Работа с Base64

Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.

строка в Base64

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

Они преобразуются в Base64 и обратно в двоичные данные.

Если у вас остались вопросы по работе с двоичными данными в среде 1С:Предприятие, обратитесь к нашим специалистам и получите консультацию по 1С 8.3 или воспользуйтесь услугами по сопровождению 1С.

Первое что нужно сделать, это запустить командную строку от имени администратора.

В командной строке Windows набираете cmd , в писке выбора появится программа с таким названием, устанавливаете курсор на эту программу и выбираете из контекстного меню «Запуск под администратором» (см. картинку ниже).

Запуск командной строки от имени администратора

Затем ввести команду (можно двумя способами):

1. regsvr32 «C:\Program Files (x86)\1cv8[ версия платформы ]\bin\comcntr.dll»

2. C:\Program Files (x86)\1cv8[ версия платформы ]\bin>regsvr32 comcntr.dll

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

командная строка

Для смены каталога нужно написать cd , после которого установить пробел, а затем указать тот путь, который нам нужен, например C :\ Program Files ( x 86)\1 cv 8[версия платформы]\ bin , затем после указания пути к каталогу нажимаете Enter . Смотрите пример смены каталога на картинке ниже.

смена каталога в cmd

Вот теперь рядом с каталогом можно ввести regsvr 32 comcntr . dll , нажать Enter и зарегистрировать компоненту (смотрите пример на картинке ниже).

запуск regsvr3

успешное выполнение регистрации компоненты comcntr.dll

Если компоненту не удалось зарегистрировать, проверьте как вы запустили командную строку, возможно, что забыли запустить от имени администратора. Если все в порядке, то нужно отключить службу агента сервера 1С:Предприятия и все программы, использующие эту DLL.

Читайте также:

      

  • Самолет из конструктора пластмассового
  •   

  • Знакомство с лего конспект урока
  •   

  • Как собрать авианосец из лего
  •   

  • Мстители lego на андроид
  •   

  • Лего формат вардек кухни

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

Ваша задача обычно решается таким кодом:

&НаКлиенте
Процедура ВыбратьФайл(Команда)

    НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
        "ОповещениеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект));

КонецПроцедуры // ВыбратьФайл()

&НаКлиенте
Процедура ОповещениеПодключенияРасширенияРаботыСФайлами(Подключено, 
    ДополнительныеПараметры) Экспорт

    Если Подключено Тогда

        Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        Диалог.Заголовок = НСтр("ru='Выберите файл загрузки в формате (*.xls, *.xlsx, *.xml, *.csv, *.txt)'");
        Диалог.ПолноеИмяФайла = "";
        Диалог.МножественныйВыбор = Ложь;
        Диалог.ПредварительныйПросмотр = Истина;
        Диалог.Фильтр = "Формат (*.xls;*.xlsx;*.xml;*.csv;*.txt)|*.xls;*.xlsx;*.xml;*.csv;*.txt|"; 
        Диалог.Показать(Новый ОписаниеОповещения("ОповещениеВыборФайла", ЭтотОбъект));

    Иначе

        // Сообщить что не удалось подключить расширение

    КонецЕсли;

КонецПроцедуры // ОповещениеПодключенияРасширенияРаботыСФайлами()

&НаКлиенте
Процедура ОповещениеВыборФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

    Если ВыбранныеФайлы = Неопределено Тогда
        Возврат;
    КонецЕсли;    

    Если ВыбранныеФайлы.Количество() = 1 Тогда

        НачатьПомещениеФайла(Новый ОписаниеОповещения("ОповещениеВыборФайлаНаСервере", ЭтотОбъект), 
            , // Можно указать строковой реквизит тогда адрес будет так же в этом реквизите 
            ВыбранныеФайлы[0], 
            Ложь, 
            УникальныйИдентификатор);

    Иначе
        // Сообщить что можно выбрать только один файл
    КонецЕсли;

КонецПроцедуры // ОповещениеВыборФайла() 

&НаСервере
Процедура ОповещениеВыборФайлаНаСервере(Результат, Адрес, ВыбранноеИмяФайла, 
    ДополнительныеПараметры) Экспорт

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

    ТекстовыйДокумент = Новый ТекстовыйДокумент();
    ТекстовыйДокумент.Прочитать(ПутьКФайлу);
    Содержимое = ТекстовыйДокумент.ПолучитьТекст();

    УдалитьФайлы(ПутьКФайлу);

КонецПроцедуры // ОповещениеВыборФайлаНаСервере() 

P.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.

Загрузка…

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • 1с вызвать ошибку принудительно
  • 1с вызвать сообщение об ошибке
  • 1с выдает ошибку формата потока что делать
  • 1с выдать сообщение пользователю об ошибке
  • 1с выдает ошибку определения касс доступных ккм

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: