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

Добавление данных в документ по средством обработки

Автор Dmitry Pyshkarev, 01 июл 2020, 14:42

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

Dmitry Pyshkarev

Доброго времени суток. Есть такая задача: необходимо заполнить табличную часть "Товары" документа ПоступленияТоваровУслуг, через обработку ЧтениеЭксель, где в табличной части "Данные" заполнены определенные реквизиты которые могут отличаться от порядка реквизитов в табличной части "Товары".

Вопрос: Как в обработке получить данные о документе, который вызвал обработку, и как заполнить подходящие поля из таблицы "Данные" в таблицу "Товары" документа, при условии что документ может быть еще не проведен или же записан.

Код обработчика, который есть пока что.

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

//Диалог выбора файла
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
//ДиалогВыбора.Заголовок = "Выберите файл";

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

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

&НаКлиенте
Процедура Прочитать(Команда)   

Объект.Данные.Очистить();

//подключаемся к эксель
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(Объект.Файл);
Состояние("Обработка файла Microsoft Excel...");
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;

//Открываем необходимый лист
Попытка
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(Объект.Файл)+" не соответствует необходимому формату! Первый лист не найден!");
Excel.ОтменитьТранзакцию();
Возврат;
КонецПопытки;

НС = 2;
Пока НС <= Объект.КоличествоСтрок Цикл
Состояние("Файл "+Строка(Объект.Файл)+": Обрабатывается первый лист "+Строка(Формат(?(Объект.КоличествоСтрок=0,0,((100*НС)/Объект.КоличествоСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
НоваяСтрока = Объект.Данные.Добавить();
//заполнение списока значениями
НоваяСтрока.Наименование = Excel.Cells(НС, 1).Text;
НоваяСтрока.Цена = Excel.Cells(НС, 2).Text;
НоваяСтрока.Валюта = Excel.Cells(НС, 3).Text;
НоваяСтрока.Код = Excel.Cells(НС, 4).Text;
НоваяСтрока.НаименованиеДляПечати = Excel.Cells(НС, 5).Text;
НоваяСтрока.Артикул = Excel.Cells(НС, 6).Text;
НоваяСтрока.Количество = Excel.Cells(НС, 7).Text;

НС = НС +1;
КонецЦикла;         


//Объект.Файл.Вставить(0,ИмяФайла,ИмяФайла);
//Закрытие Эксель после выполнения процедуры
Excel.DisplayAlerts = 0;
Excel.Quit();
Excel.DisplayAlerts = 1;

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

// Здесь начинается вопрос темы.
&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)

    ЗаполнитьДокументНаСервере();

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

&НаСервере
Процедура ЗаполнитьДокументНаСервере()

//

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











Код для открытия формы обработчика в документе ПриобретениеТоваровУслуг

&НаКлиенте
Процедура ЗаполнитьИзФайла(Команда)
    ПолучитьФорму("Обработка.ЧтениеЭксель.Форма.Форма").Открыть();

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


LexaK

что за база? как правило в типовых уже есть такой механизм, возьмите готовое решение 

можно попробовать универсальную обработку
ЗагрузкаДанныхИзТабличногоДокумента_УФ
требуются минимальные настройки, позволяет загружать любые данные в любые документы, справочники
если помогло нажмите: Спасибо!

Dmitry Pyshkarev

Цитата: LexaK от 01 июл 2020, 15:35
что за база? как правило в типовых уже есть такой механизм, возьмите готовое решение 

УПП 2 , если правильно понял вопрос.


В типовом решении слишком сложно написан код, не понимаю как там передаются значения.
В общем нужно свое решение на подобие типового, только проще.

Dmitry Pyshkarev

В общем получилось сделать заполнение вот таким путем, естественно под свои реквизиты код.



&НаКлиенте
Процедура ЗаполнитьДокумент(Команда)
Форма=  ПолучитьФорму("Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента");
КопияФормы = Форма.Объект;

ЗаполнитьДокументНаСервере(КопияФормы);
КопироватьДанныеФормы(КопияФормы,
    Форма.Объект);

  ////Объект.Данные.Загрузить(ФормаДокумента.Товары.Выгрузить());
// ФормаНовогоДокумента.Открыть();

Закрыть();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДокументНаСервере(ДанныеФормы) ; 

  Поступление = ДанныеФормыВЗначение(ДанныеФормы,
  Тип("ДокументОбъект.ПриобретениеТоваровУслуг"));     

Для Каждого Строка Из Объект.Данные Цикл


НоваяСтрока = Поступление.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(
Строка.Наименование );

НоваяСтрока.КоличествоУпаковок = Строка.Количество;
НоваяСтрока.Цена = Строка.Цена;

ЗначениеВДанныеФормы(Поступление,ДанныеФормы);

КонецЦикла;


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



Может кому понадобится или кто увидит ошибку и посоветует изменить.
Так же узнал что такую задачу делают через временное хранилище.

LexaK

Dmitry Pyshkarev,
ЦитироватьМожет кому понадобится или кто увидит ошибку и посоветует изменить.
Ошибок может и нет, но ооочччень не оптимально!!!
попробуйте переписать
1.уберите из цикла поиск номенклатуры по Наименованию
2.уберите обновление формы из цикла (и вообще что это, зачем)
3.как то странно из формы получаете документ Объект, а его на сервере можно получить/создать так
Док = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
//заполнить документ
Док.Записать();

можно вернуть ссылку и затем открыть форму

если помогло нажмите: Спасибо!

Dmitry Pyshkarev

Цитата: LexaK от 06 июл 2020, 19:23
Dmitry Pyshkarev,
ЦитироватьМожет кому понадобится или кто увидит ошибку и посоветует изменить.
Ошибок может и нет, но ооочччень не оптимально!!!
попробуйте переписать
1.уберите из цикла поиск номенклатуры по Наименованию
2.уберите обновление формы из цикла (и вообще что это, зачем)
3.как то странно из формы получаете документ Объект, а его на сервере можно получить/создать так
Док = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
//заполнить документ
Док.Записать();

можно вернуть ссылку и затем открыть форму

1. Через цикл ведь подбираю необходимую номенклатуры из базы и передаю ссылку на неё, вроде как.
2. Убрал, все  работает)
3. Так ведь откроет новый документ, а мне бы уже открытый изменить.
4. Да не оптимальное, сейчас пытаюсь через хранилища реализовать.

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

Рейтинг@Mail.ru

Поиск