1с не открывает excel программно

Открыть файл Екселя программно

Я
   Popkorm

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

и где у тебя он открывается?

   Popkorm

2 — 20.01.12 — 16:57

(1)здесь должен открывать:

МойФайл = Excel.WorkBooks.Open(«c:Temp84х108_32ИзготОдЛиста.xlsx»);

   zbv

3 — 20.01.12 — 16:59

попробуй так:

ExcelЛист = Excel.Sheets(1);

   rs_trade

4 — 20.01.12 — 17:01

А там листы то есть вообще?

   guitar_player

5 — 20.01.12 — 17:05

ЗапуститьПриложение(«c:Temp84х108_32ИзготОдЛиста.xlsx»);

   Popkorm

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 листа

не работает

   zbv

7 — 20.01.12 — 17:07

(6) а у тебя исключение вызывается ?

   Tatitutu

8 — 20.01.12 — 17:07

Попытка

       Ехсел=СоздатьОбъект(«Excel.Application»);

   Исключение

       Предупреждение(«Excel на компьютере не установлен!»);

       Возврат ПолучитьПустоеЗначение();

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

   Книга=Ехсел.Workbooks;

   Книга.Open(Сокрлп(ИмяФайла));

       
   
   КолвоЛистов=Ехсел.Sheets.Count();

   ИмяАктивногоЛиста=Ехсел.ActiveSheet.name;

   Если КолвоЛистов=1 Тогда

       Лист=КолвоЛистов;

   Иначе

       спЛист=СоздатьОбъект(«СписокЗначений»);

       спЛист.ДобавитьЗначение(ИмяАктивногоЛиста);

       Для сч=1 По КолвоЛистов  Цикл

       
           Если Ехсел.Sheets(сч).name=ИмяАктивногоЛиста Тогда

               Продолжить;

           КонецЕсли;    

           
           спЛист.ДобавитьЗначение(Ехсел.Sheets(сч).name);        

       КонецЦикла;        

       зн=ИмяАктивногоЛиста;

       Если спЛист.ВыбратьЗначение(зн,»Выберите нужный лист для загрузки»,,60,0)=1 Тогда

           Лист=Зн;

       КонецЕсли;            

   КонецЕсли;

   Popkorm

9 — 20.01.12 — 17:07

(7)да

   zbv

10 — 20.01.12 — 17:09

(9) ОписаниеОшибки() — что говорит ?

   Popkorm

11 — 20.01.12 — 17:10

(8)Книга.Open(Сокрлп(ИмяФайла));

ИмяФала где у тебя вызывается?!

   Popkorm

12 — 20.01.12 — 17:14

(10){Форма.ФормаОтчета.Форма(205)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Office Excel): Не удалось найти «c:Temp84х108_32ИзготОдЛиста.xlsx». Проверьте правильность ввода имени и расположения файла.

При попытке открытия файла из списка недавно использованных файлов убедитесь, что файл не был переименован, перемещен или удален.

Все народ заработало,чет с тем Ехелем файлом какие то траблы…….Спасибо.А где пятничная ветка чет не найду

   Tatitutu

13 — 20.01.12 — 17:18

(0) а откуда такое веселое название файл и месторасположение ?

«c:Temp84х108_32ИзготОдЛиста.xlsx»

он физически существует ?

   Ковычки

14 — 20.01.12 — 17:20

файл был открыт

   1с-кин

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.

Skip to content

Открыть файл из 1С программно (word, excel, pdf и т.д.)

Открыть файл из 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();
Возврат
СписокЛистов;

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

Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

1

1C 8.x

Открыть эксель на сервере

17.05.2018, 09:09. Показов 16584. Ответов 40


Студворк — интернет-сервис помощи студентам

Управляемые формы. MS SQL. И база и эксель физически лежат на одной машине. Но эксель упорно не открывается, мол 1с не видит его. COMОбъект на клиенте вроде как нельзя создавать. Как боритесь с этой ситуевиной?

Добавлено через 38 минут
Нашел на инфостарте способ, как сделать через каталог временных файлов, но оказывается на папку пользователя USR1CV82 нужны права админа, и я в растерянности.



0



1824 / 1243 / 444

Регистрация: 16.01.2015

Сообщений: 5,449

17.05.2018, 09:20

2

_ЕГОР_, открываешь готовый файл или эксель для создания файла? Код покажите как делаете



0



_ЕГОР_

Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 09:22

 [ТС]

3

Готовый файл

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
&НаКлиенте
Процедура ЭксельНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    Диалог = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр    ="Лист Excel (*.xlsx)|*.xlsx|Лист Excel (*.xls)|*.xls";
    Если Диалог.Выбрать() Тогда
        ИмяФайла = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    
    
    Двоичное = Новый ДвоичныеДанные(ИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
 
    ЗагрузкаНаСервере(Адрес)
    
КонецПроцедуры
 
&НаСервере
Процедура ЗагрузкаНаСервере(Адрес)
 
    темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";
    
    темп_файл = ПолучитьИзВременногоХранилища(Адрес);
    темп_файл.Записать(темп_Путь);
        
    //ТабЛицСчетов = ЗагрузитьЭксель(темп_Путь);
    ОбработатьДанные(темп_Путь);
    
    Попытка
        УдалитьФайлы(темп_Путь); 
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры
 
Процедура ОбработатьДанные(ИмяФайла)
 
    //подключаемся к эксел
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        //Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка
        //Открываем необходимый лист
        Excel.Sheets(1).Select(); // лист 1, по умолчанию
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();
        Excel = 0;
        Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;
КонецПроцедуры

Код то работает в файловом варианте. а в серверном не дает открыть эксель. Встречались с такой ошибкой?



0



1824 / 1243 / 444

Регистрация: 16.01.2015

Сообщений: 5,449

17.05.2018, 09:30

4

_ЕГОР_, Предположение. Полный путь к файлу как определяется в отладчике? Если что-то типа С: то это локальный путь. Должно быть сетевое имя компа



0



Тест

Эксперт 1С

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



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 09:48

 [ТС]

7

polax, ох в этом то и будет загвоздка…

Добавлено через 8 минут
polax, если прописываю путь типа \192.168.0.1 то такая же ошибка



0



1824 / 1243 / 444

Регистрация: 16.01.2015

Сообщений: 5,449

17.05.2018, 10:03

8

_ЕГОР_, а если путь указать по имени компа? Типа \Server1 Делал когда-то. БП выкладывает файл на сервер, ЗУП использует этот файл. Брал файл по пути с именем компа



0



Тест

Эксперт 1С

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



Тест

Эксперт 1С

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



Тест

Эксперт 1С

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



Тест

Эксперт 1С

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

Пошлость какая то:

1C
1
темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";

дает типа C:Users%UserName%AppDataLocalTempprncss_Mega n_дата.xls
А у тебя пытается открыть из \server2obmenplatonovСписок готовый к загрузке Белашов ПОДУШКИ, ОДЕЯЛА (15.05.2018) — в работе.xlsx
Мониторь в какой момент темп_Путь забивается этим тупым путем.



0



Тест

Эксперт 1С

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



Тест

Эксперт 1С

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. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 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
  • 1с макет как шаблон word
  • 1с макет word на клиенте
  • 1с макет word колонтитулы
  • 1с макет word для печати