Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 21:37

Экспорт запроса из 1с в Exele

Автор anonim1, 17 июн 2016, 19:10

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

anonim1

Добрый вечер.Помогите пожалуйста решить проблему. Необходимо сделать внешнюю обработку, которая осуществляет запрос на выборку данных из 1С83-УТ11 и выводит отчет в табличное поле формы и экспортирует в exel. Отчет должен содержать столбцы номер заказа, дата заказа, код товара, артикул, бренд, наименование, цена закупки, цена продажи, доставка, итого себестоимость. Я сделал внешнюю обработку, программный код которой:
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Попытка Эксель=Новый COMОбъект("Excel.Application")
      Исключение Сообщить(ОписаниеОшибки());
      КонецПопытки;
      Книга=Эксель.WorkBooks.Add();
      Лист=Книга.WorkSheets(1);
      
      Запрос=Новый Запрос;
      Запрос.Текст="ВЫБРАТЬ
                   |   ЗаказКлиента.Номер,
                   |   ЗаказКлиента.Дата,
                   |   Номенклатура.Артикул,
                   |   Номенклатура.Код,
                   |   Номенклатура.Наименование,
                   |   ЗаказКлиента.ЦенаВключаетНДС,
                   |   ВидыЦенПоставщиков.ЦенаВключаетНДС КАК ЦенаВключаетНДС1
                   |ИЗ
                   |   Документ.ЗаказКлиента КАК ЗаказКлиента,
                   |   Справочник.Номенклатура КАК Номенклатура,
                   |   Справочник.ВидыЦенПоставщиков КАК ВидыЦенПоставщиков" ;
    Выборка=Запрос.Выполнить().Выгрузить();
    ТабличноеПоле1.Очистить();
                Для Каждого Стр из Выборка Цикл
                   НоваяСтрока=ТабличноеПоле1.Добавить();
                   НоваяСтрока.НомерЗаказа=Стр.Номер;
                   НоваяСтрока.ДатаЗаказа=Стр.Дата;
                   НоваяСтрока.КодТовара=Стр.Код;
                   НоваяСтрока.Артикул=Стр.Артикул;
                   //НоваяСтрока.Бренд=Стр.
                   НоваяСтрока.Наименование=Стр.Наименование;
                   НоваяСтрока.ЦенаЗакупки=Стр.ЦенаВключаетНДС;
                   НоваяСтрока.ЦенаПродажи=Стр.ЦенаВключаетНДС1;
                   //НоваяСтрока.Доставка=Стр.
                   //НоваяСтрока.ИтогоСебестоимость=Стр.ЦенаЗакупки+Стр.Доставка;
КонецЦикла;
НомерСтроки=1;
               Для Каждого Строка Из ТабличноеПоле1 Цикл

Лист.Cells(НомерСтроки, 1).Value = Выборка.Номер;
Лист.Cells(НомерСтроки, 2).Value = Выборка.Дата;
Лист.Cells(НомерСтроки, 3).Value = Выборка.Код;
Лист.Cells(НомерСтроки, 4).Value = Выборка.Артикул;
//Лист.Cells(НомерСтроки, 5).Value = Выборка.Бренд;
Лист.Cells(НомерСтроки, 6).Value = Выборка.Наименование;
Лист.Cells(НомерСтроки, 7).Value = Выборка.ЦенаВключаетНДС;
Лист.Cells(НомерСтроки, 8).Value = Выборка.ЦенаВключаетНДС1;
//Лист.Cells(НомерСтроки, 9).Value = Выборка.Доставка;
//Лист.Cells(НомерСтроки, 10).Value = Выборка.ИтогоСебестоимость;

НомерСтроки=НомерСтроки+1;
КонецЦикла;               
диалог= новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

если диалог.Выбрать() тогда
               Попытка               
   Книга.SaveAs(диалог.ПолноеИмяФайла);
Исключение
   Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
КонецПопытки;
КонецЕсли;
Эксель.Application.Quit();

КонецПроцедуры
(Закоментированны те данные, которые я не смог найти в БД). При запуске внешней обработки появляется сообщение об ошибке Поле объекта не собнаруженно (Номер){Форма.Форма.Форма(40)}: Поле объекта не обнаружено (Номер)
Лист.Cells(НомерСтроки, 1).Value = Выборка.Номер;
Причем если закрыть сообщение об ошибке, поля дата заказа, артикул, наименование, цена выводятся в табличное поле, но диалог сохранения файла не открывается и файл эксель не создается , а если закомментировать (удалить) фрагмент программного кода, на который возникает ошибка, то диалог сохранения файла открывается и файл создаётся, но совершенно пустой и табличное поле обработки не заполняется. 

Luzer1C

Какой смысл в ТабличноеПоле1?
Когда можно сразу написать: Выборка = Запрос.Выполнить().Выбрать();
А затем:
Пока Выборка.Следующий() Цикл
Лист.Cells(НомерСтроки, 1).Value = Выборка.Номер;
... и пошел файлик эксель заполнять.
Халамбалам.

anonim1

Благодарю за ответ, исправил как вы посоветовали, правда пришлось удалить табличное поле, но, в принципе, оно не обязательно нужно. Но возникла другая проблема, при нажатии на кнопку "выполнить" почему то программа (внешняя обработка) зависает:
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Попытка Эксель=Новый COMОбъект("Excel.Application")
      Исключение Сообщить(ОписаниеОшибки());
      КонецПопытки;
      Книга=Эксель.WorkBooks.Add();
      Лист=Книга.WorkSheets(1);
      
      Запрос=Новый Запрос;
      Запрос.Текст="ВЫБРАТЬ
                   |   ЗаказКлиента.Номер,
                   |   ЗаказКлиента.Дата,
                   |   Номенклатура.Артикул,
                   |   Номенклатура.Код,
                   |   Номенклатура.Наименование,
                   |   ЗаказКлиента.ЦенаВключаетНДС,
                   |   ВидыЦенПоставщиков.ЦенаВключаетНДС КАК ЦенаВключаетНДС1
                   |ИЗ
                   |   Документ.ЗаказКлиента КАК ЗаказКлиента,
                   |   Справочник.Номенклатура КАК Номенклатура,
                   |   Справочник.ВидыЦенПоставщиков КАК ВидыЦенПоставщиков" ;
Выборка = Запрос.Выполнить().Выбрать();
     НомерСтроки=1;   
Пока Выборка.Следующий() Цикл
Лист.Cells(НомерСтроки, 1).Value =Выборка.Номер;
Лист.Cells(НомерСтроки, 2).Value =Выборка.Дата;
Лист.Cells(НомерСтроки, 3).Value =Выборка.Код;
Лист.Cells(НомерСтроки, 4).Value =Выборка.Артикул;
//Лист.Cells(НомерСтроки, 5).Value = Выборка.Бренд;
Лист.Cells(НомерСтроки, 6).Value =Выборка.Наименование;
Лист.Cells(НомерСтроки, 7).Value =Выборка.ЦенаВключаетНДС;
Лист.Cells(НомерСтроки, 8).Value =Выборка.ЦенаВключаетНДС1;
//Лист.Cells(НомерСтроки, 9).Value = Выборка.Доставка;
//Лист.Cells(НомерСтроки, 10).Value = Выборка.ИтогоСебестоимость;
НомерСтроки=НомерСтроки+1;
КонецЦикла;               
диалог= новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

если диалог.Выбрать() тогда
               Попытка               
   Книга.SaveAs(диалог.ПолноеИмяФайла);
Исключение
   Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
КонецПопытки;
Эксель.Application.Quit();
КонецЕсли;
КонецПроцедуры
Подскажите пожалуйста, может что то не так с циклом?

Rasty

вы выбираете каждому документ каждую номенклатура т.е.
документ1 номенклатура 1
документ1 номенклатура 2
....
....
....
....
документ1 номенклатура n
документ2 номенклатура 1
....
....
....
Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

Luzer1C

Для наглядности можно прописать так:
ВсегоВыборка = Выборка.Количество();
Пока Выборка.Следующий() Цикл
Состояние(Строка(НомерСтроки) + "/" + Строка(ВсегоВыборка));

И сидеть наблюдать как увеличивается счетчик.
Халамбалам.

anonim1

Благодарю за помощь, в обычном приложении работает, но подскажите пожалуйста, можно как то сделать так, чтобы этот код работал в управляемом приложении. Пробовал переделать разными способами:
1 способ:
&НаКлиенте

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

&НаСервере
Процедура ОткрытьФайл()
Попытка Эксель=Новый COMОбъект("Excel.Application")
      Исключение Сообщить(ОписаниеОшибки());
      КонецПопытки;
      Книга=Эксель.WorkBooks.Add();
      Лист=Книга.WorkSheets(1);
      
      Запрос=Новый Запрос;
      Запрос.Текст="ВЫБРАТЬ
                   |   ЗаказКлиента.Номер,
                   |   ЗаказКлиента.Дата,
                   |   Номенклатура.Артикул,
                   |   Номенклатура.Код,
                   |   Номенклатура.Наименование,
                   |   ВидыЦенПоставщиков.ЦенаВключаетНДС КАК ЦенаВключаетНДС1,
                   |   ЗаказКлиента.СуммаДокумента
                   |ИЗ
                   |   Документ.ЗаказКлиента КАК ЗаказКлиента,
                   |   Справочник.Номенклатура КАК Номенклатура,
                   |   Справочник.ВидыЦенПоставщиков КАК ВидыЦенПоставщиков" ;
Выборка = Запрос.Выполнить().Выбрать();
     НомерСтроки=1;   
ВсегоВыборка = Выборка.Количество();
Пока Выборка.Следующий() Цикл
Состояние(Строка(НомерСтроки) + "/" + Строка(ВсегоВыборка));
Лист.Cells(НомерСтроки, 1).Value =Выборка.Номер;
Лист.Cells(НомерСтроки, 2).Value =Выборка.Дата;
Лист.Cells(НомерСтроки, 3).Value =Выборка.Код;
Лист.Cells(НомерСтроки, 4).Value =Выборка.Артикул;
//Лист.Cells(НомерСтроки, 5).Value = Выборка.Бренд;
Лист.Cells(НомерСтроки, 6).Value =Выборка.Наименование;
Лист.Cells(НомерСтроки, 7).Value =Выборка.ЦенаВключаетНДС1;
Лист.Cells(НомерСтроки, 8).Value =Выборка.СуммаДокумента;
//Лист.Cells(НомерСтроки, 9).Value = Выборка.Доставка;
//Лист.Cells(НомерСтроки, 10).Value = Выборка.ИтогоСебестоимость;
НомерСтроки=НомерСтроки+1;
КонецЦикла;   


диалог= новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

если диалог.Выбрать() тогда
               Попытка               
   Книга.SaveAs(диалог.ПолноеИмяФайла);
Исключение
   Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
КонецПопытки;
Эксель.Application.Quit();
КонецЕсли;
КонецПроцедуры
Появляется ошибка Тип не определен (ДиалогВыбораФайла)
диалог= новый <<?>>ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); (Проверка: Сервер)
затем пробовал 2 м способом:
&НаКлиенте

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

&НаСервере
Процедура ОткрытьФайл()
      
      Запрос=Новый Запрос;
      Запрос.Текст="ВЫБРАТЬ
                   |   ЗаказКлиента.Номер,
                   |   ЗаказКлиента.Дата,
                   |   Номенклатура.Артикул,
                   |   Номенклатура.Код,
                   |   Номенклатура.Наименование,
                   |   ВидыЦенПоставщиков.ЦенаВключаетНДС КАК ЦенаВключаетНДС1,
                   |   ЗаказКлиента.СуммаДокумента
                   |ИЗ
                   |   Документ.ЗаказКлиента КАК ЗаказКлиента,
                   |   Справочник.Номенклатура КАК Номенклатура,
                   |   Справочник.ВидыЦенПоставщиков КАК ВидыЦенПоставщиков" ;
Выборка = Запрос.Выполнить().Выбрать();

Таблица.Очистить();
                Для Каждого Стр из Выборка Цикл
                   НоваяСтрока=ТабличноеПоле1.Добавить();
                   НоваяСтрока.НомерЗаказа=Стр.Номер;
                   НоваяСтрока.ДатаЗаказа=Стр.Дата;
                   НоваяСтрока.КодТовара=Стр.Код;
                   НоваяСтрока.Артикул=Стр.Артикул;
                   //НоваяСтрока.Бренд=Стр.
                   НоваяСтрока.Наименование=Стр.Наименование;
                   НоваяСтрока.ЦенаЗакупки=Стр.СуммаДокумента;
                   НоваяСтрока.ЦенаПродажи=Стр.ЦенаВключаетНДС1;
                   //НоваяСтрока.Доставка=Стр.
                   //НоваяСтрока.ИтогоСебестоимость=Стр.ЦенаЗакупки+Стр.Доставка;
КонецЦикла;

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


&НаКлиенте

Процедура СохранениеФайла(Элемент, ДанныеВыбора, СтандартнаяОбработка) 
   СохранитьФайлВExele(Команда)
КонецПроцедуры


&НаСервере

Процедура СохранитьФайлВExele()
   Попытка Эксель=Новый COMОбъект("Excel.Application")
      Исключение Сообщить(ОписаниеОшибки());
      КонецПопытки;
      Книга=Эксель.WorkBooks.Add();
      Лист=Книга.WorkSheets(1);

       НомерСтроки=1;   
ВсегоВыборка = Выборка.Количество();
Пока Выборка.Следующий() Цикл
Состояние(Строка(НомерСтроки) + "/" + Строка(ВсегоВыборка));
Лист.Cells(НомерСтроки, 1).Value =Выборка.Номер;
Лист.Cells(НомерСтроки, 2).Value =Выборка.Дата;
Лист.Cells(НомерСтроки, 3).Value =Выборка.Код;
Лист.Cells(НомерСтроки, 4).Value =Выборка.Артикул;
//Лист.Cells(НомерСтроки, 5).Value = Выборка.Бренд;
Лист.Cells(НомерСтроки, 6).Value =Выборка.Наименование;
Лист.Cells(НомерСтроки, 7).Value =Выборка.ЦенаВключаетНДС1;
Лист.Cells(НомерСтроки, 8).Value =Выборка.СуммаДокумента;
//Лист.Cells(НомерСтроки, 9).Value = Выборка.Доставка;
//Лист.Cells(НомерСтроки, 10).Value = Выборка.ИтогоСебестоимость;
НомерСтроки=НомерСтроки+1;
КонецЦикла;   

диалог= новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

если диалог.Выбрать() тогда
               Попытка               
   Книга.SaveAs(диалог.ПолноеИмяФайла);
Исключение
   Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
КонецПопытки;
Эксель.Application.Quit();
КонецЕсли;
   
КонецПроцедуры
Появляется ошибка  Тип не определен (ДиалогВыбораФайла)

Rasty

файл выбирается на клиенте, а не на сервере
Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

anonim1

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск