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

Создание обработки загрузки данных в документ из excel

Автор Черника, 25 янв 2022, 14:20

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

Черника

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

Я уже все перепробовала  :(

Задача: Создать обработку для загрузки данных из excel в документ



&НаКлиенте
Процедура ВыборФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр                      = НСтр("ru='CSV файл (*.xlsx)|*.xlsx'");
ДиалогВыбораФайла.Заголовок                   = НСтр("ru='Выберите xlsx файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр     = Ложь;
ДиалогВыбораФайла.Расширение                  = "csv";
ДиалогВыбораФайла.ИндексФильтра               = 0;
ДиалогВыбораФайла.ПолноеИмяФайла              = ПутьКФайлу;
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;

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

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

&НаСервере
Процедура ЗагрузитьНаСервере()
Док = Новый ТекстовыйДокумент();
Док.Прочитать(ПутьКФайлу);
Для А = 1 По Док.КоличествоСтрок() Цикл 
Строка = Док.ПолучитьСтроку(А);
Массив = СтрРазделить(Строка, ";");
Контрагент = Массив[0];   
Сумма = Массив[1];
ДатаВыдачи = Массив[2]; 
НовыйРКО = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
НовыйРКО.Сумма = Сумма;
НовыйРКО.ДатаВыдачи = ДатаВыдачи;
НовыйРКО.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Контрагент);


НовыйРКО.Дата = ТекущаяДата();
НовыйРКО.Записать();




Сообщить ("Загрузка завершена!");

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

&НаКлиенте
Процедура Загрузить(Команда)
ЗагрузитьНаСервере();
КонецПроцедуры

28.jpg

Ошибка:
Индекс находится за границами массива
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(27)}:      ДатаВыдачи = Массив[2];     
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(46)}:   ЗагрузитьНаСервере();

Черника

&НаСервере
Процедура ЗагрузитьНаСервере()
Док = Новый ТекстовыйДокумент();
Док.Прочитать(ПутьКФайлу);
Для А = 1 По Док.КоличествоСтрок() Цикл 
Строка = Док.ПолучитьСтроку(А);
Массив = СтрРазделить(Строка, ";");
Контрагент = Массив[0];   
Сумма = Массив[1];
ДатаВыдачи = Массив[2]; 
НовыйРКО = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
НовыйРКО.Сумма = Сумма;
НовыйРКО.ДатаВыдачи = ДатаВыдачи;
НовыйРКО.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Контрагент);


НовыйРКО.Дата = ТекущаяДата();
НовыйРКО.Записать();



    КонецЦикла;
Сообщить ("Загрузка завершена!");

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

&НаКлиенте
Процедура Загрузить(Команда)
ЗагрузитьНаСервере();
КонецПроцедуры

LexaK

самое простое, это взять уже какую-то существующую обработку по загрузки данных/документов из Екселя в 1С.
Можно посмотреть, проанализировать что и как было сделано, возможно немного адаптировать под свою задачу,
Это и быстрее и надежнее и понятнее.
 
Конечно если у вас задача именно в обучении состоит, и именно на своих ошибках, тогда конечно.

вот подсказка как избежать указанную ошибку
у вас строка должна содержать какой-то набор/количество данных, которые вы разделяете на массив.
в вашем случае надо добавить хотя бы простенькую проверку на количество элементов массива, примерно так

    Для А = 1 По Док.КоличествоСтрок() Цикл 
        Строка = Док.ПолучитьСтроку(А);
        Массив = СтрРазделить(Строка, ";");
/////добавьте такую проверку
Если Массив.Количество() < 3 Тогда
Сообщить("Не верная строка данных: " + Строка);
Продолжить;
КонецЕсли;
.....

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

Черника

LexaK, Простите конечно, но я аж испугалась, от такой ошибки29.jpg


Ошибка при вызове метода контекста (ЗагрузитьНаСервере)
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(48)}:   ЗагрузитьНаСервере();
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'message':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}message
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Text':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}Text
по причине:
Ошибка при записи XDTO
по причине:
Текст XML содержит недопустимый символ в позиции 32 :

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'message':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}message
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Text':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}Text
по причине:
Ошибка при записи XDTO
по причине:
Текст XML содержит недопустимый символ в позиции 32 :
Не верная строка данных: ?€9LмТ™ИsbgЩ®|Иl!хщUSh9i°bћr:"y_dlАуD›їэ|-NњИR"4ш2ПGЗ% хZґ4сЛќyД7   Г«ИрЙ,‹ЁЮНе верная строка данных: ?€9LмТ™ИsbgЩ®|Иl!хщUSh9i°bћr:"y_dlАуD›їэ|-NњИR"4ш2ПGЗ% хZґ4сЛќyД7   Г«ИрЙ,‹ЁЮ

Черника

Ошибка: Ошибка при вызове метода контекста (ЗагрузитьНаСервере)
{ВнешняяОбработка.Загрузка.Форма.Форма.Форма(48)}:   ЗагрузитьНаСервере();
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'message':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}message
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Text':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}Text
по причине:
Ошибка при записи XDTO
по причине:
Текст XML содержит недопустимый символ в позиции 32 :

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'message':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}message
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Text':
   форма: Элемент
   имя: {http://v8.1c.ru/8.1/data/enterprise}Text
по причине:
Ошибка при записи XDTO
по причине:
Текст XML содержит недопустимый символ в позиции 32 :
Не верная строка данных: ?€9LмТ™ИsbgЩ®|Иl!хщUSh9i°bћr:"y_dlАуD›їэ|-NњИR"4ш2ПGЗ% хZґ4сЛќyД7   Г«ИрЙ,‹ЁЮНе верная строка данных: ?€9LмТ™ИsbgЩ®|Иl!хщUSh9i°bћr:"y_dlАуD›їэ|-NњИR"4ш2ПGЗ% хZґ4сЛќyД7   Г«ИрЙ,‹ЁЮ

LexaK

нет, выше вы писали про такую ошибку
ЦитироватьОшибка:
Индекс находится за границами массива

последняя ошибка, это не правильное чтение файла,
что бы не было ее, вам надо сначала подготовить файл XLS, явно преобразовать его и сохранить в файл CSV. 
если помогло нажмите: Спасибо!

Черника

LexaK, Так не удобно если честно, но не можите мне подсказать, как сделать так что бы мой код работал. Не понимаю :(

LexaK

так выше было предложение, возьмите уже готовую обработку по загрузке документов из файла Ексель.
И все будет отлично работать!
есть платные, есть бесплатные, с инструкцией и без (с интуитивно понятным интерфейсом)
(что-то есть даже на диске ИТС, или в сети, в яндексе, наберите строку: загрузка данных из файла)
если помогло нажмите: Спасибо!

nEo161

У меня такая выгрузка работает

&НаСервереБезКонтекста
Процедура ВыгрузитьНаСервере(НазваниеСправочника,ПутьКФайлу)
   ApplicationExcel = НовыйCOMОбъект("Excel.Application");
   ApplicationExcel.Visible = Истина;
   ApplicationExcel.Workbooks.Open(ПутьКФайлу);
   ApplicationExcel.Sheets(1).Cells(1, 1).Value = "Код";
   ApplicationExcel.Sheets(1).Cells(1, 2).Value = "Наименование";
   Если НазваниеСправочника = "Номенклатура" Тогда
      Выборка = Справочники.Номенклатура.Выбрать();
   ИначеЕслиНазваниеСправочника = "Контрагенты" Тогда
      Выборка = Справочники.Контрагенты.Выбрать();
   ИначеЕслиНазваниеСправочника = "Склады" Тогда
       Выборка = Справочники.Склады.Выбрать();   
   ИначеЕслиНазваниеСправочника = "Валюты" Тогда
       Выборка = Справочники.Валюты.Выбрать();
   КонецЕсли;
   Сч=2;
   Пока Выборка.Следующий() Цикл   
      ApplicationExcel.Sheets(1).Cells(Сч, 1).Value = Выборка.Код;
      ApplicationExcel.Sheets(1).Cells(Сч,2).Value = Выборка.Наименование;   
      Сч=Сч+1;
   КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Выгрузить(Команда)
   ВыгрузитьНаСервере(ВыборСправочника,ПутьКФайлу);
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогВыбораФайла.Фильтр                      = НСтр("ru='CSV файл (*.xlsx)|*.xlsx'");
   ДиалогВыбораФайла.Заголовок                   = НСтр("ru='Выберите xlsx файл'");
   ДиалогВыбораФайла.ПредварительныйПросмотр     = Ложь;
   ДиалогВыбораФайла.Расширение                  = "csv";
   ДиалогВыбораФайла.ИндексФильтра               = 0;
   ДиалогВыбораФайла.ПолноеИмяФайла              = ПутьКФайлу;
   ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
   Если ДиалогВыбораФайла.Выбрать() Тогда
      ПутьКФайлу = ДиалогВыбораФайла.ПолноеИмяФайла;
   КонецЕсли;      
КонецПроцедуры

Теги:

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

Рейтинг@Mail.ru

Поиск