18.07.22 — 12:37
Доброго дня!
при попытке записать двоичные данные пишет ошибку:
{ОбщаяФорма.ПечатьДокументов.Форма(1898)}: Ошибка при вызове конструктора (ДвоичныеДанные)
мФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
при этом в УНФ тот же код работает норм.
1 — 18.07.22 — 12:37
МассивСсылок = Параметры.ПараметрКоманды;
Если ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок) Тогда
МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок);
КонецЕсли;
ИмяФайла = ИмяТабдок + » » + СокрЛП(СтрЗаменить(МассивСсылок[0].Ссылка, «(не проведен)»,»»)) + «.PDF»;
КаталогВременныхФайлов = КаталогВременныхФайлов();
ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ИмяФайла);
ТабДок.Записать(ПолноеИмяФайла,»PDF»);
мФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);
2 — 18.07.22 — 12:38
ПолноеИмяФайла через отладчик показывает полный путь к файлу, сам файл создается
3 — 18.07.22 — 12:48
(2) «сам файл создается» — где именно в коде? Путь вижу, а создание файла нет
4 — 18.07.22 — 12:50
А тупанул, увидел
5 — 18.07.22 — 12:51
(3) я по пути смотрел, файл создается, т.е есть в каталоге
6 — 18.07.22 — 12:53
есть варианты, почему ошибку выдает ?
7 — 18.07.22 — 12:56
(6) Вообще должно быть не «ТабДок.Записать(ПолноеИмяФайла,»PDF»)»
а ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.PDF)
8 — 18.07.22 — 13:00
(7) переписал ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.PDF), ошибка та же
9 — 18.07.22 — 13:08
(6) Базы обе файловые?
10 — 18.07.22 — 13:09
(9) база серверная, но в УНФ работает и в серверном и в файловом варианте
11 — 18.07.22 — 13:10
в отладчике такую ошибку пишет:
Новый ДвоичныеДанные(ПолноеИмяФайла)
{<Неизвестный модуль>(1)}: Ошибка при вызове конструктора (ДвоичныеДанные)
12 — 18.07.22 — 13:11
(5) >> я по пути смотрел, файл создается, т.е есть в каталоге.
А ты в отладчике посмотри.
Что в переменной «ПолноеИмяФайла»?
13 — 18.07.22 — 13:11
(9) ТабДок.Записать непонятно как отрабатывает для разницы клиент-сервер
14 — 18.07.22 — 13:12
(12) ПолноеИмяФайла «E:TempUSR1CV8ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13:08:34.PDF» Строка
15 — 18.07.22 — 13:13
(14) попробуй тупую вещь
замени + «.PDF» на + «.pdf»
16 — 18.07.22 — 13:13
вот и ответ. Двоеточие запрещено в именах файла
17 — 18.07.22 — 13:14
+(16) а в УНФ возможно время убрано из представления документа
18 — 18.07.22 — 13:15
(17) похоже на то, в унф без времени записывается, сейчас проверю
19 — 18.07.22 — 13:15
(16) хмм почему не падает ТабДок.Записать( «E:TempUSR1CV8ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13:08:34.PDF») ?
20 — 18.07.22 — 13:16
(19) и файл создает?
21 — 18.07.22 — 13:16
(19) + он говорит что файл создается в каталоге
22 — 18.07.22 — 13:17
(20) (21) Вот это и интересно ))
23 — 18.07.22 — 13:19
И да.
Запрещенные символы в именах файлов/папок это кстати раздражает с точки зрения логики и удобства.
Это же дичайший маразм и архаизм.
24 — 18.07.22 — 13:19
(22) тут наверное нужно разбираться с версиями ОС и платформы… только непонятно зачем.
25 — 18.07.22 — 13:20
В случае линукс сталкивался с (15), когда расширение по дефолту маленькими буковками и имена файлов регистрозависимы
26 — 18.07.22 — 13:22
(23) всегда имена файлов нормализовалось перед записью. Ненавижу такие имена как выше у ТС.
27 — 18.07.22 — 13:27
(26) а чем не нравится, «ЗаказПоставщику» дублируется, это я поправлю
28 — 18.07.22 — 13:32
получилось, проблема была видимо в запрещенных символах.
благодарю
29 — 18.07.22 — 13:34
Пробелы в имени файла — копрокод
Точки в имени файла — копрокод
Форматзаписи датыф когда по нему нельзя отсортировать файлы по хронологии имени — копрокод*2
.
могу ошибаться, конечно, на вкус и цвет как говорится…
30 — 18.07.22 — 13:39
(29) сейчас выглядит как «Заказ поставщику 00000000001 от 18.07.2022.PDF», чем пробелы и точки помешали ?
31 — 18.07.22 — 13:54
(0) Зачем нагружать файловую систему? Сейчас такое делается через поток.
32 — 18.07.22 — 13:57
(19) Оно не просто не падает, а молча создаёт файл с именем «E:TempUSR1CV8ЗаказПоставщику Заказ поставщику 000001 от 18.07.2022 13» — обрезано по двоеточие, без расширения.
То же самое для объекта ТекстовыйДокумент. Вероятно, так же и для других, имеющих метод Записать. Проверено на 8.3.21.1302. Явный баг.
33 — 18.07.22 — 14:04
(31) записывается в присоединенные файлы, временные файлы удаляются
34 — 18.07.22 — 14:13
(33) Зачем записывать во временные файлы? Откройте СП и почитайте за метод Записать ТД и какие варианты есть там. Далее в том же СП посмотрите метод ЗакрытьИПолучитьДвоичныеДанные() У ПотокаВПамяти.
35 — 18.07.22 — 14:14
Все это можно провернуть в оперативке, чтобы дважды к файловой системе не обращаться.
36 — 18.07.22 — 14:17
(35) сделано уже, работает быстро. переделывать нет смысла. на будущее почитаю инфу про поток
37 — 18.07.22 — 14:20
(36) Если в упрощенно, то как-то так:
ПотокВПамяти=Новый ПотокВПамяти();
ТабДок.Записать(ПотокВПамяти,»pdf»);
ДД=ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
38 — 18.07.22 — 14:27
(37) Что будет если «pdf» размером больше ram ?
39 — 18.07.22 — 14:27
(38) Тогда нужно бежать из этой конторы)
40 — 18.07.22 — 14:40
(37) благодарю, сохраню в заметки
41 — 18.07.22 — 15:32
(38)начнет свопить на диск)
42 — 18.07.22 — 15:42
(26) Речь о том что нормализация имен файлов это глупость.
Банальный недостаток/недоработка файловой системы что нельзя любые символы применять.
Которое проистекает из древнейших времен наследия CP/M.
Например что имена переменных (и процедур/функций) в 1С нельзя начинать с цифры или они не могут содержать некоторых символов тоже атавизм.
Как и идиотизм с разделением Структура/Соответствие, которые прекрасно объединяются в одно.
Даже обращаться к свойствам можно было бы так Структура.»Имя свойства» что равнозначно Структура[«Имя свойства»]
43 — 18.07.22 — 15:44
(42)+ Подумайте. Имена файлов разрешают кириллицу и даже иероглифы. А вот «:» и слеши нельзя. Маразм!
44 — 18.07.22 — 16:26
(43) Это спец символы, которые используются в том же пути к файлу, что может породить кучу проблем, по этому они тупо запрещены, это разве не очивидно? ничего идиотского я в этом не вижу
45 — 18.07.22 — 16:36
(44) 1. «:» только одно после имени диска
если разрешили «.» и только последняя как разделитель имени и расширения а прочие разрешены и относятся к имени кто/что мешает тоже самое сделать с «:»?
самое первое после имени диска спецсимвол, прочие относятся к имени файла
2. «/» и «» прекрасно можно использовать в имени файла, просто автоматически при записи создает подкаталоги и все, при чтении пытается прочитать подкаталог
т.е. запись файла «c:блаблаблабла» создает файл «блабла» в каталоге «блабла» на диске c
46 — 18.07.22 — 16:57
(45) а если юзвер не хочет создавать папку и он тупо очепятался в имени папки? В вашем случае создастся еще одна и юзвер это не заметит. А если еще и регламент к изначальной папке прикручен?)
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. Показов 15265. Ответов 3 Метки нет (Все метки)
Почему ошибка выдает
__________________
0 |
Модератор 3700 / 2899 / 570 Регистрация: 10.03.2011 Сообщений: 11,414 Записей в блоге: 1 |
|
28.10.2013, 11:19 |
2 |
Нужно закрывать файл перед помещением его в хранилищеЗначений
1 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
28.10.2013, 11:20 [ТС] |
3 |
Dethmontt, Подскажите на примере пожалуйста
0 |
Модератор 3700 / 2899 / 570 Регистрация: 10.03.2011 Сообщений: 11,414 Записей в блоге: 1 |
|
28.10.2013, 11:26 |
4 |
На каком примере? У тебя тупо открыт этот файл — ‘C:UsersermakovAppDataLocalTempprice.xls’ либо висит в процессах Добавлено через 4 минуты
0 |
Пользователь 103705 Постоянный посетитель Сообщений: 145 |
#1876 31.05.2021 23:07:28
Судя по тому что 56к ску в битрикс — предположу что это виртуальный товар, которого нет на складе у Вас, тогда в таком случае я бы грузил только то, что заказывают, в противном случае в 1с будет тяжело работать с номенклатурой, с точки зрения производительности, любой поиск по номенклатуре это висяк |
||
Пользователь 3551394 Заглянувший Сообщений: 20 |
#1877 01.06.2021 09:01:29
это вина и прочий алкоголь. там почти все позиции есть на складе. пусть и по 2-3 штуки 8(( |
||||
#1878 01.06.2021 09:13:11 Не загружайте картинки — будет полегче идти. |
|
Пользователь 3551394 Заглянувший Сообщений: 20 |
#1879 07.06.2021 16:30:24
свойства — общие. картинки не грузятся. очень странно выглядит загрузка системы: то 60% процессора и половина памяти, а потом 3-5% процессора и 450 Мб памяти. |
||
#1880 19.07.2021 16:57:59 День добрый. 19.07.2021 16:40:12—Выгрузка данных о товарах. 19.07.2021 16:40:12—Выгрузка товаров в XML. 19.07.2021 16:40:12—{ОбщийМодуль.Б_ОбменССайтомСерверВыгрузкаДанных.Модуль(5524)}: Ошибка при вызове конструктора (ДвоичныеДанные): Каталог не обнаружен ‘\Server-1cвсе202101063b967bb6399df113fccabf240c0dcf3a_x.jpg’ Выгрузка файла объекта: Линейка 30 см металлическая и вываливается с ошибкой {ОбщийМодуль.Б_ОбменССайтомСерверВыгрузкаДанных.Модуль(5524)}: Ошибка при установке значения атрибута контекста (Наименование): Несоответствие типов XDTO: Ошибка проверки данных XDTO: Значение: ‘ Пользователь уволился и не признается что он там сделал. Экспорт настроек из бекапа в котором выгрузка работает и импорт на рабочую базу так же не дали успеха. Где можно еще посмотреть и сравнить настройки? 1С:Предприятие 8.3 (8.3.19.1150). Управление нашей фирмой, редакция 1.6 (1.6.25.139). Версия модуля 7,0,1,30 |
|
Александр Денисюк
Администратор Сообщений: 4928 |
#1881 19.07.2021 18:23:17
Смотрите товар » Линейка 30 см металлическая». Что то с картинками у него не то. По всей видимости несуществующий адрес до файлов(картинок). |
||
Пользователь 5230103 Заглянувший Сообщений: 15 |
#1882 21.07.2021 09:08:05
Там вообще нет картинки. Нажатие на кнопку «удалить» и подгрузка картинки тоже результатов не дает. положил по тому пути заглушку. посмотрим как это отработает. UPDATE Завершение выгрузки пакета 36 каталога: Каталог товаров |
||||
#1883 21.07.2021 09:18:57 Может из какого другого свойства или реквизита подтягивает в коде путь до картинки…Тут остается только гадать. Нужна отладка процесса обмена. Всем несогласным — мыло и веревка! |
|
Пользователь 5230103 Заглянувший Сообщений: 15 |
#1884 21.07.2021 10:00:13
Как это можно реализовать? В техническом журнале есть несколько записей: {ОбщийМодуль.ОбщегоНазначения.Модуль(5262)}: Выполнить ИмяМетода + «(» + ПараметрыСтрока + «)»; Затем куча пустого места и потом запись Ремень клиновой XРA — 1600» не соответствует простому типу: {urn:1C.ru:commerceml_3}НаименованиеТип Внешне в той номенклатуре все нормально. |
||
#1885 21.07.2021 11:38:42 Отдел ИТ,под отладкой я имел ввиду пошаговое выполнение код в процессе обмена с сайтом, можно даже в каталог на диске. А вообще перед самой отладкой смотреть, какие изменения были внесены в конфигурацию, чтобы примерно понимать, в каком месте искать проблему. В номенклатуре возможно все хорошо, а вот схема xdto ругается при проверке входных данных. Пригласите специалиста для анализа проблемы или при наличии собственных сил и знаний отлаживайте код. ========== У вас как-то странно выгружается данное наименование товара. Что это? Краткое, полное, описание, комментарий, доп. свойство, где есть текст Значение: «<куча пустого места, пробелы или переносы строк> Ремень клиновой XРA — 1600» Как раз ругается на длину в 250 символов. Либо код криво написан на выгрузку какого-то наименования, либо забито неверно информация в реквизите/доп.реквизите или свойстве… Всем несогласным — мыло и веревка! |
|
Пользователь 5230103 Заглянувший Сообщений: 15 |
#1886 21.07.2021 14:55:45
Разобрались с этой номенклатурой. В общем, в данной номенклатуре было в поле «наименование для печати» проставлено 470 пустых строк, а затем наименование. Когда открываешь эту номенклатуру, то соответственно данное поле кажется пустым, поэтому и не вызывала подозрений долгое время, пока не начали уже во все поля тыкать PS: почему в модуле обмена так плохо организовано логирование? Ведь будь вывод в лог, что в данной номенклатуре поле не соответствует длине, все было бы проще. И подозреваю, что первоначально линейка вовсе не причем — просто она последняя отображалась в логе. А из-за этого был потерян не один день времени |
||
#1887 23.07.2021 16:47:27 Еще вопрос… |
|
#1888 30.07.2021 17:37:52 Подскажите, кто знает почему при обмене с 1С все время перезаписывается поле Сортировка свойств инфоблока? Что нужно сделать чтобы это прекратилось? Конкретно речь об этом https://skr.sh/s9I1NFAWBXt свойстве — по факту это картинки из 1С |
|
Пользователь 3668772 Заглянувший Сообщений: 23 |
#1889 01.08.2021 05:09:10
На сколько знаю, обмен в старых модулях реализован полный т.е. грузятся не изменённые данные по товару, а абсолютно все передаваемые по товару данные. |
||||
#1890 03.08.2021 15:52:09 полная выгрузка оказывается не совсем полная. как провести абсолютно полную выгрузку? |
|
Пользователь 3668772 Заглянувший Сообщений: 23 |
#1891 04.08.2021 10:20:28
Под полной выгрузкой имеется в виду не выгрузка всего и вся, а выгрузка всех документов и значений которые подпадают под установленные Вами фильтры. Если Вы выгружаете определённые цены и определённую номенклатуру и её характеристики, то именно они будут иметься в полной выгрузке. Не при полной выгрузке, выгружаются только изменённые сущности. |
||
#1892 09.08.2021 15:36:55 Добрый день. Сайт 1С-Битрикс24: Интернет-магазин + CRM Версия платформы 1С: 8.3.18.1334 Тип базы 1С: Файловая |
|
#1893 18.08.2021 09:25:39 Добрый день, не можем разобраться с логикой работы (конфигурация УТ 11.4) |
|
Александр Денисюк
Администратор Сообщений: 4928 |
#1894 18.08.2021 11:30:04
может не установили маппинг служб доставки? И еще, может удаляться, если из 1С не выгружается отгрузка, т.к. в ней хранится стоимость доставки. |
||
#1895 25.08.2021 09:39:36 День добрый. Так и должно быть? |
|
#1896 16.09.2021 11:47:09 Добрый день! Подскажите пожалуйста, не появилась в модуле возможность выгружать из 1с индивидуальные соглашения по условиям продаж? |
|
Александр Денисюк
Администратор Сообщений: 4928 |
#1897 16.09.2021 18:11:38
Не появилось |
||
#1898 17.09.2021 12:32:34 Есть ли какие-нибудь новости по переходу на обмен через rest товарами а не xml файлами? Года 3 назад помню еще писали, что в работе. И планируется ли что-то делать с 2 каталогами в продукте интернет-магазин + CRM, хотелось бы работать без костылей и иметь красивую связь товаров + заказов. |
|
Александр Денисюк
Администратор Сообщений: 4928 |
#1899 17.09.2021 14:58:33
Больная тема… Реализация реста товаров все переносится и переносится.. |
||
-
Добрый день, стояло обновление 11.0.6.9 — никаких проблем не было, эмейлы с прикрепленными файлами отправлялись «на ура». Поставили обновление, теперь при попытке отправить файл выдает ошибку:
«{Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормаДокумента.Форма(1145)}: Ошибка при вызове конструктора (ДвоичныеДанные)
Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
по причине:
Каталог не обнаружен ‘e1cibtempstorage1ad61f76-7b88-49b2-babd-f27210c4292b'»
Что может быть такое? И как это лечить? Заранее спасибо. -
Offline
uza
1С, VBA (EXCEL), VB (.NET + WEB)- Регистрация:
- 10 июл 2007
- Сообщения:
- 1.845
- Симпатии:
- 1
- Баллы:
- 29
Смотрите что лежит в Стр.ИмяФайлаНаКомпьютере
и смотрите, есть ли этот каталог на компе. -
Дело в том, что каталога такого нет (я смотрел каталог в папке пользователя, в скрытой папке AppData), а Стр.ИмяФайлаНаКомпьютере — это просто строчка из Модуля Документ.ЭлектронноеПисьмоИсходящее.ФормаДокумента.Модуль — так что к чему эта надпись возникает — я вообще понять не могу, в конфе ничего не менялось с электронной почтой, да и до изменения всё работало.
Спасибо за ответ.
З.Ы.: Теперь просто выдает ошибку: «Каталог не обнаружен ‘e1cibtempstorageкучацифр — всегда разные. -
Ошибка вылетает в связи с тем, что 1С пытается сохранить файл, так как отправить файл хранящийся на диске — это без проблем, отправить просто письмо — тоже, а вот если попытаться отправить или сохранить вложение — то выдает ошибку и сохраняет письмо без вложения.
Раз никто не сталкивался, то скажите, у Вас после с обновлением работает отправка созданных документов? -
Offline
uza
1С, VBA (EXCEL), VB (.NET + WEB)- Регистрация:
- 10 июл 2007
- Сообщения:
- 1.845
- Симпатии:
- 1
- Баллы:
- 29
Про обновления не скажу — у нас другое.
А вот ошибка связанная с тем, что не уходит письмо с вложением вполне понятна.
Давайте посмотрим как 1С пытается отправить письмо с вложением
1) Создается файл вложения и сохраняется где то на диске (имеем путь к нему)
2) Создается письмо и заполняется его тело
3) Прикрепляется файл (ш.1)Так вот, Стр.ИмяФайлаНаКомпьютере — должно содержать имя файла размещенного на компе (ш.1), но по факту там лежит ересь.
Берем отладчик, и смотрим, в какой же момент эта самая ересь создается. Работы, оценочно — час — два посидеть над F11
-
Offline
Vladimir1C
Опытный в 1С- Регистрация:
- 19 июл 2010
- Сообщения:
- 106
- Симпатии:
- 0
- Баллы:
- 26
Поддерживаю тему. Не отправляются письма. Ошибка та же.
Нашлось решение?
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Код ошибки: 10094289
Дата публикации: 22 ноября 2011 г.
Описание: При отправке письма через легкую электронную почту письмо отправляется, но пользователю выводится сообщения о ошибке. -
Offline
Vladimir1C
Опытный в 1С- Регистрация:
- 19 июл 2010
- Сообщения:
- 106
- Симпатии:
- 0
- Баллы:
- 26
У нас даже не отправляется.
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Под рукой сейчас нет УТ, но, думаю, есть какая-то ошибка и туда попадает адрес временного хранилища (судя по тексту)
-
Письма то отправляются, то не отправляются, один раз даже отправилось со вложением. Но когда письма приходят — они без каких-либо реквизитов, ни от кого, ни куда, ни темы, ни письма.
З.Ы.: А разве легкая почта и почтовый клиент 1С — это одно и тоже? Мне казалось, что они сделали возможность отправки почты без использования почтового клиента и назвали это «легкой почтой», или я не прав? -
Offline
ZOOBR
- Регистрация:
- 12 дек 2011
- Сообщения:
- 2
- Симпатии:
- 0
- Баллы:
- 1
Ну совершенно верно так и должно быть у каждого с версией 11.0.7.8. Вообще скажу сразу, что функционал работы с почтой весьма убогий, это поймет каждый кто пройдется F11 от создания письма до его отправки, письмо отправляется долго.. Путём доработки скорость отправки писем можно увеличить в 3-10 раз. Кроме того данный глюк при работе с почтой в данном релизе не единственный. Если используется фоновое задание для получения и отправки почты вы еще натолкнётесь обязательно на конфликт блокировок при выполнении транзакций, ну да ладно вопрос не в этом был.
Относительно вашей проблемы можно происходит следующееДанные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере);
В данной строчке производится запись двоичных данных в переменную «Данные» из файла на диске, расположенному по пути содержащемся в переменной «Стр.ИмяФайлаНаКомпьютере». Естественно получается ошибка так как вместо пути к файлу в эту переменную запихнули ссылку на файл во временном хранилище. Решить данную проблему можно двумя путями.
1) Дописать модуль формы документа для возможности приёма ссылок на файлы из временного хранилища. Для этого модифицируйте код из модуля таким образом:Если ЭтоАдресВременногоХранилища(Стр.ИмяФайлаНаКомпьютере) Тогда Данные=ПолучитьИзВременногоХранилища(Стр.ИмяФайлаНаКомпьютере); Иначе Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере); Стр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, ""); КонецЕсли;
Тем самым мы определяем что если нам передали ссылку на файл во временном хранилище, то мы просто получаем из временного хранилища, а если это просто путь то тогда уже создаем и помещаем двоичные данные во временное хранилище.
Эта доработка уже позволит отправлять сообщения. Но останется еще одна небольшая проблемка. В письме для вложений не будет показана иконка приложения. Чтобы поправить эту досадную оплошность в строке 97 модуля формы документа «ИсходящееЭлектронноеПисьмо» нужно заменить следующий код:ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла);
вот таким кодом(пояснять уже не буду. :aua: ):
Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда ИмяФайла=Вложение.Представление; Иначе ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла); КонецЕсли;
После такой доработки иконки у файлов будут отображаться.
Но внимательно посмотрев на то что получилось замечаем еще один косяк, для таких вложений не отображается размер! Придётся и этот глюк побороть. Заменяем предидущий код следующим улучшенным:Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда ИмяФайла=Вложение.Представление; Данные=ПолучитьИзВременногоХранилища(Вложение.Значение); Если ТипЗнч(Данные)=Тип("ДвоичныеДанные") Тогда новСтр.Размер=Данные.Размер(); новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер); КонецЕсли; Иначе ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Вложение.Значение, "", ИмяФайла); Попытка Данные = Новый Файл(Вложение.Значение); новСтр.Размер= Данные.Размер(); новСтр.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(новСтр.Размер); Исключение КонецПопытки КонецЕсли;
Теперь размер будет отображаться, а также мы предусмотрели защиту от передачи в данную функцию некорректных данных о расположении файла.
2) Вторым способом предполагается добраться всё-таки до момента передачи параметров на форму документа и поправить передающуюся ссылку на путь к файлу во временной директории.
Насколько целесообразен данный способ решать каждому в индивидуальном порядке. На мой взгляд и первый и второй способ далеки от совершенства, но сууть не в этом а в том чтобы каждый решил подобную проблему с минимальными правками кода. Тем более что трешеделы из 1С когда-нибудь таки заделают эту дырку…
Чтобы реализовать данный способ лезем в общие формы и находим форму с названием «ПечатьДокументов», открываем модуль формы и заменяем процедуру «ПоместитьТабличныеДокументыВоВременноеХранилище» следующим содержимым:Процедура ПоместитьТабличныеДокументыВоВременноеХранилище(СписокФайлов, НастройкиСохранения) ЗаписьZipФайла = Неопределено; ИмяАрхива = Неопределено; Если НастройкиСохранения.ЗапаковатьZIP Тогда ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); КонецЕсли; СписокТипов = ПолучитьСписокТиповФайловТабличныхДокументов(НастройкиСохранения); ДатаПредставление = Формат(ТекущаяДата(), "ДФ='yyyyMMdd HH:mm'"); ИмяВременнойПапки = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяВременнойПапки); Для Каждого ТабДокумент Из ИменаТабДокументов Цикл ТабДок = ЭтаФорма["Таб" + ТабДокумент.Значение]; Для Каждого ТипФайла Из СписокТипов Цикл Если ОбъектыПечати.Количество() > 1 Тогда ИмяФайла = "[ИмяМакета] ([ДатаПредставление]).[Расширение]"; Иначе ИмяФайла = "[Документ] ([ИмяМакета] [ДатаПредставление]).[Расширение]"; КонецЕсли; ИмяФайла = СтрЗаменить(ИмяФайла, "[Документ]", Строка(ОбъектыПечати[0].Значение)); ИмяФайла = СтрЗаменить(ИмяФайла, "[ИмяМакета]", ТабДокумент.Представление); ИмяФайла = СтрЗаменить(ИмяФайла, "[ДатаПредставление]", ДатаПредставление); ИмяФайла = СтрЗаменить(ИмяФайла, "[Расширение]", ТипФайла.Представление); ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла); ИмяВременногоФайла = ИмяВременнойПапки + "" + ИмяФайла; ТабДок.Записать(ИмяВременногоФайла, ТипФайла.Значение); Если ТипФайла.Значение = ТипФайлаТабличногоДокумента.HTML Тогда ВставитьКартинкиВHTML(ИмяВременногоФайла); КонецЕсли; Если ЗаписьZipФайла <> Неопределено Тогда ЗаписьZipФайла.Добавить(ИмяВременногоФайла); Иначе //ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла); //ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор); СписокФайлов.Добавить(ИмяВременногоФайла, ИмяФайла); // УдалитьФайлы(ИмяВременногоФайла); КонецЕсли; КонецЦикла; КонецЦикла; Если ЗаписьZipФайла <> Неопределено Тогда ЗаписьZipФайла.Записать(); ФайлАрхива = Новый Файл(ИмяАрхива); //ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); //ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор); СписокФайлов.Добавить(ИмяАрхива, ФайлАрхива.Имя); КонецЕсли; //УдалитьФайлы(ИмяВременнойПапки); КонецПроцедуры
Кратко о том, что у нас изменилось. Мы убрали запихивание файла во временное хранилище, заменив на выходе ссылку во временное хранилище на путь к временному файлу. Чтобы в последующем воспользоваться созданными временными файлами было убрано удаление файлов, то есть удалять файлы нам придётся в дальнейшем после вложения в сообщение и записи. Для этого заново открываем модуль документа «ИсходящееЭлектронноеПисьмо» и модифицируем процедуру «ПередЗаписью» следующим образом:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ОчиститьСообщения(); Если Не ВыполняетсяОтправка Тогда Отказ = ПроверитьЗаполнениеСписковАдресатов(); Если Отказ = Истина Тогда Возврат; КонецЕсли; КонецЕсли; #Если Не ВебКлиент Тогда МассивКаталоговДляУдаления=Новый Массив(); //Перебираем вложения и после помещения во временное хранилище удаляем их Для Каждого Стр Из Вложения Цикл Если Стр.Расположение = 2 Тогда Если ЭтоАдресВременногоХранилища(Стр.ИмяФайлаНаКомпьютере) Тогда Данные=ПолучитьИзВременногоХранилища(Стр.ИмяФайлаНаКомпьютере); Иначе Данные = Новый ДвоичныеДанные(Стр.ИмяФайлаНаКомпьютере); КаталогДляУдаления=""; ФайлДляУдаления=""; ВзаимодействияКлиентСервер.ПолучитьКаталогИИмяФайла(Стр.ИмяФайлаНаКомпьютере, КаталогДляУдаления, ФайлДляУдаления); Стр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, ""); МассивКаталоговДляУдаления.Добавить(КаталогДляУдаления); УдалитьФайлы(Стр.ИмяФайлаНаКомпьютере); КонецЕсли; Стр.Расположение = 4; КонецЕсли; КонецЦикла; //Удаляем папки оставшиеся от временных файлов Для Каждого ФайлДляУдаления из МассивКаталоговДляУдаления Цикл ТекущийФайл=Новый Файл(ФайлДляУдаления); Если ТекущийФайл.Существует() Тогда УдалитьФайлы(ФайлДляУдаления); КонецЕсли; КонецЦикла; #КонецЕсли Объект.ЕстьВложения = (Вложения.Количество() <> 0); КонецПроцедуры
Здесь как видите мы оставляем доработки предложенные в первом варианте и дополняем их функционалом удаления временных файлов.. Далее разжевывать не буду, код и так предельно простой. Для отображения размеров вложений также необходимо применить доработку предложенную в первом варианте..
Сразу скажу что на этом список ваших проблем с почтой в УТ 11 только начинается. Думаю кому нибудь моя микростатейка поможет… Пока не забыл, если кто будет лазить по коду рекомендую обратить внимание на процедуру фонового задания для получения и отправки почты, там тоже имеются косяки… :angry:
-
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
Содержание
- Общая информация
- Двоичные данные
- Потоки
- Чтение и запись
- Практическая часть
- Двоичные данные
- Потоки
Общая информация
Если раньше, до версии технологической платформы 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, подробнее об этом можно прочесть тут.
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-сообщениях.
Результат:
На этом все, надеюсь, что эта статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Загрузка…