Открыть файл Екселя программно |
Я |
20.01.12 — 16:53
чет так не открывает:
Попытка
Excel = Новый COMОбъект(«Excel.Application»);
МойФайл = Excel.WorkBooks.Open(«c:Temp84х108_32ИзготОдЛиста.xlsx»);
Состояние(«Обработка файла Microsoft Excel…»);
ExcelЛист = МойФайл.Sheets(1);
Исключение
Сообщить(«Ошибка. Возможно неверно указан номер листа книги Excel.»);
Возврат ложь;
КонецПопытки;
1 — 20.01.12 — 16:54
и где у тебя он открывается?
2 — 20.01.12 — 16:57
(1)здесь должен открывать:
МойФайл = Excel.WorkBooks.Open(«c:Temp84х108_32ИзготОдЛиста.xlsx»);
3 — 20.01.12 — 16:59
попробуй так:
ExcelЛист = Excel.Sheets(1);
4 — 20.01.12 — 17:01
А там листы то есть вообще?
5 — 20.01.12 — 17:05
ЗапуститьПриложение(«c:Temp84х108_32ИзготОдЛиста.xlsx»);
6 — 20.01.12 — 17:05
(2)так самого начало делал:
Попытка
Excel = Новый COMОбъект(«Excel.Application»);
Excel.WorkBooks.Open(«c:Temp84х108_32ИзготОдЛиста.xlsx»);
Состояние(«Обработка файла Microsoft Excel…»);
ExcelЛист = Excel.Sheets(1);
Исключение
Сообщить(«Ошибка. Возможно неверно указан номер листа книги Excel.»);
(4)3 листа
не работает
7 — 20.01.12 — 17:07
(6) а у тебя исключение вызывается ?
8 — 20.01.12 — 17:07
Попытка
Ехсел=СоздатьОбъект(«Excel.Application»);
Исключение
Предупреждение(«Excel на компьютере не установлен!»);
Возврат ПолучитьПустоеЗначение();
КонецПопытки;
Книга=Ехсел.Workbooks;
Книга.Open(Сокрлп(ИмяФайла));
КолвоЛистов=Ехсел.Sheets.Count();
ИмяАктивногоЛиста=Ехсел.ActiveSheet.name;
Если КолвоЛистов=1 Тогда
Лист=КолвоЛистов;
Иначе
спЛист=СоздатьОбъект(«СписокЗначений»);
спЛист.ДобавитьЗначение(ИмяАктивногоЛиста);
Для сч=1 По КолвоЛистов Цикл
Если Ехсел.Sheets(сч).name=ИмяАктивногоЛиста Тогда
Продолжить;
КонецЕсли;
спЛист.ДобавитьЗначение(Ехсел.Sheets(сч).name);
КонецЦикла;
зн=ИмяАктивногоЛиста;
Если спЛист.ВыбратьЗначение(зн,»Выберите нужный лист для загрузки»,,60,0)=1 Тогда
Лист=Зн;
КонецЕсли;
КонецЕсли;
9 — 20.01.12 — 17:07
(7)да
10 — 20.01.12 — 17:09
(9) ОписаниеОшибки() — что говорит ?
11 — 20.01.12 — 17:10
(8)Книга.Open(Сокрлп(ИмяФайла));
ИмяФала где у тебя вызывается?!
12 — 20.01.12 — 17:14
(10){Форма.ФормаОтчета.Форма(205)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Office Excel): Не удалось найти «c:Temp84х108_32ИзготОдЛиста.xlsx». Проверьте правильность ввода имени и расположения файла.
При попытке открытия файла из списка недавно использованных файлов убедитесь, что файл не был переименован, перемещен или удален.
Все народ заработало,чет с тем Ехелем файлом какие то траблы…….Спасибо.А где пятничная ветка чет не найду
13 — 20.01.12 — 17:18
(0) а откуда такое веселое название файл и месторасположение ?
«c:Temp84х108_32ИзготОдЛиста.xlsx»
он физически существует ?
14 — 20.01.12 — 17:20
файл был открыт
15 — 20.01.12 — 17:30
ADODB рулит :))
16 — 20.01.12 — 17:31
(15) педалит оно и нервно курит в сравнение с оле
1с-кин
17 — 23.01.12 — 14:00
(16) оно для переноса данных туда-сюда, а уже упарвление — можно и по OLE.
Здесь MS дает два варианта — быстрый и прсотой (ADO), и медленный и гибкий — OLE.
Открыть файл из 1С программно (word, excel, pdf и т.д.)
С помощью данного способа можно открывать любые файлы на компьютере из 1С. Открываться файлы будут с помощью программ/приложений выбранных по умолчанию, для запуска данного типа файла. Например .xls файлы будут запускаться с помощью Excel, .doc — с помощью Word, .pptx — с помощью Power point. Word, excel, power point также должны быть установлены на компьютере.
Пример программного кода:
&НаКлиенте Процедура ОткрытьФайл(Команда) ЗапуститьПриложение("G:Руслан и Людмила.xlsx"); КонецПроцедуры
Файл из данного примера запустится в excel.
Также читайте:
- Программное чтение, редактирование word;
- Программное чтение, редактирование excel;
Связанные статьи
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл — Имя файла
// пЛист — Имя листа с данными
// СтруктураКолонок — Структура вида «ИмяКолонки» — «НомерКолонки»
// если не задано, созадуться колонки вида «К1», «К2»
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт#Если Клиент Тогда
Состояние(«Установка соединения с Excel»);
#КонецЕсли//ЗаголовкиВСтроке1 = «HDR=YES;»
ЗаголовкиВСтроке1 = «HDR=NO;»;СтрокаСоединения =«Provider=Microsoft.Jet.OLEDB.4.0;Data Source= « + СокрЛП(пФайл) +» ;Extended Properties=»»Excel 8.0;» + ЗаголовкиВСтроке1 + «IMEX=1;»»»;Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.ConnectionString = СтрокаСоединения;
Попытка
Connection.Open();
Исключение
Сообщить («Проблемы с подключением к Excel» );
Возврат Неопределено;
КонецПопытки;RS = Новый COMОбъект(«ADODB.Recordset»);ТекстЗапроса =
«SELECT
| Лист.*
|FROM
| [« + пЛист + «$] as Лист»;
Попытка
RS.Open(ТекстЗапроса, Connection);
Исключение
Сообщить («Проблемы с выполнением запроса»);
Возврат Неопределено;
КонецПопытки;Таблица = Новый ТаблицаЗначений;
Если
СтруктураКолонок = Неопределено Тогда
Для
Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик — 1);
Колонка = Таблица.Колонки.Добавить(«К» + Счетчик, , Поле.Name);
КонецЦикла;
Иначе
Для каждого
КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НомерСтроки = 0;
КолвоСтрок = RS.RecordCount;
Пока
RS.EOF() = 0 ЦиклНомерСтроки = НомерСтроки + 1;#Если Клиент Тогда
Состояние(«Чтение файла: « + Формат(НомерСтроки) + » из « + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕслиЕсли НомерСтроки < НачСтрока Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Если
КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать;
КонецЕсли;НоваяСтрока = Таблица.Добавить();
Если
СтруктураКолонок = Неопределено Тогда
Для
Счетчик = 1 По RS.Fields.Count ЦиклПоле = RS.Fields.Item(Счетчик — 1);
НоваяСтрока[«К» + Счетчик] = Поле.Value;
КонецЦикла;
Иначе
Для каждого
КлючИЗначение Из СтруктураКолонок ЦиклПоле = RS.Fields.Item(КлючИЗначение.Значение — 1);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
// Обработка других полей
RS.MoveNext();
КонецЦикла;
// Завершение работыRS.Close();
Connection.Close();
Возврат
Таблица;
КонецФункции
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл — Имя файла
// пЛист — Имя листа с данными
// СтруктураКолонок — Структура вида «ИмяКолонки» — «НомерКолонки»
// если не задано, созадуться колонки вида «К1», «К2»
// XLSОбъект — COM объект типа «Excel.Application»
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт#Если Клиент Тогда
Состояние(«Открытие Excel»);
#КонецЕслиЕсли XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект(«Excel.Application»);
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить («Проблемы с подключением к Excel» );
Возврат Неопределено;
КонецПопытки;Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;Таблица = Новый ТаблицаЗначений;
Если
СтруктураКолонок = Неопределено Тогда
Для
Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить(«К» + Счетчик);
КонецЦикла;
Иначе
Для каждого
КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);
Для
НомерСтроки = НачСтрока По КонСтрока Цикл#Если Клиент Тогда
Состояние(«Чтение файла: « + Формат(НомерСтроки) + » из « + Формат(КонСтрока));
ОбработкаПрерыванияПользователя();
#КонецЕслиНоваяСтрока = Таблица.Добавить();
Если
СтруктураКолонок = Неопределено Тогда
Для
НомерКолонки = 1 По КолвоКолонок ЦиклПоле = Лист.Cells(НомерСтроки, НомерКолонки);
НоваяСтрока[«К» + Формат(НомерКолонки, «ЧГ=0»)] = Поле.Value;
КонецЦикла;
Иначе
Для каждого
КлючИЗначение Из СтруктураКолонок ЦиклПоле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл — Имя файла
// пЛист — Имя листа с данными
// СтруктураКолонок — Структура вида «ИмяКолонки» — «НомерКолонки»
// если не задано, созадуться колонки вида «К1», «К2»
// XLSОбъект — COM объект типа «Excel.Application»
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт#Если Клиент Тогда
Состояние(«Открытие Excel»);
#КонецЕслиЕсли XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект(«Excel.Application»);
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить («Проблемы с подключением к Excel» );
Возврат Неопределено;
КонецПопытки;Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;Таблица = Новый ТаблицаЗначений;
Если
СтруктураКолонок = Неопределено Тогда
Для
Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить(«К» + Счетчик);
КонецЦикла;
Иначе
МаксимальныйНомерКолонки = 0;
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
КонецЦикла;КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);
КонецЕсли;
НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);// Массив типа COMSafeArray
Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
КолвоСтрок = Массив.GetUpperBound(1);
Для
НомерСтроки = 1 По КолвоСтрок Цикл#Если Клиент Тогда
Состояние(«Чтение файла: « + Формат(НомерСтроки) + » из « + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕслиНоваяСтрока = Таблица.Добавить();
Если
СтруктураКолонок = Неопределено Тогда
Для
НомерКолонки = 1 По КолвоКолонок ЦиклНоваяСтрока[«К» + Формат(НомерКолонки, «ЧГ=0»)] = Массив.GetValue(НомерКолонки, НомерСтроки);
КонецЦикла;
Иначе
Для каждого
КлючИЗначение Из СтруктураКолонок ЦиклНоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает список листов Excel
//
// Параметры:
// пФайл — Имя файла
// XLSОбъект — COM объект типа «Excel.Application»
//
// Возвращаемое значение:
// СписокЗначений
//
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт
Если
XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект(«Excel.Application»);
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Возврат Новый СписокЗначений;
КонецПопытки;СписокЛистов = Новый СписокЗначений;
Для каждого Лист Из XLSОбъект.Sheets Цикл
СписокЛистов.Добавить(Лист.Name);
КонецЦикла;XLSОбъект.Application.Quit();
Возврат СписокЛистов;
КонецФункции
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
1 |
|
1C 8.x Открыть эксель на сервере17.05.2018, 09:09. Показов 16584. Ответов 40
Управляемые формы. MS SQL. И база и эксель физически лежат на одной машине. Но эксель упорно не открывается, мол 1с не видит его. COMОбъект на клиенте вроде как нельзя создавать. Как боритесь с этой ситуевиной? Добавлено через 38 минут
0 |
1824 / 1243 / 444 Регистрация: 16.01.2015 Сообщений: 5,449 |
|
17.05.2018, 09:20 |
2 |
_ЕГОР_, открываешь готовый файл или эксель для создания файла? Код покажите как делаете
0 |
_ЕГОР_ Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
||||
17.05.2018, 09:22 [ТС] |
3 |
|||
Готовый файл
Код то работает в файловом варианте. а в серверном не дает открыть эксель. Встречались с такой ошибкой?
0 |
1824 / 1243 / 444 Регистрация: 16.01.2015 Сообщений: 5,449 |
|
17.05.2018, 09:30 |
4 |
_ЕГОР_, Предположение. Полный путь к файлу как определяется в отладчике? Если что-то типа С: то это локальный путь. Должно быть сетевое имя компа
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 09:34 [ТС] |
5 |
polax, а это значит папка расшарена должна быть ведь?
0 |
1824 / 1243 / 444 Регистрация: 16.01.2015 Сообщений: 5,449 |
|
17.05.2018, 09:39 |
6 |
_ЕГОР_, Конечно доступ должен быть открыт Добавлено через 3 минуты
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 09:48 [ТС] |
7 |
polax, ох в этом то и будет загвоздка… Добавлено через 8 минут
0 |
1824 / 1243 / 444 Регистрация: 16.01.2015 Сообщений: 5,449 |
|
17.05.2018, 10:03 |
8 |
_ЕГОР_, а если путь указать по имени компа? Типа \Server1 Делал когда-то. БП выкладывает файл на сервер, ЗУП использует этот файл. Брал файл по пути с именем компа
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 10:08 [ТС] |
9 |
polax, так же…
0 |
82 / 69 / 19 Регистрация: 12.11.2015 Сообщений: 625 |
|
17.05.2018, 10:12 |
10 |
а почему ЗагрузкаНаСервере(Адрес) не использовать на клиенте? Формировать на сервер временный файл, а на клиенте его записать
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 10:19 [ТС] |
11 |
slypower, на клиенте тоже пробовал
0 |
206 / 180 / 31 Регистрация: 24.10.2011 Сообщений: 738 |
|
17.05.2018, 11:00 |
12 |
Процедура ОбработатьДанные(ИмяФайла) поставь директиву &НаСервере
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 11:07 [ТС] |
13 |
Volexovich, так же
0 |
206 / 180 / 31 Регистрация: 24.10.2011 Сообщений: 738 |
|
17.05.2018, 11:09 |
14 |
Дай текст сообщения
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 11:10 [ТС] |
15 |
{ВнешняяОбработка.ЗагрузкаЭксель.Форма.Форма.Форма (81)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «\server2obmenplatonovСписок готовый к загрузке Белашов ПОДУШКИ, ОДЕЯЛА (15.05.2018) — в работе.xlsx». Это может быть вызвано одной из следующих причин. • Указан несуществующий файл или путь.
0 |
Volexovich 206 / 180 / 31 Регистрация: 24.10.2011 Сообщений: 738 |
||||
17.05.2018, 11:25 |
16 |
|||
Пошлость какая то:
дает типа C:Users%UserName%AppDataLocalTempprncss_Mega n_дата.xls
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 11:28 [ТС] |
17 |
Volexovich, ну это я менял уже вот ошибка с временным каталогам {ВнешняяОбработка.ЗагрузкаЭксель.Форма.Форма.Форма (81)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «C:Userse.platonovAppDataLocalTemp14prncss_ Megan_201188086.xls». Это может быть вызвано одной из следующих причин. • Указан несуществующий файл или путь.
0 |
206 / 180 / 31 Регистрация: 24.10.2011 Сообщений: 738 |
|
17.05.2018, 11:34 |
18 |
Так, а у тебя на сервере эксель не повесился? Глянь процессы Экселя Добавлено через 1 минуту
0 |
Тест 383 / 162 / 56 Регистрация: 26.02.2010 Сообщений: 1,241 |
|
17.05.2018, 11:37 [ТС] |
19 |
Volexovich, неа, нет висячих процессов.
0 |
206 / 180 / 31 Регистрация: 24.10.2011 Сообщений: 738 |
|
17.05.2018, 11:38 |
20 |
Про время немного не понял… Если Эксель не виснет, значит проблема в другом.
0 |
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт
#Если Клиент Тогда
Состояние("Установка соединения с Excel");
#КонецЕсли
//ЗаголовкиВСтроке1 = "HDR=YES;"
ЗаголовкиВСтроке1 = "HDR=NO;";
СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;""";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;
Попытка
Connection.Open();
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса =
"S_elect
| Лист.*
|FROM
| [" + пЛист + "$] as Лист";
Попытка
RS.Open(ТекстЗапроса, Connection);
Исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат Неопределено;
КонецПопытки;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НомерСтроки = 0;
КолвоСтрок = RS.RecordCount;
Пока RS.EOF() = 0 Цикл
НомерСтроки = НомерСтроки + 1;
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли
Если НомерСтроки < НачСтрока Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать;
КонецЕсли;
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
НоваяСтрока["К" + Счетчик] = Поле.Value;
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
// Обработка других полей
RS.MoveNext();
КонецЦикла;
// Завершение работы
RS.Close();
Connection.Close();
Возврат Таблица;
КонецФункции
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние("Открытие Excel");
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;
Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);
Для НомерСтроки = НачСтрока По КонСтрока Цикл
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока));
ОбработкаПрерыванияПользователя();
#КонецЕсли
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
Поле = Лист.Cells(НомерСтроки, НомерКолонки);
НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value;
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние("Открытие Excel");
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;
Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
КонецЦикла;
Иначе
МаксимальныйНомерКолонки = 0;
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
КонецЦикла;
КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);
КонецЕсли;
НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);
// Массив типа COMSafeArray
Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
КолвоСтрок = Массив.GetUpperBound(1);
Для НомерСтроки = 1 По КолвоСтрок Цикл
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает список листов Excel
//
// Параметры:
// пФайл - Имя файла
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// СписокЗначений
//
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Возврат Новый СписокЗначений;
КонецПопытки;
СписокЛистов = Новый СписокЗначений;
Для каждого Лист Из XLSОбъект.Sheets Цикл
СписокЛистов.Добавить(Лист.Name);
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат СписокЛистов;
КонецФункции
Excel — это сторонняя программа, ее можно запускать из 1С в невидимом и видимом режиме и пользоваться всеми возможностями. Excel должен быть установлен на компьютере. Для примера приведено чтение таблицы в из файла Excel на клиенте, передача на сервер и создание на сервере таблицы значений с данными из файла. Такую задачку любят давать на собеседованиях на должность программиста 1С.
&НаКлиенте
Процедура НажатиеКноки()
// обращаемся к Excel
Попытка
Эксель = новый COMОбъект(«Excel.Application»);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ПутьКФайлу = «C:Некоторый файл.xlsx»;
// открываем ексель файл
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
// переходим на первую страницу
Лист = Книга.WorkSheets(1);
// для количества колонок и строк в экселе есть специальные ячейки
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
// сохраняем файл в массив строк, где строка это так же массив (на клиенте
// нельзя создавать таблицу значений
НаборСтрокФайла = новый массив;
для Строка = 1 по ВсегоСтрок цикл
МассивСтрока = новый массив;
для Колонка = 1 по ВсегоКолонок цикл
// получаем значение из ячейки excel
Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value);
МассивСтрока.Добавить(Значение);
КонецЦикла;
НаборСтрокФайла.Добавить(МассивСтрока);
КонецЦикла;
// запишем файл с другим именем
Эксель.SaveAs(«C:ФайлСДругимИменем.xlsx»);
// закрываем ексель, иначе он останется висеть в памяти
Эксель.Application.Quit();
КонецПроцедуры
&НаСервере
Процедура СоздатьИОбработатьТаблицуЗначений(НаборСтрокФайла, ВсегоКолонок)
ТЗ = новый ТаблицаЗначений;
// создаем колонки таблицы значений (столько сколько в файле ексель)
для й=1 по ВсегоКолонок цикл
ТЗ.Колонки.Добавить(«кол» + Формат(й,«ЧЦ=4; ЧГ=»));
КонецЦикла;
// переносим строки из массива в таблицу значений
для каждого МассивСтрока из НаборСтрокФайлацикл
НовСтрока = ТЗ.Добавить();
для Колонка = 1 по ВсегоКолонок цикл
// переносим значение из массива в таблицу
НовСтрока[Колонка — 1] = МассивСтрока[Колонка — 1];
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Далее приводятся наиболее частые ситуации, возникающие на
Поиск и замена текста в ячейках файла Excel
//Выбираем область поиска — весь лист
ОбластьПоиска = Лист.Cells;
// Начинаем поиск с левого верхнего угла
НачалоЛиста =Лист.Cells(1, 1);
// Ищем ячейку с текстом «привет»
ОбластьПараметр = ОбластьПоиска.Find(«привет», НачалоЛиста);
// Если нашли вывсодим найденую строку
Если ОбластьПараметр <> неопределено Тогда
Сообщить(ОбластьПараметр.Value);
КонецЕсли;
Работа со строками в Excel
//Выбираем первую строку
НачальнаяСтрока = Лист.Cells(1, 1);
// Выделяем всю строку
НачальнаяСтрока .EntireRow.Select();
// Копируем выделенное
НачальнаяСтрока .EntireRow.Copy();
// Вставляем (новая строка будет вставлена тут же)
НачальнаяСтрока .EntireRow.Insert();
// Удалим строку
НачальнаяСтрока .EntireRow.Delete();
Прочие полезные методы Excel
Эксель.Visible = Видимость; | 0 — Excel не виден, 1 — виден. |
Книга = Эксель.WorkBooks.Add(); | Создание новой книги (файла) Excel. |
Книга.SaveAs(ИмяФайла); | Сохранение книги Excel. |
Лист = Книга.WorkSheets.Add(); | Добавление нового листа в книгу. |
Книга = Эксель.WorkBooks.Open(ИмяФайла); | Открытие существующей книги (файла) Excel. |
Лист = Книга.WorkSheets(НомерЛиста); | Установка листа в качестве рабочего с номером НомерЛиста. |
Лист.Name = ИмяЛиста; | Задание рабочему листу имени ИмяЛиста |
Лист.PageSetup.Zoom = Масштаб; | Задание параметра страницы «Масштаб» (от 10 до 400). |
Лист.PageSetup.Orientation = Ориентация; | Ориентация: 1 — книжная, 2 — альбомная. |
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание левой границы (в сантиметрах). |
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание верхней границы (в сантиметрах). |
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание правой границы (в сантиметрах). |
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание нижней границы (в сантиметрах). |
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | Задание ширины колонке. |
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | Ввод данных в ячейку. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; | Установка шрифта в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; | Установка размера шрифта в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; | 1 — жирный шрифт, 0 — нормальный. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; | 1 — наклонный шрифт, 0 — нормальный. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; | 2 — подчеркнутый, 1 — нет. |
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; | Установка формата данных ячейки. |
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; | Установка рамок ячейки. 1 — тонкая сплошная. |
Лист.Protect(); | Установка защиты на лист |
Лист.UnProtect(); | Снятие защиты с листа |
Лист.Cells(Строка, Столбец).Locked=0; | Ячейка будет доступной (и после установки защиты на лист) |
Эксель.DisplayAlerts = False; | Убрать все сообщение при открытии файла. Сообщения останавливают выполнения кода до реакции пользователя |
Для работы с Excel файлами в системе 1C существуют определенные технологии. Организовать взаимодействие системы 1C с внешней программой MS Excel можно через COM-объект «Excel.Application». Также есть возможность наладить взаимодействие с Excel из 1C используя технологию ADO.
Данный пример демонстрирует работу с использованием «Excel.Application». Для работоспособности данного примера на компьютере обязательно должно быть установлено программное обеспечение MS Excel.
Прочитать из существующего Excel Файла
Процедура ПрочитатьСуществующийExcelФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; Книга
= Excel.Workbooks.Open(ПутьКФайлу);
КоличествоЛистов = Книга.Sheets.Count;//Перебор листов
Для НомерЛиста = 1 По КоличествоЛистов Цикл Лист
= Книга.Sheets(НомерЛиста);
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
КоличествоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;//Перебор строк
Для НомерСтроки = 1 По КоличествоСтрок Цикл//Перебор колонок
Для НомерКолонки = 1 По КоличествоКолонок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
//Выполнение действий с полученным значением
//...
//...
КонецЦикла;КонецЦикла;КонецЦикла; Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Записать в существующий Excel Файл
Процедура ЗаписатьСуществующийExcellФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; Книга
= Excel.Workbooks.Open(ПутьКФайлу); Лист
= Книга.Sheets(1);
//Установить значение в ячейку
Лист.Cells(1, 1).Value = "Тестовое значение";
Книга.Save(); Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Создать новый Excel Файл
Процедура СоздатьНовыйExcellФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; //Автоматически будут созданы три листа
Книга = Excel.WorkBooks.Add();
//Получить первый лист
Лист = Книга.Sheets(1);
//Установить значение в ячейку
Лист.Cells(1, 1).Value = "Тестовое значение";Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки() + " не удалось сохранить файл");
КонецПопытки; Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Весьма частая задача, с которой сталкивается 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С.