1с прочитать excel веб клиент

 0 

   

Распечатать

1С 8.2 УП : Импорт документа Excel через web-клиент

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

Решение состоит из двух функций: клиентской и серверной.

Клиентская часть инициирует выбор файла, передачу выбранного файла на сервер и передача управления серверной процедуре.

Код 1C v 8.2 УП

 #НаКлиенте
Процедура ИмпортИзВнешнегоФайла(Команда)
//Выбор и загрузка файла.
Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
УстановитьРасширениеРаботыСФайлами();
КонецЕсли;

Если ПодключитьРасширениеРаботыСФайлами() Тогда
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
Фильтр = "Текст(*.xls)|*.xls";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.Заголовок = "Выберите файл для импорта";
Если ДиалогОткрытияФайла.Выбрать() Тогда
Объект.МедицинскиеРаботники.Очистить();
ДанныеНачинаютсяС = 1;
Если Не ВвестиЧисло(ДанныеНачинаютсяС, "Данные начинаются со строки", 2, 0) Тогда
Возврат;
КонецЕсли;
МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
ПомещаемыеФайлы = Новый Массив;
Для Каждого Файл Из МассивФайлов Цикл
ТекФайл = Новый Файл(Файл);
Описание = Новый ОписаниеПередаваемогоФайла(Файл, "");
ПомещаемыеФайлы.Добавить(Описание);
КонецЦикла;

ПомещенныеФайлы = Новый Массив;

Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор) Тогда
//Запуск импорта
ИмпортироватьФайлИзВременногоХранилищаВТЗ(ПомещенныеФайлы, ДанныеНачинаютсяС);
КонецЕсли;
Иначе
Предупреждение("Файл(ы) не выбран!");
КонецЕсли;
Иначе
Предупреждение(НСтр("ru ='Данная возможность недоступна, так как не подключено расширение работы с файлами.'", "ru"));
КонецЕсли;
КонецПроцедуры //ИмпортИзВнешнегоФайла()

Серверная процедура перебирает полученные на сервер файлы. Получает COM-объекты и импортирует данные.

Код 1C v 8.2 УП

 #НаСервере
Процедура ИмпортироватьФайлИзВременногоХранилищаВТЗ(МассивФайлов, ДанныеНачинаютсяС)
ДокументОбъект = РеквизитФормыВЗначение("Объект");

//Обход файлов, записанных во временное хранилище
Для Каждого ЭлементМассива Из МассивФайлов Цикл
ФайлИзХранилища = ПолучитьИзВременногоХранилища(ЭлементМассива.Хранение);
ВременныйФайл = ПолучитьИмяВременногоФайла("xls");
//Сохранение во временнный файл на диске
ФайлИзХранилища.Записать(ВременныйФайл);

//Импорт
Док = ПолучитьCOMОбъект(ВременныйФайл);
ФИОУчастника = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 2).Value;
Пока СокрЛП(ФИОУчастника) ="" Цикл
// Добавление строки с файла в документ
НоваяСтрока = ДокументОбъект.МедицинскиеРаботники.Добавить();
НоваяСтрока.Фио = ФИОУчастника;
НоваяСтрока.Учреждение = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 7).Value;
НоваяСтрока.Адрес = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 3).Value;
НоваяСтрока.Телефон = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 4).Value;
НоваяСтрока.ЭлПочта = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 5).Value;
НоваяСтрока.Образование = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 6).Value;
ДанныеНачинаютсяС = ДанныеНачинаютсяС + 1;
ФИОУчастника = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 2).Value;
КонецЦикла;
Сообщить("Импорт завершён");
Док.Application.Quit();
КонецЦикла;
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры //ИмпортироватьФайлИзВременногоХранилищаВТЗ()

Источник

   Шахтер_с

24.04.20 — 11:38

Есть такой вопрос. Необходимо создать многостраничный файл excel.

Ньюанс, что это необходимо на вебклиенте.

Насколько это реализуемо?

В толстом клиенте без вопросов все работает.

Алгоритм таков:

-делаю несколько файлов в excel;

-потом их читаю и добавляю в один;

На вебклиенте проблемы такие:

-1.Всплывающие окна при первом проходе сохранения файлов.

ПолучитьФайл(АдресХранилища, ИмяФайла, Истина);

-2.Этап Как это можно сделать навебклиенте.

Рабочий код толстого клиента

    Попытка

        ДокЭксель = Новый COMОбъект(«Excel.Application»);

        ДокЭксель.DisplayAlerts=Ложь;

        ДокЭксель.visible = Ложь;

        ОбщаяКнига= ДокЭксель.WorkBooks.Add();

    Исключение

        Сообщить(«Ошибка. Возможно неверно указан номер листа книги Excel.»);

        Возврат ;

    КонецПопытки;

    УдалитьФайлы(Отчет.КаталогСохранения+»statistics.xls»);

    Попытка

        ОбщаяКнига.SaveAs(КаталогВременныхФайлов()+»statistics.xls»);

    Исключение

        Сообщить(ОписаниеОшибки()+» Файл не сохранен!»);

    КонецПопытки;

    ОбщаяКнига.close();

    
    ОбщаяКнига2=ДокЭксель.WorkBooks.Open(КаталогВременныхФайлов()+»statistics.xls»);

    Первый      = истина;

    ПрошлыйЛист = Неопределено;

    МассивПутейФайловXLS = НайтиФайлы(Отчет.РабочийКаталог,»*.xls»,Ложь);

    Для каждого ПутьКФайлуXLS Из МассивПутейФайловXLS Цикл

        ИмяЛиста=»»;

        Если ПутьКФайлуXLS.ИмяБезРасширения=»Итоговая» Тогда

            ИмяЛиста = «Total»;

        Иначе

            Продолжить;

        КонецЕсли;    

        Книга            = ДокЭксель.WorkBooks.Open(ПутьКФайлуXLS.ПолноеИмя);

        Книга.Worksheets(1).Cells.Select();

        ДокЭксель.Selection.Copy();

        Если Первый Тогда

            НовыйЛист =  ОбщаяКнига2.Worksheets(1);

            Первый = Ложь;

        Иначе    

            НовыйЛист = ОбщаяКнига2.Worksheets.Add(,ПрошлыйЛист);

        КонецЕсли;

        НовыйЛист.Paste();

        НовыйЛист.Activate();

        НовыйЛист.Name=ИмяЛиста;

        ДокЭксель.Range(«A1»).Select();

        ПрошлыйЛист = НовыйЛист;

        Книга.Close();

    КонецЦикла;

    ОбщаяКнига2.close();

    ДокЭксель.Quit();

    ДокЭксель = Неопределено;

   Garykom

1 — 24.04.20 — 11:47

(0) 1. На веб-клиенте требуется чтобы стоял плагин в браузере «Расширение для работы с 1С:Предприятием»

2. Нафик это делать на клиенте? На сервере делай.

   Шахтер_с

2 — 24.04.20 — 12:16

(1) Я в курсе. На сервер все работает.

Плагин при первом запуске у клиента устанавлюваю автоматически.

Наборка файлов по пункту 1 сохраняется.

Немогу собрать все страницы воедино на вебе)

Меня интересует этот гемор можно сделать навебклиенте, или сказать клиенту что это не решаемо?

   Cyberhawk

3 — 24.04.20 — 12:17

Если веб-клиент ИЕ, то там все еще есть СОМ-объекты )

   Шахтер_с

4 — 24.04.20 — 12:27

(3) Та я пробую сейчас на разных браузерах (firefox, ie,chrom, opera).

Наверное переделаю сейчас по другому. Пошла мысль)

Сделаю многостраничный таблдок на форме, а там пусть сохраняет и собирает.

   Garykom

5 — 24.04.20 — 12:34

(2) Так в чем проблема то сделать на сервере файлик экселя и отправить его на клиента и там сохранить куда нуна?

   Шахтер_с

6 — 24.04.20 — 18:53

Сейчас вопрос про comобъект.

Почему наклиенте comобъект отрабатывает, а на вебклиенте выдает ошибку отказано в доступе?

Какого ему доступа не хватает?

В вебклиенте через сервер обращаюсь к com

&НаСервере

Функция  ПоключитьсяКExcel(ИмяФайла)

    //ИмяФайла = Полный путь к файлу Excel

    Соотв = Новый Соответствие;

    Попытка

        Листы = Новый Массив;

        Excel = Новый COMОбъект(«Excel.Application»);//выбивает с ошибкой :ошибка при вызове конструктора() — отказано в доступе

        …

    Исключение

        Сообщить(«Ошибка создания обьекта Microsoft Excel» + ОписаниеОшибки());

        лРезультат = Неопределено;

    КонецПопытки;

    
    Возврат лРезультат;

КонецФункции

на клиенте без веба все работает



Попытка

        ДокЭксель = Новый COMОбъект(«Excel.Application»);

        ДокЭксель.DisplayAlerts=Ложь;

        ДокЭксель.visible = Ложь;

        ОбщаяКнига= ДокЭксель.WorkBooks.Add();

    Исключение

        Сообщить(«Ошибка. Возможно неверно указан номер листа книги Excel.»);

        Возврат ;

    КонецПопытки;

   Garykom

7 — 24.04.20 — 19:10

   arsik

8 — 24.04.20 — 19:41

(0) Все не читал, но нафига через COMОбъект(«Excel.Application»), если штатно все это можно через 1с-ный табличный документ сделать?

  

Сияющий в темноте

9 — 24.04.20 — 23:06

на Web-клиенте с excel можно подружиться через внешнюю компоненту,ну или через запуск excel из командной строки,по другому никак.

так что делать или на сервере или делать службу,к которой будет сервер обращаться и просить сделать ему документ ecxel.

Автор SitnovaMarina, 04 мар 2016, 13:19

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

Перерыла все, перепробовала многое — не получается :kmtu:. Надеюсь на вашу помощь!

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

Код для записи там такой

Результат.Записать(ФайлДанныхВыгрузки, ТипФайлаТабличногоДокумента.XLSX);

А мне нужно в этот файл еще дописать данные, но не выходит. Ругается на


ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = 0;
Книга = ExcelПриложение.WorkBooks.Open(ФайлДанныхВыгрузки);

Ошибка на вебе такая

https://yadi.sk/i/gujc8mDFpuR6w

Я понимаю, что веб-сервер не видит файлы на моем локальном компе, но как тогда? Типовая же сохранялка работает!

Буду признательна за любую помощь!

Народная мудрость: Программу встречают по интерфейсу


э-э-э, зачем так сложно?
вы формируете отчет и выводите в Ексель!
и еще хотите что-то добавить!
ЗАЧЕМ открывать Ексель?

ПЕРЕД сохранением отчета в Ексель, ДОБАВЬТЕ ТО ЧТО НАДО В ОТЧЕТ
(это табличный документ, очень легко с ним сделать все что надо в самой 1С) и ЗАТЕМ сохраняйте!!!

:befhbt:

и в этом случае ни какой Ексель вам не надо запоускать и ломать голову как с его помощью исправить/дополнить отчет!
вот блин любители все через Ж… Ексель делать! :D

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


Цитата: LexaK от 04 мар 2016, 14:20
э-э-э, зачем так сложно?
вы формируете отчет и выводите в Ексель!
и еще хотите что-то добавить!
ЗАЧЕМ открывать Ексель?

ПЕРЕД сохранением отчета в Ексель, ДОБАВЬТЕ ТО ЧТО НАДО В ОТЧЕТ
(это табличный документ, очень легко с ним сделать все что надо в самой 1С) и ЗАТЕМ сохраняйте!!!

:befhbt:

и в этом случае ни какой Ексель вам не надо запоускать и ломать голову как с его помощью исправить/дополнить отчет!
вот блин любители все через Ж… Ексель делать! :D

Спасибо, конечно. Но задача в том и состоит, чтобы в этот драный Ексель формулы вставить и красиво так что бы все выводилось! Про типовое сохранение я вкурсе :D

В любом случае спасибо! Извратилась, но сделала!:zebzdr:

Добавлено: 04 мар 2016, 16:00


ВОПРОС ЗАКРЫТ


&НаКлиенте
Процедура СохранитьВФайл(Команда)
ВХ = "";
ФайлДанныхВыгрузки = "";
ОООЗ = Новый ОписаниеОповещения("ЗаполняемФайл",ЭтотОбъект);
НачатьПомещениеФайла(ОООЗ,ВХ,ФайлДанныхВыгрузки,,УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполняемФайл(ФайлВыбран, ВХ, ФайлДанныхВыгрузки, ДопПараметры) Экспорт
Если ФайлВыбран Тогда
Результат.Записать(ФайлДанныхВыгрузки, ТипФайлаТабличногоДокумента.XLSX);
ИмяНаСервере= "";
ВХССервера = ДобавитьТаблицы(ВХ,ФайлДанныхВыгрузки, ИмяНаСервере);
ПолучитьФайл(ВХССервера,ФайлДанныхВыгрузки);
КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ДобавитьТаблицы(ВХ,ИмяНаКлиенте, ИмяНаСервере)
ИмяНаСервере = КаталогВременныхФайлов() + Новый УникальныйИдентификатор + ".xlsx";
ФайлМой = ПолучитьИзВременногоХранилища(ВХ);
ФайлМой.Записать(ИмяНаСервере);
ExcelПриложение = Новый COMОбъект("Excel.Application");

ExcelПриложение.Visible = 0;
Книга = ExcelПриложение.WorkBooks.Open(ИмяНаСервере);
Лист = Книга.WorkSheets(1);
Лист.UnProtect();

.......................
        .......................
        .......................

ExcelПриложение.DisplayAlerts = 0;
Книга.SaveAs(ИмяНаСервере);
ExcelПриложение.Quit();
ExcelПриложение.DisplayAlerts = 1;
ExcelПриложение = "";

ДвоичДанные = Новый ДвоичныеДанные(ИмяНаСервере);
Адрес = ПоместитьВоВременноеХранилище(ДвоичДанные, УникальныйИдентификатор);
Возврат Адрес;
КонецФункции

Народная мудрость: Программу встречают по интерфейсу


Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.

Содержание

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

В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.

Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456

  1. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
  2. Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”

Использование объекта ВременноеХранилище

Вспомогательные процедуры — диалог выбора файла

Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу

Чтение файла Excel. Диалог выбора файла

Создадим обработчик события НачалоВыбора:

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыбратьФайлНаКлиенте();
	
КонецПроцедуры

Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.

&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
	
	Перем Диалог;
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра = 0;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.МножественныйВыбор = Ложь; 
	РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
	Если РезультатВыбора <> Неопределено Тогда
		ПутьКФайлу = РезультатВыбора[0];
	КонецЕсли;
	
КонецПроцедуры

Двоичные данные во временное хранилище

Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.

Клиентский код:

  1. проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
  2. Получаем двоичные данные из файла по указанному пути
  3. Помещаем эти двоичные данные во временное хранилище
  4. Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)

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

Серверный код:

  1. Создаем временный файл с нужным расширением (в примере – xlsx)
  2. Получаем двоичные данные из временного хранилища
  3. Записываем во временный файл
  4. Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
  5. Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ

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

&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	ДД = ПолучитьИзВременногоХранилища(АдресВХ);
	ДД.Записать(ИмяВременногоФайла);

	Если Режим = "Текст" Тогда
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
	Иначе
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
	КонецЕсли;

	Попытка
		ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
	Исключение
	КонецПопытки;	
	
КонецПроцедуры

Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.

Помещение файла на сервер в 1С

Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения. 

Логика кода следующая:

  1. Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
  2. Указываем параметры диалога выбора файла и добавляем фильтр
  3. Вызываем помещение файла на сервер
  4. После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
	
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
	
КонецПроцедуры

Использование потока для чтения файла

В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.

В этом случае нам не понадобится создавать временный файл и следить за его корректным удалением. Код будет очень похож на прерыдущий пример. Мы также выбираем файл с использованием метода НачатьПомещениеФайлаНаСервер, но указываем другой фильтр. А в обработчике оповещения вызываем серверную процедуру ПрочитатьВПоток. В методе Прочитать() нам нужно явным образом указать тип файла табличного документа, который мы считываем.

&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)

ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";

НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);

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

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

АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);

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

&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)

ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();

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

Надеюсь, рассмотренные примеры помогут вам справиться с задачей передать файл с клиента на сервере и прочитать файл Excel в 1С.

Содержание

  1. Управляемый работа с excel на веб-клиенте
  2. Загрузка из excel веб-клиент 8.3.5
  3. Веб-клиент и Excel
  4. Открытие EXCEL в веб-клиенте
  5. Как прочитать файл Excel в 1С 8.3
  6. Содержание
  7. Общая информация
  8. Использование объекта ВременноеХранилище
  9. Вспомогательные процедуры — диалог выбора файла
  10. Двоичные данные во временное хранилище
  11. Помещение файла на сервер в 1С

Управляемый работа с excel на веб-клиенте

Есть такой вопрос. Необходимо создать многостраничный файл excel.
Ньюанс, что это необходимо на вебклиенте.
Насколько это реализуемо?
В толстом клиенте без вопросов все работает.
Алгоритм таков:
-делаю несколько файлов в excel;
-потом их читаю и добавляю в один;
На вебклиенте проблемы такие:
-1.Всплывающие окна при первом проходе сохранения файлов.
ПолучитьФайл(АдресХранилища, ИмяФайла, Истина);
-2.Этап Как это можно сделать навебклиенте.
Рабочий код толстого клиента
Попытка
ДокЭксель = Новый COMОбъект(«Excel.Application»);
ДокЭксель.DisplayAlerts=Ложь;
ДокЭксель.visible = Ложь;
ОбщаяКнига= ДокЭксель.WorkBooks.Add();
Исключение
Сообщить(«Ошибка. Возможно неверно указан номер листа книги Excel.»);
Возврат ;
КонецПопытки;
УдалитьФайлы(Отчет.КаталогСохранения+»statistics.xls»);
Попытка
ОбщаяКнига.SaveAs(КаталогВременныхФайлов()+»statistics.xls»);
Исключение
Сообщить(ОписаниеОшибки()+» Файл не сохранен!»);
КонецПопытки;
ОбщаяКнига.close();

ОбщаяКнига2=ДокЭксель.WorkBooks.Open(КаталогВременныхФайлов()+»statistics.xls»);
Первый = истина;
ПрошлыйЛист = Неопределено;
МассивПутейФайловXLS = НайтиФайлы(Отчет.РабочийКаталог,»*.xls»,Ложь);
Для каждого ПутьКФайлуXLS Из МассивПутейФайловXLS Цикл
ИмяЛиста=»»;
Если ПутьКФайлуXLS.ИмяБезРасширения=»Итоговая» Тогда
ИмяЛиста = «Total»;
Иначе
Продолжить;
КонецЕсли;
Книга = ДокЭксель.WorkBooks.Open(ПутьКФайлуXLS.ПолноеИмя);
Книга.Worksheets(1).Cells.Select();
ДокЭксель.Selection.Copy();
Если Первый Тогда
НовыйЛист = ОбщаяКнига2.Worksheets(1);
Первый = Ложь;
Иначе
НовыйЛист = ОбщаяКнига2.Worksheets.Add(,ПрошлыйЛист);
КонецЕсли;
НовыйЛист.Paste();
НовыйЛист.Activate();
НовыйЛист.Name=ИмяЛиста;
ДокЭксель.Range(«A1»).Select();
ПрошлыйЛист = НовыйЛист;
Книга.Close();
КонецЦикла;
ОбщаяКнига2.close();
ДокЭксель.Quit();
ДокЭксель = Неопределено;

(0) 1. На веб-клиенте требуется чтобы стоял плагин в браузере «Расширение для работы с 1С:Предприятием»

2. Нафик это делать на клиенте? На сервере делай.

Источник

Загрузка из excel веб-клиент 8.3.5

Люди, помогите, уже запарилась.
Надо из excel загрузить данные в табличную часть документа. Из формы дока пользователь выбирает файл у себя на клиенте и оттуда надо вытащить данные в ТЧ дока. Что не так делаю. Вылетает исключение — Ошибка записи данных файла.

Вот мой код после выбора файла пользователем

в данном случае на сервере.

Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода:
Таб = ПолучитьCOMОбъект(«C:DATADATA.XLS»);
создает объект Excel.Application и открывает с его помощью файл документа «C:DATADATA.XLS». Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода:
Таб = ПолучитьCOMОбъект(«», «Excel.Application»);
создает новый документ Excel. В дальнейшем этот документ может быть программно заполнен и сохранен в файл.
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , «Excel.Application»);
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
«

Второе — все большие работы лучше производить на сервере.

Источник

Веб-клиент и Excel

Ранее уже тема поднималась, но ответа так и не нашел:
&НаКлиенте
Процедура Загрузить(Команда)

НомерЛиста =1;
Колонка = 1;

Эксель = Новый COMОбъект(«Excel.Application»);
Эксель.Visible = 0;
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
Лист = Книга.WorkSheets(НомерЛиста);

Если Объект.СтрокаДоКоторойЗагружать = 999 Тогда
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Иначе
ВсегоСтрок = Объект.СтрокаДоКоторойЗагружать;
КонецЕсли;

ТабДокумент = Новый ТабличныйДокумент();
ТабДокумент = ПолучитьМакетНаСервере();

Для Строка = Объект.СтрокаСКоторойЗагружать по ВсегоСтрок Цикл

//И ВОТ ТУТ Я ВСТРЯЛ — не знаю что делать и как получить значение и правильно ли я делаю?
// //ТабДокумент.Вывести(ТабДокумент.ОбластьПробела);
// //Ячейка = СокрЛП(Лист.Cells(Строка,Колонка).Value);
// НоваяСтрока.НомерПП = СокрЛП(Лист.Cells(Строка,Колонка).Value);
// НоваяСтрока.ФИОПолучателя = СокрЛП(Лист.Cells(Строка,Колонка+1).Value);
// //ИндексОПС = СокрЛП(Лист.Cells(Строка,Колонка+2).Value);
// //АдресМестаНазначения = СокрЛП(Лист.Cells(Строка,Колонка+3).Value);
// //НомерШПИ = СокрЛП(Лист.Cells(Строка,Колонка+4).Value);
// //СуммаПрописью = СокрЛП(Лист.Cells(Строка,Колонка+6).Value);
// //
// //ТабДокумент.ОбластьМакета.Параметры.ФИОПолучателя = ФИОПолучателя;
// //ТабДокумент.ОбластьМакета.Параметры.ИндексОПС = ИндексОПС;
// //ТабДокумент.ОбластьМакета.Параметры.АдресМестаНазначения = АдресМестаНазначения;
// //ТабДокумент.ОбластьМакета.Параметры.НомерШПИ = НомерШПИ;
// //ТабДокумент.ОбластьМакета.Параметры.СуммаПрописью = ЧислоПрописью(СуммаПрописью, «L=ru_RU»);//, ПараметрПрописиНаКазахском);//ЧислоПрописью(СуммаПрописью, «L=kk_KZ», ПараметрПрописиНаКазахском);
// //
//
// //ТабДокумент.Вывести(ТабДокумент.ОбластьМакета);
// //ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

Эксель.Workbooks.Close();
Эксель.Quit();
Эксель = Неопределено;

ТабДокумент.Показать(«Печать по установленному шаблону»);

&НаСервере
Функция ПолучитьМакетНаСервере()

ТабДокумент = Новый ТабличныйДокумент();

Макет = Обработки.ПечатьПоШаблону.ПолучитьМакет(«ПечатьПоШаблону»);
ОбластьМакета = Макет.ПолучитьОбласть(«Шапка»);
ОбластьПробела = Макет.ПолучитьОбласть(«Пробел»);

ТабДокумент.ОтображатьСетку = Ложь;
ТабДокумент.ТолькоПросмотр = Истина;
ТабДокумент.ОтображатьЗаголовки = Ложь;

Источник

Открытие EXCEL в веб-клиенте

Доброго времени суток. Есть вот такая проблема.
Стоит задачи загрузки данных из внешнего EXCEL файла. Старая конфа работала на 8.1, сейчас решил переписать её на 8.2 в управляемом режиме.
Дано:
Сервер 1С:Предприятие 8.2.14 (ОС Win 2008 R2, Office 2010 x86, IIS 7)
Клиентская машина Win7 x 64, Firefox 5
В результате при попытке открыть EXCEL файл через веб-клиент (в платформе отрабатываются процедуры разрешения работы с файлами) получается зависание. В логах на сервере пишется следующее
Microsoft Excel
Приложению Microsoft Excel не удается получить доступ к файлу «C:Users1cAppDataLocalTempv8_5B49_9.xlsx». Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.

Файл проверялся и открывался в интерактивном режиме, другие программы его не трогают, пользователь из под которого запускается EXCEL имеет права локального админа.
Кто-нибудь сталкивался, подскажите пожалуйста в каком направлении копать?

(3) группировка во внешних источника, но если в СКД и отчеты — то там может и нормально.

В 8.2.14 смотри Внешние источники, добавь опиши поля, строку соединения и в списке смотри результат

Так видимо я совсем ламер. Группирповок нету вообще нигде, ни в коде ни в файле. Загрузка данных идет через обработку, передача файла на сервер выполняется следующим образом.

//Теперь передадим файл со списком на сервер
АдресХранилища = ПоместитьВоВременноеХранилище(СоздатьДвоичныеДанныеИзExcel(Объект.ФайлДанныхEXCEL));

//Процедура загружает данные из Excel, формирует таблицу и передает её на форму
//
&НаСервере
Процедура ЗагрузкаДанныхEXCELСервер(АдресХранилища)

ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«xlsx»);
//ИмяВременногоФайла = «C:1C_Deb1.xlsx»;

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

//Файл = ПолучитьCOMОбъект(Объект.ФайлДанныхEXCEL);
Файл = ПолучитьCOMОбъект(ИмяВременногоФайла);

Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Не удалось открыть EXCEL файл»;
Сообщение.Сообщить();

На сервере в процессах висит запущенный EXCEL, но ничего не происходит. Запись лога винды я привел в 1-ом посте, посмотрю, что такое внешние источники

Источник

Как прочитать файл Excel в 1С 8.3

Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.

Содержание

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

В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.

Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456

  1. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
  2. Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”

Использование объекта ВременноеХранилище

Вспомогательные процедуры — диалог выбора файла

Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу

Создадим обработчик события НачалоВыбора:

Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.

Двоичные данные во временное хранилище

Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.

  1. проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
  2. Получаем двоичные данные из файла по указанному пути
  3. Помещаем эти двоичные данные во временное хранилище
  4. Далее передаем на сервер адрес этого временного хранилища
  1. Создаем временный файл с нужным расширением (в примере – xlsx)
  2. Получаем двоичные данные из временного хранилища
  3. Записываем во временный файл
  4. Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
  5. Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ

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

Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.

Помещение файла на сервер в 1С

Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.

Логика кода следующая:

  1. Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
  2. Указываем параметры диалога выбора файла и добавляем фильтр
  3. Вызываем помещение файла на сервер
  4. После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.

Источник

Понравилась статья? Поделить с друзьями:
  • 1с внешняя печатная форма договора word
  • 1с внешняя печатная форма для управляемой формы word
  • 1с внешняя печатная форма word для зуп
  • 1с внешняя обработка печать word
  • 1с внешняя обработка выгрузка в excel