Загрузка из эксель

1. ranis888 104 22.02.18 08:46 Сейчас в теме +0.78 $m
&НаСервере
Процедура ЗагрузкаПоСписку()
Перем ТипРасчета;

ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.Фильтр = "Excel (*.xls)|*.xls";
ВыборФайла.МножественныйВыбор = Ложь;
Если НЕ ВыборФайла.Выбрать() Тогда
        Предупреждение("Файлы не выбраны");
Возврат
КонецЕсли;
НайтиФайл = ВыборФайла.ВыбранныеФайлы[0];
Попытка
      Эксель = Новый COMОбъект("Excel.Application");
      Исключение
      Сообщить(ОписаниеОшибки());
      Возврат;
КонецПопытки;
  
ПутьКФайлу = Эксель.WorkBooks.Open(НайтиФайл);
Лист = Эксель.Sheets(1); // Первый лист по индексу  
Строк = Лист.Cells(1,1).SpecialCells(11).Row;      
ДокЭксель = ПолучитьCOMОбъект(НайтиФайл);
Док            = Документы.НачислениеЗарплаты; 
Сотр           = Справочники.ФизическиеЛица; 
СпрВидРасчета  = ПланыВидовРасчета.Удержания; 

НовыйДок = Док.СоздатьДокумент(); 
НовыйДок.Дата = НаДату;
НовыйДок.МесяцНачисления = НаДату;

НовыйДок.Организация = Справочники.Организации.НайтиПоКоду("000000003");

Для Сч = 4 По Строк-1 Цикл
	ТабЧасть = НовыйДок.Удержания;
    НоваяСтр = ТабЧасть.Добавить(); 

    ТабНомер       = СокрЛП(Лист.Cells(Сч, 2).Value);  
    Наименование   = СокрЛП(Лист.Cells(Сч, 3).Value);
    СуммаОбеда     = Число(Лист.Cells(Сч, 5).Value);
    ДатаОбеда      = НаДату;  
	Если СтрДлина(СокрЛП(ТабНомер)) = 5 Тогда
		ТабНомер = "0" + СокрЛП(ТабНомер);
	КонецЕсли;	
	ТабНомер = СокрЛП(ТабНомер) + "      ";
		
	Сотр1 = Сотр.НайтиПоКоду(ТабНомер);
	Если Не Сотр1.Пустая() Тогда
        НоваяСтр.ФизическоеЛицо = Сотр.НайтиПоКоду(ТабНомер);
    Иначе
    	Предупреждение ("Сотрудник не найден "+ ТабНомер);
    Конецесли;
    НоваяСтр.Результат   = СуммаОбеда;                        
   	НоваяСтр.ДатаНачала     = НаДату;
   	НоваяСтр.ДатаОкончания  = ДатаОбеда;
    Расчет1 = СпрВидРасчета.НайтиПоКоду("11112");
    Если Не Расчет1.Пустая() Тогда
        НоваяСтр.Удержание = Расчет1;  
   	Иначе
    	Предупреждение ("Шифр оплаты \Удержания по столовой\ не найден",3);
   	КонецЕсли;  
Конеццикла;
НовыйДок.Записать();         
Эксель.Workbooks.Close();
КонецПроцедуры //ЗагрузкаПоСписку
Показать



Знаю что на сервере нет выбор файла. Не могу разобраться, как с клиента делают выбор файла и передают данные на сервере. Помогите пожалуйста
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. Xershi 1484 22.02.18 10:23 Сейчас в теме
(1) самый простой вариант через временное хранилище. НО если есть веб клиент, там еще заморочиться придется!
9. Bazil 557 22.02.18 10:39 Сейчас в теме
(1) +7 Если на сервере нет екселя, то вариант по COM'у не взлетит, лучше прочитать файл на клиенте в ТЗ и передать ТЗ на сервер.
13. ranis888 104 22.02.18 13:13 Сейчас в теме
10. BackinSoda 22.02.18 10:50 Сейчас в теме
(1) В относительно последних версиях можно прочитать в таб документ (без ком экселя)

 МасОбл = Новый ТабличныйДокумент;
	МасОбл.Прочитать(Объект.ПутьКФайлу);
	НомПослСтроки = МасОбл.ВысотаТаблицы;

про метод Прочитать
12. ranis888 104 22.02.18 13:12 Сейчас в теме
(10)
Прочитать(Объект.ПутьКФайлу);


Тип не определен (Прочитать)
17. BackinSoda 22.02.18 13:35 Сейчас в теме
(12) какая версия платформы то?
18. ranis888 104 22.02.18 13:37 Сейчас в теме
(17)
1С:Предприятие 8.3 (8.3.11.2954)
Зарплата и управление персоналом, редакция 3.1 (3.1.2.483)
19. ark.zv 14 22.02.18 13:38 Сейчас в теме
(17) Я такое писал на 8.3.10.2561
25. tinkerbell 22.02.18 19:06 Сейчас в теме
(10) А как это может помочь в передаче данных файла с клиента на сервер? Метод Прочитать() доступен только на сервере, а сам файл доступен на клиенте.
28. BackinSoda 23.02.18 08:44 Сейчас в теме
(25) Как открыть и передать файл на сервер уже написали чуть выше, я лишь предложил как можно избавиться от com-объекта Экселя
36. tinkerbell 26.02.18 14:25 Сейчас в теме
(28) Да, если передавать файл через временное хранилище - все получилось. Спасибо за идею! Так гораздо проще, чем ставить Excel на сервер. Да и при загрузке на клиенте это может быть удобно. Возможно, этот вариант будет работать быстрее, чем загрузка через COM-объект. По крайней мере на маленьких таблицах.
26. kild 89 22.02.18 20:28 Сейчас в теме
(1)

&НаКлиенте
Процедура Команда1(Команда)
	
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Лист Microsoft Excel'; en = 'Лист Microsoft Excel'") + "(*.xlsx)|*.xlsx;*.xls";
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма);	
	НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);

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

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

    Если ПомещенныеФайлы = Неопределено Тогда
        Возврат;
    КонецЕсли;

	Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл
		
		РасширениеФайла = "";
		МассивСтрок = СтрРазделить(ПереданныйФайл.Имя, ".", Ложь);
		Если МассивСтрок.Количество() > 1 Тогда
			РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1];
		КонецЕсли;
				
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПереданныйФайл.Хранение);		
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
		ДвоичныеДанные.Записать(ИмяВременногоФайла);                            		
		
		ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла);
		
    КонецЦикла;
    
КонецПроцедуры 

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

Показать


В процедуре ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла)
ИмяВременногоФайла - временный файл переданный на сервер.
В ТЗ - таблица значений из эксель.
Прикрепленные файлы:
Excel в ТабличныйДокумент.epf
tolyan_ekb; +1 Ответить
30. ranis888 104 26.02.18 08:00 Сейчас в теме
(26) Ошибка при выполнении файловой операции 'C:\Users\Fin3\AppData\Local\Temp\15\v8_E3CF_ef.xls'. Доступ к файлу не может быть получен. Что это значит?
31. ranis888 104 26.02.18 08:04 Сейчас в теме
Теперь нужно, добавить в процедуру, чтобы записывал данные?
34. ranis888 104 26.02.18 09:36 Сейчас в теме
Огромное вам спасибо. А можно уточнить, этот код для других сойдет?
35. ranis888 104 26.02.18 09:41 Сейчас в теме
(26)

СуммаОбеда = СокрЛП(ТабличныйДокумент.Область(Сч, 5).Текст);
Вот это как сделать числовым? Если писать Число, то ругается
2. PavelKolobkov 22.02.18 08:52 Сейчас в теме
Смотрите на методы глобального контекста НачатьПомещениеФайлов и ПоместитьФайлы, один из параметров методов - ДиалогВыбораФайлов, после "помещения" файлов будет доступен массив объектов типа ОписаниеПереданногоФайла
3. a30v 22.02.18 08:59 Сейчас в теме
Читайте данные из файла на клиенте и передавайте их на сервер. Например, создайте у формы реквизит с типом таблица значений. Заполняйте данными из файла, а на сервере считывайте.
4. ranis888 104 22.02.18 09:03 Сейчас в теме
(3) Можете на данном примере показать, как это делается ?
5. a30v 22.02.18 09:07 Сейчас в теме
(4) Могу, но только часов через 8
6. ranis888 104 22.02.18 09:29 Сейчас в теме
(5) Был бы очень благодарен
32. ranis888 104 26.02.18 08:06 Сейчас в теме
37. a30v 26.02.18 20:52 Сейчас в теме
(32) Отправьте мне на почту или тут выложите обработку, которую нужно переделать, если вопрос еще актуален.
7. Bazil 557 22.02.18 10:08 Сейчас в теме
Вот так:

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

&НаКлиенте
Процедура НачатьПомещениеФайлаЗавершение(Результат, АдресХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Если Результат = Ложь Тогда
		Возврат
	КонецЕсли;
	
	ВыполнитьОбработкуНаСервере(АдресХранилища);	

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

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

	// здесь ваш код чтения файла
	ТаблицыДанных = ПрочитатьФайлExcel(ИмяВременногоФайла);
	
	УдалитьФайлы(ИмяВременногоФайла);
	
КонецПроцедуры
Показать
11. ranis888 104 22.02.18 13:05 Сейчас в теме
работка.Столовая.Форма.Форма.Форма(28,21)}: Процедура или функция с указанным именем не определена (ПрочитатьФайлExcel)
14. Bazil 557 22.02.18 13:27 Сейчас в теме
(11) ПрочитатьФайлExcel() это не метод платформы, это пример функции, которая у меня разбирает файл. Вместо нее должен быть ваш код.
16. ranis888 104 22.02.18 13:34 Сейчас в теме
(14)Всё равно не могу сделать :(
20. ranis888 104 22.02.18 13:38 Сейчас в теме
(15) Exel рабочий. Код у меня не рабочий
21. ark.zv 14 22.02.18 13:40 Сейчас в теме
(20) Эту функцию
ПрочитатьФайлExcel(ИмяВременногоФайла)
пишешь так же на сервере. Внутри примерный код как в теме которую я указал выше. Возвращаешь готовую таблицу значений.
22. user657734_YGREEN 22.02.18 14:21 Сейчас в теме
//Помещаем файл полученный на клиенте во временное хранилище
ОписаниеОповещенияОЗавершении = Новый ОписаниеОповещения("ФайлДляЗагрузкиНачалоВыбораЗавершение", ЭтаФорма);
	НачатьПомещениеФайла(ОписаниеОповещенияОЗавершении, АдресФайла, , Истина, УникальныйИдентификатор) 


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

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


//Дальше все делаешь, что нужно он уже на сервере
23. ranis888 104 22.02.18 14:42 Сейчас в теме
(22) ВнешняяОбработка.Столовая.Форма.Форма.Форма(16,42)}: Переменная не определена (АдресФайлаНаСервере)
24. user657734_YGREEN 22.02.18 15:28 Сейчас в теме
Переменные нужно объявить на форме.
Вот так:
Прикрепленные файлы:
27. LavinVladik 214 23.02.18 00:55 Сейчас в теме
&НаКлиенте
Функция   	ПолучитьОбъект 									()
	MyCon = Новый COMОбъект ("ADODB.Connection");
	СтрокаСоединения ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " +СокрЛП(рекИмяФайлаОбмена) +" ;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
	MyCon.Open(СтрокаСоединения);
    MyCat=Новый COMОбъект ("ADOX.Catalog");
    MyCat.ActiveConnection = MyCon;
    ИмяПервойСтраницы=MyCat.Tables.Item(0).Name;
    MyRst = Новый COMОбъект ("ADODB.Recordset");
    MyStr = "sel ect * fr om ["+ИмяПервойСтраницы+"]";
    //MyRst.Open (MyStr, MyCon, 2, 3); //adOpenDynamic, adLockOptimistic 
	MyRst.Open (MyStr, MyCon, 3, 1); //adOpenDynamic, adLockOptimistic 
	

	
	Если Элементы.Найти("фрмТаблицаЗагрузки") = Неопределено Тогда
		СоздатьТаблицуНаСервере("рекТаблицаЗагрузки");
	Иначе
		ЭтаФорма.рекТаблицаЗагрузки.Очистить();
	КонецЕсли;
	
	Пока НЕ MyRst.EOF() Цикл
		
		
		Если НЕ ЗначениеЗаполнено(СокрЛП(MyRst.Fields.Item(1).Value)) Тогда
			Сообщить("Нет табельного номера для строки  """+СокрЛП(MyRst.Fields.Item(0).Value)+ 
					""" ТабНомер:"""+СокрЛП(MyRst.Fields.Item(1).Value)+
					""" Сумма:""" +Окр(Число(СокрЛП(MyRst.Fields.Item(2).Value)),2)+"""");
			MyRst.MoveNext();    
			Продолжить;
		КонецЕсли;	
		

		НайденныйСотрудник = ПолучитьСотрудника(СокрЛП(MyRst.Fields.Item(1).Value));
		  
		Если НЕ ЗначениеЗаполнено(НайденныйСотрудник) Тогда
			Сообщить("Не найденн сотрудник  """+СокрЛП(MyRst.Fields.Item(0).Value)+ 
			""" ТабНомер:"""+СокрЛП(MyRst.Fields.Item(1).Value)+
			""" Сумма:""" +Окр(Число(СокрЛП(MyRst.Fields.Item(2).Value)),2)+"""");
			MyRst.MoveNext();    
			Продолжить;
		КонецЕсли;	
		
		
		
		
		НоваяСтрока = ЭтаФорма.рекТаблицаЗагрузки.Добавить();
		НоваяСтрока.ФИО 		= НайденныйСотрудник;
		НоваяСтрока.ТабНомер 	= СокрЛП(MyRst.Fields.Item(1).Value);
		НоваяСтрока.Сумма 		= Окр(Число(СокрЛП(MyRst.Fields.Item(2).Value)),2);

        MyRst.MoveNext();    
		
	КонецЦикла;

    MyRst.Close();
    MyCon.Close();	
	
	Сообщить("Итого - " + ЭтаФорма.рекТаблицаЗагрузки.Итог("Сумма"));
	
КонецФункции
&НаКлиенте
Процедура 	КнопкаЗагрузить(Команда)
	
	Если НЕ ПроверитьСуществованиеФайла(СокрЛП(рекИмяФайлаОбмена)) Тогда Возврат КонецЕсли;
	
	ПолучитьОбъект();

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

Показать


как то так.
29. Samarkan63 25.02.18 20:46 Сейчас в теме
33. ranis888 104 26.02.18 08:08 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот