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

1С Загрузка данных из зксель

Автор Ульви Мамедов, 22 янв 2019, 17:52

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

Ульви Мамедов

Здравствуйте. Я очень мало знаю русский. Извините за этого. Есть токая задания "Загрузить данные из эксель". Подробнее: В УТ 10.3 Есть Документ.ПоступлениеТоваровУслуг.Товары и в экселе есть колонки номенклатура, количество, цена, сумма. Надо что после выбора и загрузки экселе, в документа (Товары) автоматически заполнялся колонки номенклатура, количество, цена и сумма. Знаю что уже есть токая обработка но мне сома надо написать это. Написал код но есть места которые не знаю как писать. Как исправится с этим?
Огромное Спасибо всем за ранее.
Процедура ТЗЗаполнить()
   
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура");
    ТЗ.Колонки.Добавить("Наименование");
    ТЗ.Колонки.Добавить("Количество");
    ТЗ.Колонки.Добавить("Цена");
    ТЗ.Колонки.Добавить("Сумма");
   
    ТЗ.Колонки.Добавить("Автор", Новый ОписаниеТипов("СписокЗначений"));
       
   
КонецПроцедуры

Функция ПоискПодстрокам(Подстрока, ПодстрокаРасшифровка)

    ПозицияСимвола = Найти(Подстрока,",");
    ПозицияСимволаВРасшифровке = Найти(ПодстрокаРасшифровка,",");
   
    Если ПозицияСимвола <> 0 тогда
          ПерваяНоменклатура = Лев(Подстрока, ПозицияСимвола - 1);
          ПерваяНоменклатураРасшифровка = Лев(ПодстрокаРасшифровка, ПозицияСимволаВРасшифровке - 1);
         
          СЗ.Добавить(ПерваяНоменклатура, ПерваяНоменклатураРасшифровка);
         
          Остаток = СтрДлина(Подстрока) - (СтрДлина(ПерваяНоменклатура)+1);
          ОстатокРасшифровка = СтрДлина(ПодстрокаРасшифровка) - (СтрДлина(ПерваяНоменклатураРасшифровка) + 1);
         
          Возврат ПоискПодстрокам(Прав(Подстрока,Остаток), Прав(ПодстрокаРасшифровка,ОстатокРасшифровка));

    Иначе
        СЗ.Добавить(СокрЛП(Подстрока),СокрЛП(ПодстрокаРасшифровка));
        Возврат ПозицияСимвола;
        КонецЕсли;

КонецФункции // ПоискПодстрокам()

Процедура ПереборСтрокВЭксель()
Эксель = Новый COMОбъект("Excel.Application");
   
    Эксель.Workbooks.Open(ПолеВвода);
    Эксель.Sheets(1).select();
   
    Для Стр = 1 по 28 Цикл
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
        НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
        НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
        НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
       
        ПозицияСимвол = ПоискПодстрокам(СокрЛП(Эксель.Cells(Стр,2).Value),СокрЛП(Эксель.Cells(Стр,3).Value));
        НоваяСтрока.Автор = СЗ;
    КонецЦикла;
   
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();

   

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

Процедура ПереборСтрокТЗ()

    Для Каждого Ст из ТЗ Цикл
       
        //СтрНом = Справочники.Номенклатура.СоздатьЭлемент();  Это пример для справочника а как могу выбрать данные из документа табличные части. Хотел писать как ЭлементыФорму.Товары.ТекущиеДанные но программ не разрешает.
 
        //СпрНом.Наименование = Ст.Номенклатура;
        КонецЦикла;
       
       
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТЗЗаполнить();
   
    ПереборСтрокВЭксель();
   
   
КонецПроцедуры

Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    Диалог = Новый ДиалогВыбораФайла(Режим);
    Диалог.Фильтр = "Формат xlsx (*.xlsx)|*.xlsx|";

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

Luzer1C

Процедура ПереборСтрокВЭксель()
Эксел = Новый COMОбъект("Excel.Application");
Книга = Эксел.WorkBooks.Open(ПолеВвода);
Лист = Книга.WorkSheets(1); // Первый доступный лист в книге
НомерПервойСтроки = 1;
НомерПервойКолонки = 1;
Эксел.DisplayAlerts = False;
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Врем_ТЗ =  Новый ТаблицаЗначений;
Для Счетчик = 1 По ВсегоКолонок Цикл
ТЗ.Колонки.Добавить("Колонка" + Счетчик, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
КонецЦикла;
Область = Лист.Range(Лист.Cells(НомерПервойСтроки, НомерПервойКолонки), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();

Для Счетчик = 0 По ВсегоКолонок - 1 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;

Эксел.Application.Quit();
КонецПроцедуры

Такой код будет работать намного быстрее.
Потом можно перебирать ТЗ по строкам и добавлять позиции в документ.
Для каждого СтрТЗ Из ТЗ Цикл
СтрТЧ = Товары.Добавить();
СтрТЧ.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрТЗ.Колонка1);
СтрТЧ.Количество = Число(СтрЗаменить(СтрТЗ.Колонка2, ",", "."));
КонецЦикла;

И так далее.
Халамбалам.

Геннадий ОбьГЭС

Цитата: Ульви Мамедов от 22 янв 2019, 17:52Знаю что уже есть токая обработка но мне сома надо написать это
Для начала возьмите готовое и научитесь изменять - отлаживать
http://www.online-ufa.ru/content/articles/loading_data_into_1C_from_excel_part_3/

http://forum-1c.ru/index.php?topic=64200.0

Luzer1C

Геннадий ОбьГЭС, тоже вариант. Совсем про него забыл.
Халамбалам.

Теги:  

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

Рейтинг@Mail.ru Rambler's Top100

Поиск