Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 июл 2024, 19:43

Загрузка Эксель в документ с внешней обработки

Автор Franc07, 10 июл 2024, 13:13

0 Пользователей и 1 гость просматривают эту тему.

Franc07

Добрый день. Задача с помощью внешней обработки загрузить данные из эксель файла в табл.часть документа. Сделал загрузку в таблчасть обработки, как дальше загрузить в документ не пойму. ПутьВыбораФайла - реквизит выбора файла;ТаблЗнач- табл.часть обработки


Прошу помогите...застрял, вот код:



&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
ЭтотОбъект.Открыть();
КонецПроцедуры


&НаКлиенте
Процедура ПутьВыбораФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выбор файла";
Диалог.Фильтр = "Excel файлы(*.xls; *.xlsx)|*.xls; *.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.МножественныйВыбор = Ложь;
Диалог.ПолноеИмяФайла = ПутьВыбораФайла;

Если Диалог.Выбрать() Тогда
ПутьВыбораФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;

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

&НаСервере
Процедура ЗагрузитьВТабличнуюЧастьОбработки(АдресВременногоХранилища)
ТабДок = Новый ТабличныйДокумент;

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

Попытка
ТабДок.Прочитать(ПутьКФайлуНаСервере,СпособЧтенияЗначенийТабличногоДокумента.Зна чение);

Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось прочитать указанный файл" + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат
КонецПопытки;

КоличествоСтрок = ТабДок.ВысотаТаблицы;

ДанныеФайла = Новый ТаблицаЗначений;
ДанныеФайла.Колонки.Добавить("ФИО");
ДанныеФайла.Колонки.Добавить("Сумма");

Для НомерСтроки = 1 По КоличествоСтрок Цикл
СтрокаДанных = ДанныеФайла.Добавить();
Строк= ТабДок.Область(НомерСтроки, 2).Текст;
СтрокаСумма = СтрЗаменить(Строк,".",",");
СтрокаДанных.Сумма = Число(СтрокаСумма);
СтрокаДанных.ФИО= ТабДок.Область(НомерСтроки, 3).Текст;
КонецЦикла;

ТаблЗнач.Загрузить(ДанныеФайла);

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



&НаКлиенте
Процедура ЗагрузкаВОбработку(Команда)
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьВыбораФайла); //создаем переменную с данными из переменной ПутьКФайлу, передаем параметром.
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла); //загружаем эксель во временное хранилище

ЗагрузитьВТабличнуюЧастьОбработки(АдресВременногоХранилища);

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

Максим75

Franc07, ну а дальше прямо на сервере пишите что-то такое:

НайденныйДокумент = Документы.ЧекККМ.СоздатьДокумент(); - это создаете сам документ, естественно у Вас другое название

В цикле обходите таблицу значений, которую получили

НовыйТовар = НайденныйДокумент .Товары.Добавить(); - это добавляете новую строку табличной части, естественно у Вас может называться табличная часть по-другому
и заполняете нужные реквизиты табличной части, типа такого НовыйТовар.Товар = что-то из таблицы значений

Franc07

Максим75, мне не нужно создавать документ программно. Пользователь должен создать документ и с помощью внешней обработки (которую я прикреплю к документу через доп.отчеты и обработки) заполнить табличную часть документа. Вот на этом та я и застрял.

Максим75

Franc07, а-а-а, ну тогда сам объект будет доступен через ВладелецФормы.Объект.Ссылка, потому как Вы будете вызывать эту обработку из другого объекта.

и в процедуре ВыполнитьКоманду вызываете что-то серверное, туда передаете именно вот это  ВладелецФормы.Объект.Ссылка
и уже на сервере работаете с объектом, т.е. можно уже этому объекту добавлять в табличную часть и т.д.
главное, чтобы объект был в базе, т.е. записан.

вот посмотрите, я так какой-то документ у себя в Рознице остатками заполняю

&НаСервере
Функция ЗаполнитьОстаткиТоваров(тОбъект)
Запрос = Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
             | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
             | ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
             | СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Колво,
             | МАКСИМУМ(ВложенныйЗапрос.Штрихкод) КАК Штрихкод
             |ПОМЕСТИТЬ ВТ_СписокНоменклатуры
             |ИЗ
             | РегистрНакопления.ТоварыНаСкладах.Остатки(&НаДату, Склад = &НужныйСклад) КАК ТоварыНаСкладахОстатки
             | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
             | МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод,
             | Штрихкоды.Характеристика КАК Характеристика,
             | Штрихкоды.Владелец КАК Владелец
             | ИЗ
             | РегистрСведений.Штрихкоды КАК Штрихкоды
             | ГДЕ
             | Штрихкоды.Штрихкод <> """"
             | И ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 1) ПОДОБНО ""[0-9]%""
             |
             | СГРУППИРОВАТЬ ПО
             | Штрихкоды.Владелец,
             | Штрихкоды.Характеристика) КАК ВложенныйЗапрос
             | ПО ТоварыНаСкладахОстатки.Номенклатура = ВложенныйЗапрос.Владелец
             | И ТоварыНаСкладахОстатки.Характеристика = ВложенныйЗапрос.Характеристика
             |
             |СГРУППИРОВАТЬ ПО
             | ТоварыНаСкладахОстатки.Номенклатура,
             | ТоварыНаСкладахОстатки.Характеристика
             |;
             |
             |////////////////////////////////////////////////////////////////////////////////
             |ВЫБРАТЬ
             | ВТ_СписокНоменклатуры.Штрихкод КАК Штрихкод,
             | СУММА(ВТ_СписокНоменклатуры.Колво) КАК Колво
             |ПОМЕСТИТЬ ВТ_ОстатокПоШтрихкоду
             |ИЗ
             | ВТ_СписокНоменклатуры КАК ВТ_СписокНоменклатуры
             |
             |СГРУППИРОВАТЬ ПО
             | ВТ_СписокНоменклатуры.Штрихкод
             |;
             |
             |////////////////////////////////////////////////////////////////////////////////
             |ВЫБРАТЬ
             | ВТ_СписокНоменклатуры.Номенклатура КАК Номенклатура,
             | ВТ_СписокНоменклатуры.Характеристика КАК Характеристика,
             | ЕСТЬNULL(ВТ_СписокНоменклатуры.Штрихкод, """") КАК Штрихкод,
             | ВТ_СписокНоменклатуры.Колво КАК КоличествоТовара,
             | ВЫБОР
             | КОГДА ЕСТЬNULL(ВТ_ОстатокПоШтрихкоду.Колво, 0) = 0
             | ТОГДА ВТ_СписокНоменклатуры.Колво
             | ИНАЧЕ ВТ_ОстатокПоШтрихкоду.Колво
             | КОНЕЦ КАК КоличествоУпаковок
             |ИЗ
             | ВТ_СписокНоменклатуры КАК ВТ_СписокНоменклатуры
             | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстатокПоШтрихкоду КАК ВТ_ОстатокПоШтрихкоду
             | ПО ВТ_СписокНоменклатуры.Штрихкод = ВТ_ОстатокПоШтрихкоду.Штрихкод
             |
             |УПОРЯДОЧИТЬ ПО
             | Штрихкод,
             | КоличествоУпаковок УБЫВ";

Запрос.УстановитьПараметр("НаДату",КонецДня(тОбъект.Дата));
Запрос.УстановитьПараметр("НужныйСклад",тОбъект.Магазин.СкладПоступления);

РезультатЗапроса = Запрос.Выполнить();


//тзТовары = РезультатЗапроса.Выгрузить();
Выборка = Запрос.Выполнить().Выбрать();

тДок = тОбъект.ПолучитьОбъект();
тДок.Товары.Очистить();               

//тДок.Товары.Загрузить(тзТовары );
ТекущийШК="";
Пока Выборка.Следующий() цикл
Если (ТекущийШК<>Выборка.Штрихкод) и ЗначениеЗаполнено(Выборка.Штрихкод) тогда
НоваяСтрока = тДок.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Характеристика = Выборка.Характеристика;
// НоваяСтрока.ШтрихКод = Выборка.Штрихкод;
НоваяСтрока.КоличествоУпаковок = Выборка.КоличествоУпаковок;
// НоваяСтрока.Код = Выборка.Номенклатура.Код;
// НоваяСтрока.Артикул = Выборка.Номенклатура.Артикул;
// НоваяСтрока.КолвоПоШтрихкоду = Выборка.КолвоПоШтрихкоду;

ТекущийШК=Выборка.Штрихкод;
ИначеЕсли НЕ ЗначениеЗаполнено(Выборка.Штрихкод) тогда
НоваяСтрока = тДок.Товары.Добавить();
//ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Характеристика = Выборка.Характеристика;
// НоваяСтрока.ШтрихКод = Выборка.Штрихкод;
НоваяСтрока.КоличествоУпаковок = Выборка.КоличествоУпаковок;
//НоваяСтрока.Код = Выборка.Номенклатура.Код;
//НоваяСтрока.Артикул = Выборка.Номенклатура.Артикул;
//НоваяСтрока.КолвоПоШтрихкоду = Выборка.КолвоПоШтрихкоду;
// ТекущийТовар=Выборка.Номенклатура;
КонецЕсли;

КонецЦикла;

тДок.Записать(РежимЗаписиДокумента.Запись);

Возврат "";
КонецФункции

&НаКлиенте
Процедура ОбработатьФайлНаКлиенте() Экспорт

ссс = ЗаполнитьОстаткиТоваров(ВладелецФормы.Объект.Ссылка);

ВладелецФормы.Элементы.Товары.Обновить();
ВладелецФормы.ОбновитьОтображениеДанных();
ВладелецФормы.ЭтаФорма.Прочитать();

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


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

ОбработатьФайлНаКлиенте();
КонецПроцедуры

antoneus

Ну сразу-то записывать - это, наверно, лишнее, пусть юзер сам решает что ему с этой красотой делать. На клиенте просто стучимся к ВладелецФормы.Объект.Товары и заполняем в цикле.

Franc07

не закидывайте только тапками пишу в ту же процедуру Процедура ЗагрузитьВТабличнуюЧастьОбработки(АдресВременногоХранилища)

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

где НовСтрока.Объект - реквизит
НовСтрока.Значение - реквизит
ДанныеДляРасчетаЗарплаты - документ
ЗначенияПоказателей - табл. часть документа
ТаблЗнач - табл.часть обработки

Синтаксис выдает ошибку {ВнешняяОбработка.ЗагрузкаЭксельВДокументОбразец.Форма.Форма.Форма(116,17)}: Переменная не определена (ДанныеДляРасчетаЗарплаты)
НоваяСтрока = <<?>>ДанныеДляРасчетаЗарплаты.ЗначенияПоказателей.Добавить(); (Проверка: Сервер)

Максим75

Franc07, НоваяСтрока = ДанныеДляРасчетаЗарплаты.ЗначенияПоказателей.Добавить(); вот здесь вместо ДанныеДляРасчетаЗарплаты пишите ДокОбъект.
Вы же получаете этот объект. А что такое ДанныеДляРасчетаЗарплаты никто не знает, и система тоже.

Franc07

Максим75, выдает ошибку
Поле объекта не обнаружено (ДанныеДляРасчетаЗарплаты)
{ВнешняяОбработка.ЗагрузкаЭксельВДокументОбразец.Форма.Форма.Форма(114)}:ДокОбъе кт = Объект.ДанныеДляРасчетаЗарплаты.ПолучитьОбъект();
{ВнешняяОбработка.ЗагрузкаЭксельВДокументОбразец.Форма.Форма.Форма(140)}:Загрузи тьВТабличнуюЧастьДокумента(АдресВременногоХранилища);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]


вот такой код сейчас у меня:

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
ЭтотОбъект.Открыть();
КонецПроцедуры


&НаКлиенте
Процедура ПутьВыбораФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выбор файла";
Диалог.Фильтр = "Excel файлы(*.xls; *.xlsx)|*.xls; *.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.МножественныйВыбор = Ложь;
Диалог.ПолноеИмяФайла = ПутьВыбораФайла;

Если Диалог.Выбрать() Тогда
ПутьВыбораФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;

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

&НаСервере
Процедура ЗагрузитьВТабличнуюЧастьОбработки(АдресВременногоХранилища)
ТабДок = Новый ТабличныйДокумент;

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

Попытка
ТабДок.Прочитать(ПутьКФайлуНаСервере,СпособЧтенияЗначенийТабличногоДокумента.Зна чение);

Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось прочитать указанный файл" + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат
КонецПопытки;

КоличествоСтрок = ТабДок.ВысотаТаблицы;

ДанныеФайла = Новый ТаблицаЗначений;
ДанныеФайла.Колонки.Добавить("ФИО");
ДанныеФайла.Колонки.Добавить("Сумма");

Для НомерСтроки = 1 По КоличествоСтрок Цикл
СтрокаДанных = ДанныеФайла.Добавить();
Строк= ТабДок.Область(НомерСтроки, 2).Текст;
СтрокаСумма = СтрЗаменить(Строк,".",",");
СтрокаДанных.Сумма = Число(СтрокаСумма);
СтрокаДанных.ФИО= ТабДок.Область(НомерСтроки, 3).Текст;
КонецЦикла;

ТаблЗнач.Загрузить(ДанныеФайла);

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

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



&НаКлиенте
Процедура ЗагрузкаВДокумент(Команда)
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьВыбораФайла); //создаем переменную с данными из переменной ПутьКФайлу, передаем параметром.
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла); //загружаем эксель во временное хранилище

ЗагрузитьВТабличнуюЧастьОбработки(АдресВременногоХранилища);

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск