Имя: Пароль:
1C
1C 7.7
v7: Из екселя в 1с
0 Christina_
 
11.06.12
10:31
Есть внешняя обработка, самая простая, две колонки, товар, сумма, должны заполнится в самый простой документ планирвоание, две колонки, товар, сумма.

Скачала кучу обработок, вроде составила. Выдает ошибку

Товар   =  Excel.Cells(i,Товар).Value;          
{\\TSCLIENT\D\ПЛАНИРОВАНИЕ.ERT(20)}: :


Что может быть за оно?
1 Tatitutu
 
11.06.12
10:35
(0) смотри что в этой ячейке
2 Christina_
 
11.06.12
10:36
в обработке в этой ячейке я задаю номер колонки товара
3 Tatitutu
 
11.06.12
10:37
(2) понятно.. весь код в студию
4 Christina_
 
11.06.12
10:38
Функция СоздатьMSExcel()
   Попытка
       Excel = СоздатьОбъект("Excel.Application");
   Исключение
       Предупреждение(ОписаниеОшибки());
       ВызватьИсключение;
   КонецПопытки;
   Возврат Excel;
КонецФункции//*
//*******************************************
Функция Обработка(Excel)  
   
   ОчиститьОкносообщений();
   
   СПРТовар = Создатьобъект("Справочник.Товары");
   ДокПлан = СоздатьОбъект("Документ.Планирование");
   ДокПлан.НайтиДокумент(Планир);
   Для i=1 По Строки Цикл
       Товар   =  Excel.Cells(i,Товар).Value;          
       Попытка
           План   =  Число(Excel.Cells(i,План).Value);    
       Исключение
       КонецПопытки;  
       ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТовар .ТекущийЭлемент();        
       ДокПлан.Сумма   = план;
   КонецЦикла;
Планир.Записать();
КонецФункции

//*******************************************
Процедура Сформировать()
Excel=СоздатьMSExcel();
Попытка
   Если Excel.Workbooks.Open(Файл) = 0 Тогда
       Предупреждение("База не открыта!");
       Возврат;    
       Excel.Quit();
   КонецЕсли;  
Исключение
   Предупреждение(ОписаниеОшибки());
   Excel.Quit();
   Возврат;
КонецПопытки;  
Обработка(Excel);
КонецПроцедуры
//*******************************************
Процедура ВыбрФайл(ИмяФайла)
Перем Каталог;  

ТипФайла="Файлы Microsoft Excel (*.xls) |*.xls";

Если ФС.ВыбратьФайл(0, ИмяФайла, Каталог, "Выберите файл", ТипФайла)=1 Тогда
   ИмяФайла=Каталог+ИмяФайла;
КонецЕсли;
КонецПроцедуры      
//*******************************************
5 Christina_
 
11.06.12
10:39
в диалоге обработки: Файл - файл Екселя, Планир - документ, строки - кол-во строк файла, товар - колонка товар, план - колонка плана
6 Любопытная
 
11.06.12
10:41
(4) А чему i сначала равно?
7 vde69
 
11.06.12
10:42
8 Tatitutu
 
11.06.12
10:42
Прыг-Скок...или из MS EXCEL в 1С (7.7) TiS* (открытый код - бесплатно)
http://infostart.ru/public/83084/
9 Christina_
 
11.06.12
10:45
они огромные такие, обраотки..но ок, попробую. спасибо.
10 Tatitutu
 
11.06.12
10:45
(7) це 7.7 твоя еще не время
11 vde69
 
11.06.12
10:50
(10) при чем тут версия, перевести - 10 минут...

зато там обработаны практически все грабли, да и скачивать ничего не нужно
12 Christina_
 
11.06.12
10:59
а что в моей не так обработке, не подскажите?
13 Tatitutu
 
11.06.12
11:01
(13) ты не ответила на вопрос
Товар у тебя числовой реквизит? чему равен ?
14 Christina_
 
11.06.12
11:03
Товар   =  Excel.Cells(i,Товар).Value;
товар1 - это имя товара, просто переменная, товар в скобках, это число, которое я укажу в диалоге ("колонка товара")
15 vde69
 
11.06.12
11:03
(13) я телепатирую,

у нее в екселе формула, или пустая ячейка
16 Christina_
 
11.06.12
11:05
у меня в экселе в первой колонке код, во второй наименование товара, в третей
план, мне нужны 2 и 3
17 Christina_
 
11.06.12
11:06
(15) нет формул..
18 Tatitutu
 
11.06.12
11:08
(14)

еще раз подсказываю

Товар = что то (Товар)
это что ты хочешь получить

а про реквизит ты пишеш что Товар1

т.е
Товар   =  Excel.Cells(i,Товар).Value;

см.на ТОВАР
19 dangerouscoder
 
11.06.12
11:08
(17) Грузи всегда сначала в тз а потом после визуальной проверки принимай решение грузить в док или нет..
20 Tatitutu
 
11.06.12
11:09
напиши так

Товар   =  Excel.Cells(i,НомКолонки).Value;

а не

Товар   =  Excel.Cells(i,Товар).Value;
21 Масянька
 
11.06.12
11:10
Я правильно понимаю, что:
Товар   =  Excel.Cells(i,Товар).Value;  - в первом случае - это одно, а во втором это другое?
22 Масянька
 
11.06.12
11:10
(20) Я правильно понимаю.....
23 Christina_
 
11.06.12
11:11
имя   =  Excel.Cells(i,Товар).Value; исправила на это

дает новую ошибку
Планир.Записать();
{\\TSCLIENT\D\ПЛАНИРОВАНИЕ.ERT(29)}: Не выбран документ!

хотя все выбрано
24 Christina_
 
11.06.12
11:12
(22) правильно, исправила, извините..
25 Tatitutu
 
11.06.12
11:12
ДокПлан.Записать();
26 Christina_
 
11.06.12
11:12
вот дура..
27 Christina_
 
11.06.12
11:20
а можно ли дописать так, чтобы при завершении обработки открывался заполненый документ?

и еще вопрос...обработка работает, если я создаю документ, пустой, а потом при загрузке обработки его выбираю. так должно быть?
28 dangerouscoder
 
11.06.12
11:25
У тебя переменная -  Планир откуда берется?
См. ОткрытьФорму()
29 Tatitutu
 
11.06.12
11:30
(27)
вместо
 ДокПлан.НайтиДокумент(Планир);
напиши
 ДокПлан.Новый();

в конце ОткрытьФорму(Докплан.ТекущийДокумент());
30 Christina_
 
11.06.12
11:34
(28) неверно написала..нужно не планир, а докплан.

(29) спасибо, сейчас попробую
31 Christina_
 
11.06.12
11:41
так получилось все..но ничего не заполняет...пишет столько строк сколько задаешь и все  пустые...
32 Tatitutu
 
11.06.12
11:47
(31) вот это не правильно - не хочешь качать - думай
ДокПлан.Товар = СПРТовар .ТекущийЭлемент();
33 Tatitutu
 
11.06.12
11:48
таже ошибка что и товар
План   =  Число(Excel.Cells(i,План).Value);
34 Christina_
 
11.06.12
12:06
(33) это исправила уже
35 Christina_
 
11.06.12
12:10
(34) это и справила уже, стал заполнять сумму)

(32) мы сначала найти товар должны в справочнике, по коду например, так?
36 Tatitutu
 
11.06.12
12:12
да
37 Christina_
 
11.06.12
12:13
или можно вообще убрать справочник
38 Christina_
 
11.06.12
12:44
Функция Обработка()
   СПРТовар = СоздатьОбъект("Справочник.Товары");
   ДокПлан = СоздатьОбъект("Документ.Планирование");
   ДокПлан.Новый();
   Попытка
       Excel = СоздатьОбъект("Excel.Application");
       РабочиеКниги=Excel.WorkBooks;
   ДокКнига=РабочиеКниги.Open(СокрЛП(Файл));
   ДокЛист=ДокКнига.Worksheets(1);
   Исключение
       Предупреждение(ОписаниеОшибки());
       ВызватьИсключение;
   КонецПопытки;
   Возврат Excel;
   Флаг = 0;
   Ном = НомПер;
   ОчиститьОкносообщений();
   Пока Флаг = 0 Цикл
       Н = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);    
       Н = "0000" + Н;
       Н = Прав(Н, 4);
       Сообщить(Н);
       Если СПРТовар.НайтиПоКоду(Н) = 0 Тогда
           Сообщить("Номенклатура на найдена!");
               Иначе
ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТовар.ТекущийЭлемент();        
       ДокПлан.Сумма   = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);;
Конецесли;
   КонецЦикла;
ДокПлан.Записать();
ОткрытьФорму(ДокПлан.ТекущийДокумент());
КонецФункции
//*******************************************
Процедура ВыбрФайл(ИмяФайла)
Перем Каталог;  

ТипФайла="Файлы Microsoft Excel (*.xls) |*.xls";

Если ФС.ВыбратьФайл(0, ИмяФайла, Каталог, "Выберите файл", ТипФайла)=1 Тогда
   ИмяФайла=Каталог+ИмяФайла;
КонецЕсли;
КонецПроцедуры      
//*******************************************

вот что получилось у меня...
39 Ork
 
11.06.12
12:46
(38) Все не читал. Код после Возврат Excel; не выполнится никогда.
40 Tatitutu
 
11.06.12
12:48
жесть
41 Christina_
 
11.06.12
12:49
(40) понятно
42 Tatitutu
 
11.06.12
12:50
все не так , даже описывать не хочу
цикл у тебя будет вечным
где флаг сбрасывается в 1
43 Ork
 
11.06.12
12:50
+(39)
Вот здесь :

   Флаг = 0;
   Ном = НомПер;
   ОчиститьОкносообщений();
   Пока Флаг = 0 Цикл
       Н = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);    
       Н = "0000" + Н;
       Н = Прав(Н, 4);
       Сообщить(Н);
       Если СПРТовар.НайтиПоКоду(Н) = 0 Тогда
           Сообщить("Номенклатура на найдена!");
       Иначе
           ДокПлан.НоваяСтрока();
           ДокПлан.Товар = СПРТовар.ТекущийЭлемент();        
           ДокПлан.Сумма   = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);;
       Конецесли;
   КонецЦикла;

Как программа определит, что пора шабашить с циклом и нужно из него выйти?
44 Christina_
 
11.06.12
12:51
ок. буду разбирать. спасибо.
45 Ork
 
11.06.12
12:54
+(43) Точно не скажу. Но по памяти вот эта вот конструкция :

Если ФС.ВыбратьФайл(0, ИмяФайла, Каталог, "Выберите файл", ТипФайла)=1 Тогда
   ИмяФайла=Каталог+ИмяФайла;
КонецЕсли;

вернет некорректное имя файла. Вместо (например)
"C:\Directory1\filename1.ext" вернет
"C:\Directory1filename1.ext"

Разница в одном слэше.
46 Tatitutu
 
11.06.12
12:55
вот это это нужно в аналоги истории


       Н = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);    
       Н = "0000" + Н;
       Н = Прав(Н, 4);
47 Ork
 
11.06.12
12:55
+(45) Нужно писать : ИмяФайла = Каталог + "\" + ИмяФайла;

Проверь в отладчике или "ИмяФайла" выложи на форму.
48 dangerouscoder
 
11.06.12
12:57
(44) держи готовую обработку для загрузки  в ТЗ
http://help1c.com/faq7/view/544.html
49 Ork
 
11.06.12
13:01
+(46)
Вот это вот тоже:

Пока Флаг = 0 Цикл
   Н = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);    
...
   ДокПлан.Сумма   = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);;
КонецЦикла;

Мало того, что счетчит адреса нигде не изменяется. Так еще и код товара и сумму ТС умудрилась упаковать в одну ячейку.
50 Christina_
 
12.06.12
09:54
(49) я это из готовой взяла и под своё переделала..видимо ошиблась  с обработкой-примером.

спасибо за советы.
51 Mikeware
 
12.06.12
10:12
(50) Может, пока не поздно, уйдешь на вдвое большую зарплату?
52 Christina_
 
12.06.12
10:50
(51) может оставите своё мнение при себе?
53 Mikeware
 
12.06.12
10:56
(52) Почему?
Ваше право его не принимать, но мое право - его озвучивать...
54 Christina_
 
12.06.12
11:04
(53) каждый раз в любой моей теме?
55 Mikeware
 
12.06.12
11:06
(54) Возможно. Потому, что вам темы надо создавать совсем в других форумах
56 Christina_
 
12.06.12
11:06
(55)Скажите в каких.
57 Christina_
 
12.06.12
11:07
(55) если я вас так раздражаю, вы же модератор, может вам проще будет меня удалить отсюда, чтобы не портить мне настроение каждый раз?
58 Mikeware
 
12.06.12
11:10
(56) во всяких там "овуляшках", "журналах лиза" и типа того...
(57) Тут свободная территория. относительно, конечно...
вы вправе появляться и веселить нас своими фееричными вопросами. мы вправе комментировать и портить вам настроение....
59 Christina_
 
12.06.12
11:16
(58) я только начала изучать 1с. И не думаю, что для новичка мои вопросы фееричны и глупы.

и впредь, к вам большая просьба, я ваше мнение на свой счет уже знаю. не нужно мне о нем больше говорить, пожалуйста.
60 Christina_
 
12.06.12
16:59
Функция Обработка(Excel)  
   
   ОчиститьОкносообщений();
   
   СПРТовар = СоздатьОбъект("Справочник.Товары");
   ДокПлан = СоздатьОбъект("Документ.Планирование");    
   ДокПлан.Новый();
   Для i=1 По Строки Цикл
       имя   =  Строка(Excel.Cells(i,Товар).Value);
       Попытка
           код   =  Число(Excel.Cells(i,кккк).Value);    
       Исключение
       КонецПопытки;
       Попытка
           сумма   =  Число(Excel.Cells(i,План).Value);    
       Исключение
       КонецПопытки;
       Если СПРТовар.НайтиПоКоду(код,0) = 1 Тогда
             СПРТовар.НайтиЭлемент(код);
       Если ПустоеЗначение(код) = 1 Тогда
           продолжить;
       КонецЕСли;
       ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТОвар .ТекущийЭлемент();        
       ДокПлан.Сумма   = сумма;
   
       Иначе
   КонецЕсли;
КонецЦикла;
ДокПлан.Записать();
ОткрытьФорму(ДокПлан.ТекущийДокумент());
КонецФункции

вот что у меня в итоге получилось..все заполянет, только почему-то не заполянет наименование.
61 Christina_
 
12.06.12
17:01
если убираю

Тогда
             СПРТовар.НайтиЭлемент(код);
       Если ПустоеЗначение(код) = 1 Тогда
           продолжить;
       КонецЕСли;


тогда заполняет, то добавляет лишние товары
62 Amra
 
12.06.12
17:01
(60) Наименование чего?
63 Maniac
 
12.06.12
17:02
10000 рублей.
64 MishaD
 
12.06.12
17:03
СПРТовар.НайтиЭлемент(код); - это круто
65 Christina_
 
12.06.12
17:16
(62) товар..товар не выводит..
66 dangerouscoder
 
12.06.12
17:24
Попоробуй вото так -


   Если ПустаяСтрока(код) = 1 Тогда
           Сообщить("Пустой код у  "+имя);    
           продолжить;
    КонецЕСли;
   
    Если СПРТовар.НайтиПоКоду(код,0) = 1 Тогда
       ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТОвар .ТекущийЭлемент();        
       ДокПлан.Сумма   = сумма;

    Иначе
       Сообщить("Не нашли товар с кодом "+Код);
    КонецЕсли;
67 Christina_
 
12.06.12
17:29
(66)получилось...только получается, если в екселе 20 строк товара, ая пишу 22, он последние в последние две строчки добавляет любой товар из справочника.

а так работает, спасибо..
68 dangerouscoder
 
12.06.12
17:32
(67) последние строчки в exl как определяешь?
69 MishaD
 
12.06.12
17:36
Вообще то он дальше
   Если ПустаяСтрока(код) = 1 Тогда
           Сообщить("Пустой код у  "+имя);    
           продолжить;
    КонецЕСли;
не должен проходить, так что лучше попроси полный код
70 Christina_
 
12.06.12
17:41
Функция Обработка(Excel)  
   
   ОчиститьОкносообщений();
   
   СПРТовар = СоздатьОбъект("Справочник.Товары");
   ДокПлан = СоздатьОбъект("Документ.Планирование");    
   ДокПлан.Новый();
   Для i=1 По Строки Цикл
       имя   =  Строка(Excel.Cells(i,Товар).Value);
       Попытка
           код   =  Число(Excel.Cells(i,кккк).Value);    
       Исключение
       КонецПопытки;
       Попытка
           сумма   =  Число(Excel.Cells(i,План).Value);    
       Исключение
       КонецПопытки;
       Если ПустаяСтрока(код) = 1 Тогда
           Сообщить("Пустой код у  "+имя);    
           продолжить;
        КонецЕСли;
       Если СПРТовар.НайтиПоКоду(код,0) = 1 Тогда
       ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТОвар.ТекущийЭлемент();        
       ДокПлан.Сумма   = сумма;
       
   Иначе
        Сообщить("Не нашли товар с кодом "+Код);
   КонецЕсли;
КонецЦикла;
ДокПлан.Записать();
ОткрытьФорму(ДокПлан.ТекущийДокумент());
КонецФункции
71 dangerouscoder
 
12.06.12
17:48
Попытка
           код   =  Число(Excel.Cells(i,кккк).Value);    
       Исключение
       КонецПопытки;

зачем обработка исключения?

   Для i=1 По Строки Цикл
переменная Строки где определена?
72 Christina_
 
12.06.12
17:57
строки - это количество строк в файле, задаю в диалоге обработки
73 Christina_
 
12.06.12
17:58
и если у меня занято 22 строки, но первые две это шапка, я пишу 22, и первые две строчки в документе будут любым товаром из справочника.
74 MishaD
 
12.06.12
17:59
для i=3
75 Christina_
 
12.06.12
18:01
убрала исключение тоже самое
Функция Обработка(Excel)  
   
   ОчиститьОкносообщений();
   
   СПРТовар = СоздатьОбъект("Справочник.Товары");
   ДокПлан = СоздатьОбъект("Документ.Планирование");    
   ДокПлан.Новый();
   Для i=1 По Строки Цикл
       имя   =  Строка(Excel.Cells(i,Товар).Value);
       код   =  Число(Excel.Cells(i,кккк).Value);    
       сумма   =  Число(Excel.Cells(i,План).Value);    
       Если ПустаяСтрока(код) = 1 Тогда
           Сообщить("Пустой код у  "+имя);    
           продолжить;
        КонецЕСли;
       Если СПРТовар.НайтиПоКоду(код,0) = 1 Тогда
       ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТОвар.ТекущийЭлемент();        
       ДокПлан.Сумма   = сумма;
       
   Иначе
        Сообщить("Не нашли товар с кодом "+Код);
   КонецЕсли;
КонецЦикла;
ДокПлан.Записать();
ОткрытьФорму(ДокПлан.ТекущийДокумент());
КонецФункции
76 Christina_
 
12.06.12
18:01
почему i=3?
77 Christina_
 
12.06.12
18:01
а если файл будет с шапкой в 3 строки?
78 Christina_
 
12.06.12
18:02
а если без шапки, то не заполнится все..
79 MishaD
 
12.06.12
18:03
ВысотаШапки=3;
Строки=Excel.Sheets(1).Cells.SpecialCells(11).Row;
Для i=ВысотаШапки+1 по Строки Цикл
80 dangerouscoder
 
12.06.12
18:04
Строки=Excel.Sheets(1).Cells.SpecialCells(11).Row;    // строка последней ячейки

по поводу шапки добавь на форме реквизит типа число с какой строки начинать читать файл
81 BlackSeaCat
 
12.06.12
18:12
Пока автор не будет стараться ПОНЯТЬ, что она пишет - у нее будет получаться только г...нокод.

Который, как известно, иногда работает, но чаще... пахнет.

Например, после:

код   =  Число(Excel.Cells(i,кккк).Value);

проверять ЧИСЛОВОЙ результат функцией ПустаяСтрока() - как раз и дает амбре!
82 MishaD
 
12.06.12
18:18
девушка тролль. таких тупых не бывает
83 Christina_
 
12.06.12
18:21
Функция Обработка(Excel)  
   
   ОчиститьОкносообщений();
   
   СПРТовар = СоздатьОбъект("Справочник.Товары");
   ДокПлан = СоздатьОбъект("Документ.Планирование");    
   ДокПлан.Новый();
   Для i=номер По Строки Цикл
       имя   =  Строка(Excel.Cells(i,Товар).Value);
       код   =  Число(Excel.Cells(i,кккк).Value);    
       сумма   =  Число(Excel.Cells(i,План).Value);    
       Если СПРТовар.НайтиПоКоду(код,0) = 1 Тогда
       ДокПлан.НоваяСтрока();
       ДокПлан.Товар = СПРТОвар.ТекущийЭлемент();        
       ДокПлан.Сумма   = сумма;
       
   Иначе
        Сообщить("Не нашли товар с кодом "+Код);
   КонецЕсли;
КонецЦикла;
ДокПлан.Записать();
ОткрытьФорму(ДокПлан.ТекущийДокумент());
КонецФункции

вот это работает как надо...номер=номер строки начала чтения файла.

(80) спасибо!
84 Christina_
 
12.06.12
18:23
(82) бывают
85 Christina_
 
12.06.12
18:23
(84) всем еще раз спасибо...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.