Имя: Пароль:
1C
 
Отправка файла csv UTF8 через POST-запрос
0 Сметанин
 
12.09.25
05:20
Доброе утро!
Делал на основе Передача файла и параметров методом POST

Подключение = Новый Структура ("HTTP, ЗаголовокHTTP, Адрес" );  
    Подключение.Адрес = Ресурс;
  
    HTTP = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL);
  
    Boundary = Строка(Новый УникальныйИдентификатор());
    МассивФайловДляОбъединения = Новый Массив;

    //Формируем начальный фрагмент файла POST-запроса
    ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь);
    //Определяем раздел двоичных данных  
    ФайлОтправкиНачало.ЗаписатьСтроку("--"+boundary);
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""format""");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.ЗаписатьСтроку("smsPersons");

    ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
    //Указываем имя файла для передачи      

    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайлаДляЗагрузки + """");
    //Указываем тип передаваемых данных.
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: text/csv");
    ФайлОтправкиНачало.ЗаписатьСтроку("");
    ФайлОтправкиНачало.Закрыть();

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);

    //Копируем файл для загрузки во временный и добавляем в массив файлов для объединения

    ИмяФайлаДляЗагрузкиВременный = ПолучитьИмяВременногоФайла("csv");
   КопироватьФайл(ИмяФайлаДляЗагрузки, ИмяФайлаДляЗагрузкиВременный);
   МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременный);
   //МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузки);

    //Формируем конечный фрагмент файла POST-запроса

    ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь);

    //Завершение раздела двоичных данных

   //ФайлОтправкиКонец.ЗаписатьСтроку("");
   ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary);
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--");
    ФайлОтправкиКонец.Закрыть();

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);

    //Теперь сформированные фрагменты сообщения для сервера объединяем в один файл POST-запроса

    ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);  
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
    Заголовки.Вставить("Authenticate", Токен);

    HHTPЗапрос = Новый HTTPЗапрос(Подключение.Адрес, Заголовки);
    HHTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);  

    HTTPОтвет = HTTP.ОтправитьДляОбработки(HHTPЗапрос);
   Сообщить(HTTPОтвет.КодСостояния);
    ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
    Сообщить(ТекстОтвета);

Сервер отдает ошибку {"troubles":["Отсутствует колонка \"ID\""]} (это первая колонка)
В файле отправки если смотреть его в кодировке utf-8 перед ID вставляется какой-то служебный символ ZWNBSP.
Если файл для загрузки перекодировать в ANSI и обратно в UTF-8 в Notepad++ то все успешно отправляется.
Подскажите пожалуйста что можно сделать?
1 vladmenleo
 
12.09.25
05:38
(0) Так может у файла отправки указать кодировку не КодировкаТекста.ANSI а КодировкаТекста.UTF8? В анси нет первых символов БОВ или добавляй вручную. По семерочному будет так Текст.ДобавитьСтроку(Симв(239) + Симв(187) + Симв(191) + "<?xml version=""1.0"" encoding=""utf-8""?>");
Соответственно переделай под 8.3
2 Сметанин
 
12.09.25
05:47
(1) Пробовал UTF8 для файла отправки, была ошибка 500. Символ ZWNBSP наоборот мешает. Почитал как убрать, пишут что это метка порядка байтов. В 1с управлять меткой можно только при записи файла из потока. Буду пробовать в этом направлении.
3 Сметанин
 
12.09.25
05:59
4 vladmenleo
 
12.09.25
06:07
(2) Мы работаем с купером и я выгружаю им остатки по складам. Тоже используется разделитель boundary. Долго бился, пока не навставлял лишних переводов строк, тогда заработало. Типа такого:
СтрокаДляОтправки = СтрокаДляОтправки + "Content-Type: application/xml" + Символы.ПС + Символы.ПС;
        СтрокаДляОтправки = СтрокаДляОтправки + СтрокаХМЛ;
        СтрокаДляОтправки = СтрокаДляОтправки + Символы.ПС + Символы.ПС + "--" + Боундари + "--" + Символы.ПС;
Попробуй лишних ПС навставлять и кодировка УТФ8
5 vladmenleo
 
12.09.25
06:10
(3) Вот оно че, Михалыч! :)