Имя: Пароль:
1C
1С v8
HTTP Сервис
0 MAPATNK2
 
naïve
27.07.16
12:40
Здравствуйте. Такой вопрос. Как мне сохранить результат запроса в файл в HTTP сервисе. Вот мой код, он не полный. Главное, чтобы была возможность сохранить файл.

Функция HardVen(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
    option  = ОбщегоНазначения.ПолучитьПараметры(Запрос.ПолучитьТелоКакСтроку());
    comment1  = ОбщегоНазначения.РаскодироватьСтрокуЭкспорта(option.Получить("comment1"));
    comment2  = ОбщегоНазначения.РаскодироватьСтрокуЭкспорта(option.Получить("comment2"));
    comment3  = ОбщегоНазначения.РаскодироватьСтрокуЭкспорта(option.Получить("comment3"));
    Если comment1 = "1"
        тогда
        Запрос1 = Новый Запрос;
        Запрос1.Текст =
        "ВЫБРАТЬ
        |    ЗаказПокупателя.Ссылка,
        |    ЗаказПокупателя.Номер,
        |    ЗаказПокупателя.Дата,
        |    ЗаказПокупателя.Проведен,
        |    ЗаказПокупателя.Ответственный.Наименование,
        |    ЗаказПокупателя.СуммаДокумента,
        |    ЗаказПокупателя.Контрагент.Наименование,
        |    ЗаказПокупателя.Гарантия
        |ИЗ
        |    Документ.ЗаказПокупателя КАК ЗаказПокупателя
        |ГДЕ
        |    ЗаказПокупателя.Номер = &Номер И
        |     ЗаказПокупателя.Контрагент.Код = &Код";
           z=comment2;
        a=comment3;
        Запрос1.УстановитьПараметр("Номер",z);
        Запрос1.УстановитьПараметр("Код",a);
        Резик=Запрос1.Выполнить().Выгрузить();
        СписокНоменклатуры1 = "";
    Для Каждого стр Из Резик Цикл
        СписокНоменклатуры1 = СписокНоменклатуры1+"<tr><td>"+стр.Номер+"</td></tr>";
    КонецЦикла;
    СтрокаВозврата= "<table border=""1"">"+СписокНоменклатуры1+"</table>";    
    ИначеЕсли   comment1 = "2"
    тогда
        Запрос1 = Новый Запрос;
        Запрос1.Текст =
          "ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ссылка,
        |    РеализацияТоваровУслуг.Номер,
        |    РеализацияТоваровУслуг.Дата,
        |    РеализацияТоваровУслуг.Проведен,
        |    РеализацияТоваровУслуг.Склад.Наименование,
        |    РеализацияТоваровУслуг.Ответственный.Наименование,
        |    РеализацияТоваровУслуг.СуммаДокумента
        |ИЗ
        |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |    РеализацияТоваровУслуг.Номер = &Номер И
        |     РеализацияТоваровУслуг.Контрагент.Код = &Код";
        a=comment3;
           z=comment2;
           Запрос1.УстановитьПараметр("Номер",z);
        Запрос1.УстановитьПараметр("Код",a);
        Резик=Запрос1.Выполнить().Выгрузить();
        СписокНоменклатуры2 = "";
        Для Каждого стр Из Резик Цикл
        СписокНоменклатуры2 = СписокНоменклатуры2+"<tr><td>"+стр.Номер+"</td></tr>";
    КонецЦикла;
    СтрокаВозврата= "<table border=""1"">"+СписокНоменклатуры2+"</table>";
    ИначеЕсли    comment1 = "3"
    ТОГДА
        Запрос1 = Новый Запрос;
        Запрос1.Текст =
          "ВЫБРАТЬ
          |    ОплатаОтПокупателяПлатежнойКартой.Ссылка,
          |    ОплатаОтПокупателяПлатежнойКартой.Дата,
          |    ОплатаОтПокупателяПлатежнойКартой.Номер,
          |    ОплатаОтПокупателяПлатежнойКартой.СуммаДокумента,
          |    ОплатаОтПокупателяПлатежнойКартой.Ответственный.Наименование
          |ИЗ
          |    Документ.ОплатаОтПокупателяПлатежнойКартой КАК ОплатаОтПокупателяПлатежнойКартой
          |ГДЕ
          |    ОплатаОтПокупателяПлатежнойКартой.Номер = &Номер И
        |     ОплатаОтПокупателяПлатежнойКартой.Контрагент.Код = &Код";
        a=comment3;
        z=comment2;
        Запрос1.УстановитьПараметр("Код",a);
           Запрос1.УстановитьПараметр("Номер",z);
        Резик=Запрос1.Выполнить().Выгрузить();
        СписокНоменклатуры3 = "";

        Для Каждого стр Из Резик Цикл
        СписокНоменклатуры3 = СписокНоменклатуры3+"<tr><td>"+стр.Номер+"</td></tr>";
    КонецЦикла;
    СтрокаВозврата= "<table border=""1"">"+СписокНоменклатуры3+"</table>";    
КонецЕсли;    

    //Таб = Новый ТаблицаЗначений;
    //Таб.Колонки.Добавить("Фрукт");
    //Таб.Колонки.Добавить("Овощи");
    //ТабДок1 = Новый ТабличныйДокумент;
    //Построитель = Новый ПостроительОтчета();
    //Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Таб);
    //Построитель.ВыводитьЗаголовокОтчета = Ложь;
    //Построитель.Вывести(ТабДок1);
    текФайл= новый ТекстовыйДокумент;
    текФайл.ВставитьСтроку(1,"Привет");
    ИмяФайла = "c:\test26.txt";
    текФайл.Записать(ИмяФайла);
    //ТабДок1.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS);
    //ЗапуститьПриложение(ИмяФайла);
    page = ОбщегоНазначения.ПолучитьШаблонСтраницы("Gone");
    Ответ.УстановитьТелоИзСтроки(page+СтрокаВозврата);    
    Возврат Ответ;

КонецФункции
1 MAPATNK2
 
naïve
27.07.16
12:41
Нужно, чтобы при нажатии на кнопку в браузере. Он сохранял документ на компьютер. Не важно какой. Как видно из кода я пытался сохранить и текстовый файл "привет". Подскажите как можно это сделать?
2 badboychik
 
27.07.16
13:03
надо заголовки установить правильные
3 MAPATNK2
 
naïve
27.07.16
13:03
(2) Всмысле? Где? Объясните подробней пожалуйста. Неделю голову ломаю.
4 badboychik
 
27.07.16
13:06
например "Content-Type: text/plain" если это текст
5 MAPATNK2
 
naïve
27.07.16
13:09
(4) Немножко не так поняли меня. Мне требуется в HTTP запросе сохранить документ в файл и отправить его по почте. К примеру я ввожу код контрагента, номер документа и тип, после чего нажимаю "отправить". Далее результат запроса с выбранными параметрами сохраняется в файл и отправляется по почте .
6 Amfiaray
 
27.07.16
13:23
(0) тебе надо в ответ отправить файл?
7 MAPATNK2
 
naïve
27.07.16
13:26
(6) КАк вариант Да.
8 Amfiaray
 
27.07.16
13:34
Я отправляю вот так:
HTTPОтвет = Новый HTTPСервисОтвет(200);
XMLТекст = Новый ЗаписьXML;
XMLТекст.УстановитьСтроку();
XMLТекст.ЗаписатьОбъявлениеXML();    
XMLТекст.ЗаписатьНачалоЭлемента("root");
Запрос = Новый Запрос;
Запрос.Текст = "";
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
    XMLТекст.ЗаписатьНачалоЭлемента("licevoy");    
    ВыборкаДеталей = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаДеталей.Следующий() Цикл
        XMLТекст.ЗаписатьНачалоЭлемента("usluga");    
        XMLТекст.ЗаписатьАтрибут("naim", СокрЛП(ВыборкаДеталей.Услуга));    
        XMLТекст.ЗаписатьАтрибут("post", ВыборкаДеталей.Поставщик);    
        XMLТекст.ЗаписатьАтрибут("saldo", СокрЛП(Формат(ВыборкаДеталей.Сумма, "ЧДЦ=2; ЧРГ=''")));
        XMLТекст.ЗаписатьКонецЭлемента();
    КонецЦикла;    
    XMLТекст.ЗаписатьКонецЭлемента();
КонецЦикла;    
XMLТекст.ЗаписатьКонецЭлемента();
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(XMLТекст.Закрыть());
ИмяВременногоФайла = "ПутьКФайлу_"+Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd")+".xml";
ТекстДок.Записать(ИмяВременногоФайла);
ИмяZIPФайла = " ПутьКФайлу _"+Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd")+".zip";
ЗаписьZIP = Новый ЗаписьZipФайла(ИмяZIPФайла);
ЗаписьZIP.Добавить(ИмяВременногоФайла);
ЗаписьZIP.Записать();
Ответ = Новый ДвоичныеДанные(ИмяZIPФайла);
HTTPОтвет.УстановитьТелоИзДвоичныхДанных(Ответ);
Возврат HTTPОтвет;
9 MAPATNK2
 
naïve
27.07.16
13:39
(8) Спасибо, попробую. Просто ТекстДок.Записать(ИмяВременногоФайла);
вот эта строка не работает в моем коде. Он просто не реагирует.
10 Amfiaray
 
27.07.16
13:44
А у пользователя под которым запускается 1с есть доступ в корень диска С:?
11 MAPATNK2
 
naïve
27.07.16
13:51
(10) Да есть.
12 MM
 
27.07.16
14:01
(11) База файловая или клиент сервер? Под каким пользователем ОС (с каким именем) выполняется код http-сервиса?
13 MAPATNK2
 
naïve
27.07.16
14:03
База Файловая. Все выполняется под именем администратора. Я тот же код во внешнюю обработку посылаю, там все сохраняется и отпраляется, а в сервисе не могу.
14 MAPATNK2
 
naïve
27.07.16
14:03
Может в моем коде проблема?
15 MAPATNK2
 
naïve
27.07.16
14:04
(8) Я не представляю как ваш метод к своему коду применить, только начинаю программировать. Уж извините за торможение.
16 Amfiaray
 
27.07.16
14:09
Попробуй так:
текФайл= новый ТекстовыйДокумент;
текФайл.ДобавитьСтроку(1,"Привет");
ИмяФайла = "c:\test26.txt";
текФайл.Записать(ИмяФайла);
HTTPОтвет = Новый HTTPСервисОтвет(200);
Ответ = Новый ДвоичныеДанные(ИмяФайла);
HTTPОтвет.УстановитьТелоИзДвоичныхДанных(Ответ);
Возврат HTTPОтвет;
17 MM
 
27.07.16
14:16
(13) На каком веб-сервере опубликован сервис? Подсказка для IIS при выполнении серверного кода 1С используется служебный пользователь с низкими правами.
18 MAPATNK2
 
naïve
27.07.16
14:17
(16) Пишет : {HTTPСервис.HHH.Модуль(141)}: Слишком много фактических параметров
19 MAPATNK2
 
naïve
27.07.16
14:18
(17) Апач
20 MAPATNK2
 
naïve
27.07.16
14:21
Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
    option  = ОбщегоНазначения.ПолучитьПараметры(Запрос.ПолучитьТелоКакСтроку());
    comment1  = ОбщегоНазначения.РаскодироватьСтрокуЭкспорта(option.Получить("comment1"));
    comment2  = ОбщегоНазначения.РаскодироватьСтрокуЭкспорта(option.Получить("comment2"));
    comment3  = ОбщегоНазначения.РаскодироватьСтрокуЭкспорта(option.Получить("comment3"));
Если
    т.д и т.п     
КонецЕсли;    

    текФайл= новый ТекстовыйДокумент;
    текФайл.ДобавитьСтроку(1,"Привет");
    ИмяФайла = "c:\test26.txt";
    текФайл.Записать(ИмяФайла);
    Ответ = Новый ДвоичныеДанные(ИмяФайла);
    Ответ.УстановитьТелоИзДвоичныхДанных(Ответ);
    Возврат Ответ;
21 MM
 
27.07.16
14:23
(19) Убедись, что у пользоваеля под которым запущен апач есть права на корень диска.
Система прав файловой системы начиная с висты сильно усложнилась.
Так что, попробуй создать файл test26.txt на рабочем столе, затем дай на него права группе Все (Everyone), а затем перемести (не скопируй) в корень диска С. Если запись в файл заработает, то дело в правах на файлы.
22 Amfiaray
 
27.07.16
14:31
текФайл= новый ТекстовыйДокумент;
текФайл.ДобавитьСтроку("Привет");
ИмяФайла = "c:\test26.txt";
текФайл.Записать(ИмяФайла);
Ответ = Новый ДвоичныеДанные(ИмяФайла);
Ответ.УстановитьТелоИзДвоичныхДанных(Ответ);
Возврат Ответ;
23 MAPATNK2
 
naïve
27.07.16
14:35
(22) {HTTPСервис.HHH.Модуль(146)}: Метод объекта не обнаружен (УстановитьТелоИзДвоичныхДанных)
24 MAPATNK2
 
naïve
27.07.16
14:37
Не думал, что сохранить файл так сложно.
25 MAPATNK2
 
naïve
27.07.16
14:37
(21) Все проверил. Все хорошо. Но ничего не сохраняется
26 Amfiaray
 
27.07.16
14:40
(23) Сори, когда копировал накосячил.
текФайл= новый ТекстовыйДокумент;
текФайл.ДобавитьСтроку(1,"Привет");
ИмяФайла = "c:\test26.txt";
текФайл.Записать(ИмяФайла);
HTTPОтвет = Новый HTTPСервисОтвет(200);
ОтветДД = Новый ДвоичныеДанные(ИмяФайла);
HTTPОтвет.УстановитьТелоИзДвоичныхДанных(ОтветДД);
Возврат HTTPОтвет;
27 Mauser
 
27.07.16
14:44
(26) все равно не взлетит.
Ошибка во второй строке.
28 MAPATNK2
 
naïve
27.07.16
14:45
(26) Та же ошибка.
29 MAPATNK2
 
naïve
27.07.16
14:48
(26) Он выдает в браузере. "Привет". Это немного не то, что нужно. XD
30 MAPATNK2
 
naïve
27.07.16
14:50
(26) исправил вторую строку. Все выгружает. Спасибо огромное!!!!!!!!!!!!!!!!!!!
31 MAPATNK2
 
naïve
27.07.16
14:51
Единственное.Как избавиться от того, что он выводит в браузере "Привет".