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();
ДокЭксель = Неопределено;
1 — 24.04.20 — 11:47
(0) 1. На веб-клиенте требуется чтобы стоял плагин в браузере «Расширение для работы с 1С:Предприятием»
2. Нафик это делать на клиенте? На сервере делай.
2 — 24.04.20 — 12:16
(1) Я в курсе. На сервер все работает.
Плагин при первом запуске у клиента устанавлюваю автоматически.
Наборка файлов по пункту 1 сохраняется.
Немогу собрать все страницы воедино на вебе)
Меня интересует этот гемор можно сделать навебклиенте, или сказать клиенту что это не решаемо?
3 — 24.04.20 — 12:17
Если веб-клиент ИЕ, то там все еще есть СОМ-объекты )
4 — 24.04.20 — 12:27
(3) Та я пробую сейчас на разных браузерах (firefox, ie,chrom, opera).
Наверное переделаю сейчас по другому. Пошла мысль)
Сделаю многостраничный таблдок на форме, а там пусть сохраняет и собирает.
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.»);
Возврат ;
КонецПопытки;
…
7 — 24.04.20 — 19:10
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 гость просматривают эту тему.
Перерыла все, перепробовала многое — не получается . Надеюсь на вашу помощь!
Есть в облаке 1Сина, и есть внешний отчет. После формирования отчета, пользователь нажимает на кнопочку на форме и отчет сохраняется на локальный компьютер пользователя в формате .xlsx.
Код для записи там такой
Результат.Записать(ФайлДанныхВыгрузки, ТипФайлаТабличногоДокумента.XLSX);
А мне нужно в этот файл еще дописать данные, но не выходит. Ругается на
ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = 0;
Книга = ExcelПриложение.WorkBooks.Open(ФайлДанныхВыгрузки);
Ошибка на вебе такая
https://yadi.sk/i/gujc8mDFpuR6w
Я понимаю, что веб-сервер не видит файлы на моем локальном компе, но как тогда? Типовая же сохранялка работает!
Буду признательна за любую помощь!
Народная мудрость: Программу встречают по интерфейсу
э-э-э, зачем так сложно?
вы формируете отчет и выводите в Ексель!
и еще хотите что-то добавить!
ЗАЧЕМ открывать Ексель?
ПЕРЕД сохранением отчета в Ексель, ДОБАВЬТЕ ТО ЧТО НАДО В ОТЧЕТ
(это табличный документ, очень легко с ним сделать все что надо в самой 1С) и ЗАТЕМ сохраняйте!!!
и в этом случае ни какой Ексель вам не надо запоускать и ломать голову как с его помощью исправить/дополнить отчет!
вот блин любители все через Ж… Ексель делать!
если помогло нажмите: Спасибо!
Цитата: LexaK от 04 мар 2016, 14:20
э-э-э, зачем так сложно?
вы формируете отчет и выводите в Ексель!
и еще хотите что-то добавить!
ЗАЧЕМ открывать Ексель?ПЕРЕД сохранением отчета в Ексель, ДОБАВЬТЕ ТО ЧТО НАДО В ОТЧЕТ
(это табличный документ, очень легко с ним сделать все что надо в самой 1С) и ЗАТЕМ сохраняйте!!!и в этом случае ни какой Ексель вам не надо запоускать и ломать голову как с его помощью исправить/дополнить отчет!
вот блин любители все через Ж… Ексель делать!
Спасибо, конечно. Но задача в том и состоит, чтобы в этот драный Ексель формулы вставить и красиво так что бы все выводилось! Про типовое сохранение я вкурсе
В любом случае спасибо! Извратилась, но сделала!: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С будет прочитано исходное значение 123,456
- Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”
Использование объекта ВременноеХранилище
Вспомогательные процедуры — диалог выбора файла
Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу
Создадим обработчик события НачалоВыбора:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВыбратьФайлНаКлиенте();
КонецПроцедуры
Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.
&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
Перем Диалог;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.МножественныйВыбор = Ложь;
РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
Если РезультатВыбора <> Неопределено Тогда
ПутьКФайлу = РезультатВыбора[0];
КонецЕсли;
КонецПроцедуры
Двоичные данные во временное хранилище
Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.
Клиентский код:
- проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
- Получаем двоичные данные из файла по указанному пути
- Помещаем эти двоичные данные во временное хранилище
- Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Возврат;
КонецЕсли;
ДД = Новый ДвоичныеДанные(ПутьКФайлу);
АдресВХ = ПоместитьВоВременноеХранилище(ДД);
ПрочитатьИзВХНаСервере(АдресВХ);
КонецПроцедуры
Серверный код:
- Создаем временный файл с нужным расширением (в примере – xlsx)
- Получаем двоичные данные из временного хранилища
- Записываем во временный файл
- Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
- Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ
Метод Прочитать лучше делать в попытке, и отдельно продумать и написать код обработки исключения. для упрощения примера мы это исключение никак не обрабатываем. В случае, если передан поврежденный файл, или его невозможно прочитать по какой-то другой причине, он просто не считается в табличный документ.
&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДД = ПолучитьИзВременногоХранилища(АдресВХ);
ДД.Записать(ИмяВременногоФайла);
Если Режим = "Текст" Тогда
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
Иначе
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
КонецЕсли;
Попытка
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
Исключение
КонецПопытки;
КонецПроцедуры
Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.
Помещение файла на сервер в 1С
Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.
Логика кода следующая:
- Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
- Указываем параметры диалога выбора файла и добавляем фильтр
- Вызываем помещение файла на сервер
- После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
КонецПроцедуры
Использование потока для чтения файла
В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.
В этом случае нам не понадобится создавать временный файл и следить за его корректным удалением. Код будет очень похож на прерыдущий пример. Мы также выбираем файл с использованием метода НачатьПомещениеФайлаНаСервер, но указываем другой фильтр. А в обработчике оповещения вызываем серверную процедуру ПрочитатьВПоток. В методе Прочитать() нам нужно явным образом указать тип файла табличного документа, который мы считываем.
&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещенияПоток(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)
ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();
КонецПроцедуры
Надеюсь, рассмотренные примеры помогут вам справиться с задачей передать файл с клиента на сервере и прочитать файл Excel в 1С.
Содержание
- Управляемый работа с excel на веб-клиенте
- Загрузка из excel веб-клиент 8.3.5
- Веб-клиент и Excel
- Открытие EXCEL в веб-клиенте
- Как прочитать файл Excel в 1С 8.3
- Содержание
- Общая информация
- Использование объекта ВременноеХранилище
- Вспомогательные процедуры — диалог выбора файла
- Двоичные данные во временное хранилище
- Помещение файла на сервер в 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С будет прочитано исходное значение 123,456
- Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”
Использование объекта ВременноеХранилище
Вспомогательные процедуры — диалог выбора файла
Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу
Создадим обработчик события НачалоВыбора:
Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.
Двоичные данные во временное хранилище
Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.
- проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
- Получаем двоичные данные из файла по указанному пути
- Помещаем эти двоичные данные во временное хранилище
- Далее передаем на сервер адрес этого временного хранилища
- Создаем временный файл с нужным расширением (в примере – xlsx)
- Получаем двоичные данные из временного хранилища
- Записываем во временный файл
- Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
- Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ
Метод Прочитать лучше делать в попытке, и отдельно продумать и написать код обработки исключения. для упрощения примера мы это исключение никак не обрабатываем. В случае, если передан поврежденный файл, или его невозможно прочитать по какой-то другой причине, он просто не считается в табличный документ.
Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.
Помещение файла на сервер в 1С
Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.
Логика кода следующая:
- Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
- Указываем параметры диалога выбора файла и добавляем фильтр
- Вызываем помещение файла на сервер
- После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
Источник