&НаСервере
Процедура ЗагрузкаПоСписку()
Перем ТипРасчета;
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.Фильтр = "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();
КонецПроцедуры //ЗагрузкаПоСписку
ПоказатьЗнаю что на сервере нет выбор файла. Не могу разобраться, как с клиента делают выбор файла и передают данные на сервере. Помогите пожалуйста
По теме из базы знаний
- Загрузка из Эксель "Отчета о розничных продажах" в БП 3.0 (подходит для отчетов Телеметрон)
- Загрузка из эксель в документ Счет на оплату для 1С: Бухгалтерия предприятия 3
- Загрузка из эксель в документ Заказ клиента для УТ 11.4, 11.5, КА 2.4, 2.5, ЕРП 2.4, 2.5
- Загрузка из эксель в документ Приобретение товаров и услуг для УТ 11.5, КА 2.5, ЕРП 2.5
- Загрузка из эксель в документ Приходная накладная для УНФ 3, Розница 3
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) В относительно последних версиях можно прочитать в таб документ (без ком экселя)
МасОбл = Новый ТабличныйДокумент;
МасОбл.Прочитать(Объект.ПутьКФайлу);
НомПослСтроки = МасОбл.ВысотаТаблицы;
про метод Прочитать |
---|
Метод табличного документа "Прочитать" читает все листы в 1 (один) табличный документ на платформах 8.3.6-8.3.9, а на платформе 8.3.10 можно считать отдельные листы файла EXCEL.
Поэтому для использования данного функционала на версиях платформы 8.3.6-8.3.9 необходимо использовать файлы EXCEL, содержащие 1 (один) лист с данными, для платформы 8.3.10, такого ограничения нет. |
(28) Да, если передавать файл через временное хранилище - все получилось. Спасибо за идею! Так гораздо проще, чем ставить Excel на сервер. Да и при загрузке на клиенте это может быть удобно. Возможно, этот вариант будет работать быстрее, чем загрузка через COM-объект. По крайней мере на маленьких таблицах.
(1)
В процедуре ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла)
ИмяВременногоФайла - временный файл переданный на сервер.
В ТЗ - таблица значений из эксель.
&НаКлиенте
Процедура Команда1(Команда)
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Лист Microsoft Excel'; en = 'Лист Microsoft Excel'") + "(*.xlsx)|*.xlsx;*.xls";
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма);
НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);
КонецПроцедуры
Процедура ОбработатьВыборФайла(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
Если ПомещенныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл
РасширениеФайла = "";
МассивСтрок = СтрРазделить(ПереданныйФайл.Имя, ".", Ложь);
Если МассивСтрок.Количество() > 1 Тогда
РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1];
КонецЕсли;
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПереданныйФайл.Хранение);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла);
КонецЦикла;
КонецПроцедуры
Процедура ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();
КонецПроцедуры
ПоказатьВ процедуре ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла)
ИмяВременногоФайла - временный файл переданный на сервер.
В ТЗ - таблица значений из эксель.
Прикрепленные файлы:
Excel в ТабличныйДокумент.epf
(26) Ошибка при получении значения атрибута контекста (Результат)
{ВнешняяОбработка.НачатьПомещениеФайлов.Форма.Форма.Форма(48)}:ТЗ = Построитель.Результат.Выгрузить();
{ВнешняяОбработка.НачатьПомещениеФайлов.Форма.Форма.Форма(31)}:ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла);
по причине:
{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
{ВнешняяОбработка.НачатьПомещениеФайлов.Форма.Форма.Форма(48)}:ТЗ = Построитель.Результат.Выгрузить();
{ВнешняяОбработка.НачатьПомещениеФайлов.Форма.Форма.Форма(31)}:ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла);
по причине:
{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
Смотрите на методы глобального контекста НачатьПомещениеФайлов и ПоместитьФайлы, один из параметров методов - ДиалогВыбораФайлов, после "помещения" файлов будет доступен массив объектов типа ОписаниеПереданногоФайла
Вот так:
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("НачатьПомещениеФайлаЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения, "", ИмяФайла, Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура НачатьПомещениеФайлаЗавершение(Результат, АдресХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
Возврат
КонецЕсли;
ВыполнитьОбработкуНаСервере(АдресХранилища);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОбработкуНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// здесь ваш код чтения файла
ТаблицыДанных = ПрочитатьФайлExcel(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Показать
//Помещаем файл полученный на клиенте во временное хранилище
//Дальше все делаешь, что нужно он уже на сервере
ОписаниеОповещенияОЗавершении = Новый ОписаниеОповещения("ФайлДляЗагрузкиНачалоВыбораЗавершение", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещенияОЗавершении, АдресФайла, , Истина, УникальныйИдентификатор)
&НаКлиенте
Процедура ФайлДляЗагрузкиНачалоВыбораЗавершение(Выбрано, АдресХранилища, Результат, ПараметрыОповещения) Экспорт
Если Выбрано Тогда
АдресФайлаНаСервере = АдресХранилища;
ФайлДляЗагрузки = Результат;
ПараметрыФормы = новый Структура("Основание, АдресФайлаНаСервере, ФайлДляЗагрузки", ЭтаФорма.ДокументОснование, АдресФайлаНаСервере, ФайлДляЗагрузки);
КонецЕсли;
КонецПроцедуры
// на сервере получаем и записываем его
ДвДанные = ПолучитьИзВременногоХранилища(АдресФайлаНаСервере);
Имя=ПолучитьИмяВременногоФайла(".xml");
ДвДанные.Записать(имя);
Показать//Дальше все делаешь, что нужно он уже на сервере
&НаКлиенте
Функция ПолучитьОбъект ()
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();
Сообщить("Итого - " + ЭтаФорма.рекТаблицаЗагрузки.Итог("Сумма"));
КонецФункции
&НаКлиенте
Процедура КнопкаЗагрузить(Команда)
Если НЕ ПроверитьСуществованиеФайла(СокрЛП(рекИмяФайлаОбмена)) Тогда Возврат КонецЕсли;
ПолучитьОбъект();
КонецПроцедуры
Показатькак то так.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот