Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Помогите найти ошибку

Я
   Косяк
 
22.12.17 - 09:38
Процедура Сформировать()
    Перем ТЗ,ТЗСвернутая, ОС,Таб, Код,Наименование,ШифрПоОКОФ,КодПоОКОФ, НомерСтроки, Искомый_КодПоОКОФ, СпрОС, XL, Файл, XLS;
    
XLS = СоздатьОбъект("ТаблицаЗначений");
XLS.НоваяКолонка("ШифрПоОКОФ"); 
XLS.НоваяКолонка("Наименование_ШифрПоОКОФ","Строка",100);   
XLS.НоваяКолонка("КодПоОКОФ"); 
XLS.НоваяКолонка("Наименование_КодПоОКОФ","Строка",100);   
    
    
 XL = СоздатьОбъект("Excel.Application");
 РабочиеКниги = XL.Workbooks;   
 Попытка
   Книга = РабочиеКниги.Open("C:\1.xlsx");   
 Исключение
   Предупреждение("Ошибка при открытии файла загрузки!",15);
   Сообщить(ОписаниеОшибки());
   Возврат;
 КонецПопытки;              
Лист = Книга.WorkSheets(1);
//Получааем количество строк

Строк = XL.Cells.CurrentRegion.Rows.Count;      
Для НомерСтроки = 1 По Строк Цикл      
    XLS.НоваяСтрока();        
    XLS.ШифрПоОКОФ                 = Строка(Лист.Cells(НомерСтроки,1).Value);        
    XLS.Наименование_ШифрПоОКОФ = СокрЛП(Лист.Cells(НомерСтроки,2).Value);
    XLS.КодПоОКОФ                 = СокрЛП(Лист.Cells(НомерСтроки,3).Value);              
    XLS.Наименование_КодПоОКОФ     = СокрЛП(Лист.Cells(НомерСтроки,4).Value);    
КонецЦикла;
XL.Workbooks.Close(); 
XLS.Выгрузить(ТЗ_Экр);//Выгружаем XLS в ТЗ_Экр на экранной форме 


ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код","Число",15,0); 
ТЗ.НоваяКолонка("Наименование","Строка",100);   
ТЗ.НоваяКолонка("ШифрПоОКОФ","Справочник.КлассификаторОКОФ"); 
ТЗ.НоваяКолонка("КодПоОКОФ","Справочник.КлассификаторОсновныхФондов"); 

ОС = СоздатьОбъект("Справочник.ОсновныеСредства");     
ОС.ИспользоватьДату(ВыбКонПериода);
ОС.ВыбратьЭлементы();              


Пока ОС.ПолучитьЭлемент()=1 Цикл
    //Сообщить("Код: "+ОС.Код+"  Наименование: "+ОС.Наименование+" КодПоОКОФ="+ОС.КодПоОКОФ+" ШифрПоОКОФ="+ОС.ШифрПоОКОФ);

    ТЗ.НоваяСтрока();
    ТЗ.Код = ОС.Код; 
    ТЗ.Наименование = ОС.Наименование;
    ТЗ.ШифрПоОКОФ = ОС.ШифрПоОКОФ;
    ТЗ.КодПоОКОФ = ОС.КодПоОКОФ;
    
    Код = ТЗ.Код;     
    Наименование = ТЗ.Наименование;
    ШифрПоОКОФ = Строка(ТЗ.ШифрПоОКОФ);
    КодПоОКОФ = ТЗ.КодПоОКОФ;      
    
    Если XLS.НайтиЗначение(ШифрПоОКОФ, НомерСтроки, "ШифрПоОКОФ")<>0 Тогда
        КодПоОКОФ = Строка(XLS.КодПоОКОФ);
        //Сообщить("НомерСтроки = "+НомерСтроки+"  Найден ШифрПоОКОФ = "+ШифрПоОКОФ+ "  XLS.КодПоОКОФ = "+КодПоОКОФ);

        Сообщить("НомерСтроки = "+Строка(НомерСтроки));
    КонецЕсли;    

КонецЦикла;

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


Ругается на переменную НомерСтроки
OS1.ERT(57)}: Номер за пределами значения!

В чем тут ошибка. В переменной должен содержаться номер строки из таблицы значений XLS
 
 
   Косяк
 
1 - 22.12.17 - 09:40
Если XLS.НайтиЗначение(ШифрПоОКОФ, НомерСтроки, "ШифрПоОКОФ")<>0 Тогда
        КодПоОКОФ = Строка(XLS.КодПоОКОФ);
        //Сообщить("НомерСтроки = "+НомерСтроки+"  Найден ШифрПоОКОФ = "+ШифрПоОКОФ+ "  XLS.КодПоОКОФ = "+КодПоОКОФ);


        Сообщить("НомерСтроки = "+Строка(НомерСтроки));
    КонецЕсли;    


Что не так с функцией XLS.НайтиЗначение
   GreyMen
 
2 - 22.12.17 - 09:42
Вставь НомерСтроки = 0; перед 
Если XLS.НайтиЗначение(ШифрПоОКОФ, НомерСтроки, "ШифрПоОКОФ")<>0 Тогда
   Darych
 
3 - 22.12.17 - 09:42
XLS.НайтиЗначение(ШифрПоОКОФ, Номер, "ШифрПоОКОФ")
   АЛьФ
 
4 - 22.12.17 - 09:43
НомерСтроки = "";
Если XLS.НайтиЗначение(ШифрПоОКОФ, НомерСтроки, "ШифрПоОКОФ")<>0 Тогда
XLS.ПолучитьСтрокуПоНомеру(НомерСтроки);
   VladZ
 
5 - 22.12.17 - 09:44
(0) Жуть.
   Darych
 
6 - 22.12.17 - 09:44
(3)+ либо новая переменная либо (2)
   igorPetrov
 
7 - 22.12.17 - 09:52
И чего ты ждешь в этом НомереСтроки?
   igorPetrov
 
8 - 22.12.17 - 09:59
(0) Если ты не поленишься и протестируешь отдельно код с циклом, то увидишь, что после завершения цикла в "НомереСтроки" действительно хранится невалидный номер. Который реально за пределами значения )
   igorPetrov
 
9 - 22.12.17 - 10:03
(5) +100500
   Косяк
 
10 - 22.12.17 - 10:13
Спасибо всем. Особенно ФЛьФ! Всех с Наступающим!
 
  Рекламное место пустует
   Косяк
 
11 - 22.12.17 - 12:41
Почему то новые значения в справочник не записываются

ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код","Число",15,0); 
ТЗ.НоваяКолонка("Наименование","Строка",100);   
ТЗ.НоваяКолонка("ШифрПоОКОФ","Справочник.КлассификаторОКОФ"); 
ТЗ.НоваяКолонка("КодПоОКОФ","Справочник.ОбщероссийскийКлассификаторОсновныхФондов"); 

ОС = СоздатьОбъект("Справочник.ОсновныеСредства");     
ОС.ИспользоватьДату(ВыбКонПериода);
ОС.ВыбратьЭлементы();              


СпрОКОФ = СоздатьОбъект("Справочник.ОбщероссийскийКлассификаторОсновныхФондов"); 

Пока ОС.ПолучитьЭлемент()=1 Цикл
    //Сообщить("Код: "+ОС.Код+"  Наименование: "+ОС.Наименование+" КодПоОКОФ="+ОС.КодПоОКОФ+" ШифрПоОКОФ="+ОС.ШифрПоОКОФ);

    ТЗ.НоваяСтрока();
    ТЗ.Код = ОС.Код; 
    ТЗ.Наименование = ОС.Наименование;
    ТЗ.ШифрПоОКОФ = ОС.ШифрПоОКОФ;
    ТЗ.КодПоОКОФ = ОС.КодПоОКОФ;
    
    Код = ТЗ.Код;     
    Наименование = ТЗ.Наименование;
    ШифрПоОКОФ = Строка(ТЗ.ШифрПоОКОФ);
    КодПоОКОФ = ТЗ.КодПоОКОФ;      
    
    Номер = 0;                          
                          
    Если ПустаяСтрока(ШифрПоОКОФ)<>1 Тогда//Только заполненные

        //Сообщить("ОС.ШифрПоОКОФ="+ОС.ШифрПоОКОФ+" ОС.АмортизационнаяГруппа="+ОС.АмортизационнаяГруппа+"  ОС.КодПоОКОФ = "+ОС.КодПоОКОФ);

        
        Если XLS.НайтиЗначение(ШифрПоОКОФ, Номер, "ШифрПоОКОФ")<>0 Тогда
            
            XLS.ПолучитьСтрокуПоНомеру(Номер);  
            КодПоОКОФ = Строка(XLS.КодПоОКОФ);
            
            Если СпрОКОФ.НайтиПоКоду(XLS.КодПоОКОФ,0)<>0 Тогда
                                
                ОС.КодПоОКОФ = XLS.КодПоОКОФ;
                ОС.АмортизационнаяГруппа = СпрОКОФ.АмортизационнаяГруппа;
                //ОС.УстановитьАтрибут("КодПоОКОФ",СпрОКОФ.Код);

                ОС.Записать();
            КонецЕсли;
                        
        КонецЕсли;    
                
    КонецЕсли;    

КонецЦикла;


Почему то не записываются изменения в справочник ОС. Ошибки нет
   Ёпрст
 
12 - 22.12.17 - 12:44
(11) весь код в топку
   Ёпрст
 
13 - 22.12.17 - 12:46
Непонятен бред с запихиванием реквизитов справочника в ТЗ и потом извлечением их оттуда .. загадка
   Ёпрст
 
14 - 22.12.17 - 12:48
+ зачем то из ссылки на справочник строку делать
   Darych
 
15 - 22.12.17 - 12:51
ОС.КодПоОКОФ = XLS.КодПоОКОФ -в ссылку строку пихаешь
   Darych
 
16 - 22.12.17 - 12:54
(15) ... ступил я
   Косяк
 
17 - 22.12.17 - 12:55
(15) и по другому не получается
ОС = СоздатьОбъект("Справочник.ОсновныеСредства");     
ОС.ИспользоватьДату(ВыбКонПериода);
ОС.ВыбратьЭлементы();              


СпрОКОФ = СоздатьОбъект("Справочник.ОбщероссийскийКлассификаторОсновныхФондов"); 

Пока ОС.ПолучитьЭлемент()=1 Цикл
    //Сообщить("Код: "+ОС.Код+"  Наименование: "+ОС.Наименование+" КодПоОКОФ="+ОС.КодПоОКОФ+" ШифрПоОКОФ="+ОС.ШифрПоОКОФ);

    ТЗ.НоваяСтрока();
    ТЗ.Код = ОС.Код; 
    ТЗ.Наименование = ОС.Наименование;
    ТЗ.ШифрПоОКОФ = ОС.ШифрПоОКОФ;
    ТЗ.КодПоОКОФ = ОС.КодПоОКОФ;
    
    Код = ТЗ.Код;     
    Наименование = ТЗ.Наименование;
    ШифрПоОКОФ = Строка(ТЗ.ШифрПоОКОФ);
    КодПоОКОФ = ТЗ.КодПоОКОФ;      
    
    Номер = 0;                          
                          
    Если ПустаяСтрока(ШифрПоОКОФ)<>1 Тогда//Только заполненные

        
        Если XLS.НайтиЗначение(ШифрПоОКОФ, Номер, "ШифрПоОКОФ")<>0 Тогда
            XLS.ПолучитьСтрокуПоНомеру(Номер);  
            КодПоОКОФ = Строка(XLS.КодПоОКОФ);
            
            Если СпрОКОФ.НайтиПоКоду(XLS.КодПоОКОФ,0)<>0 Тогда                                
                ОС.КодПоОКОФ = СпрОКОФ.Код;
                ОС.Записать();
            КонецЕсли;
        КонецЕсли;    
                
    КонецЕсли;    

КонецЦикла;
   Косяк
 
18 - 22.12.17 - 12:56
Перебирается справочник ОС и устанавливается значение реквизита КодПоОКОФ
   Косяк
 
19 - 22.12.17 - 12:58
руками КодПоОКОФ меняется а программно не хочет и ошибки не выдает
   Косяк
 
20 - 22.12.17 - 12:59
Если СпрОКОФ.НайтиПоКоду(XLS.КодПоОКОФ,0)<>0 Тогда                                
                ОС.КодПоОКОФ = СпрОКОФ.Код;
                ОС.Записать();
            КонецЕсли;

где тут ошибка
   Darych
 
21 - 22.12.17 - 12:59
ты ищешь кодпоокоф из элемента справочника, находишь его и пишешь в тот же элемент... Странно что не изменяется, да?
   Ёпрст
 
22 - 22.12.17 - 13:01
(17)

1.Выкинуть ТЗ из кода за ненадобностью
2.в ОС.КодПоОКОФ пихать ссылку на элемент справочника, а не строку.
3......
   Ёпрст
 
23 - 22.12.17 - 13:01
(20) в днк
   Косяк
 
24 - 22.12.17 - 13:03
Пихаю ссылку и ничего не записывается вообще, поле пустое остается в справочнике
   Ёпрст
 
25 - 22.12.17 - 13:04
(24) больше кода
   Ёпрст
 
26 - 22.12.17 - 13:05
нам отсюда не видно, что ты там творишь
   Косяк
 
27 - 22.12.17 - 13:07
Сама задача такая: с справочнике ОС проставлен только реквизит ШифрПоОКОФ (устаревший уже.). Требуется заполнить другой реквизит, а именно КодПоОкоф. Его значение выбирается из таблицы значений, загруженной из специального файла Excel.

Нужная строка в этой ТЗ находится по ШифрПоОКОФ, далее из этой найденной строки берется значение реквизита КодПоОкоф, его нужно записать.
   Darych
 
28 - 22.12.17 - 13:08
(27) зачем тебе ТЗ?
   Косяк
 
29 - 22.12.17 - 13:09
ОС.КодПоОКОФ = СпрОКОФ.Код;
                ОС.Записать();

почему не срабатывает эта комбинация? Никакой ошибки не выдается!
   catena
 
30 - 22.12.17 - 13:10
(20)Отладчиком он вообще туда заходит?
   catena
 
31 - 22.12.17 - 13:10
Тип реквизита КодПоОКОФ ? Периодический, не?
   Ёпрст
 
32 - 22.12.17 - 13:12
(29) КодПоОКОФ  - это НЕ СТРОКА
   Ёпрст
 
33 - 22.12.17 - 13:12
Открой, наконец, пофигуратор, и посмотри, какого типа реквизит КодПоОКОФ
 
 
   Косяк
 
34 - 22.12.17 - 13:13
(31)Нет, не периодический
   Darych
 
35 - 22.12.17 - 13:14
ладно... спрпоокоф.текущийэлемент()
   Косяк
 
36 - 22.12.17 - 13:21
Если XLS.НайтиЗначение(ШифрПоОКОФ, Номер, "ШифрПоОКОФ")<>0 Тогда
            XLS.ПолучитьСтрокуПоНомеру(Номер);  
            КодПоОКОФ = Строка(XLS.КодПоОКОФ);
            
            Если СпрОКОФ.НайтиПоКоду(XLS.КодПоОКОФ,0)<>0 Тогда                                
                ОС.КодПоОКОФ = СпрОКОФ.ТекущийЭлемент();   
                
                Сообщить(СпрОКОФ.ТекущийЭлемент());
                
                ОС.Записать();
            КонецЕсли;
        КонецЕсли;    



Печатает правильные данные:

210.00.11.10.450
210.00.11.10.450
210.00.11.10.450

Но в справочник не записывает!
   Косяк
 
37 - 22.12.17 - 13:24
(33) Реквизит в справочнике ОС имееет тип "Справочник.ОбщероссийскийКлассификаторОсновныхФондов"
   Ёпрст
 
38 - 22.12.17 - 13:26
(36)
с чего уверенность, что не записывает ?
С чего уверенность, что найденный элемент - не группа ?
   Ёпрст
 
39 - 22.12.17 - 13:28
Покажи весь код целиком
   Косяк
 
40 - 22.12.17 - 13:28
(38)Пока этот реквизит в справочнике не заполнялся, т.е. он пустой.
   Ёпрст
 
41 - 22.12.17 - 13:29
(40)и как ты это проверил ?
   Косяк
 
42 - 22.12.17 - 13:30
Процедура Сформировать()
    Перем ТЗ,ТЗСвернутая, ОС,Таб, Код,Наименование,ШифрПоОКОФ,КодПоОКОФ, Номер, Искомый_КодПоОКОФ, СпрОС, XL, Файл, XLS;
    
XLS = СоздатьОбъект("ТаблицаЗначений");
XLS.НоваяКолонка("ШифрПоОКОФ"); 
XLS.НоваяКолонка("Наименование_ШифрПоОКОФ","Строка",100);   
XLS.НоваяКолонка("КодПоОКОФ"); 
XLS.НоваяКолонка("Наименование_КодПоОКОФ","Строка",100);   
    
    
 XL = СоздатьОбъект("Excel.Application");
 РабочиеКниги = XL.Workbooks;   
 Попытка
   Книга = РабочиеКниги.Open("C:\1.xlsx");   
 Исключение
   Предупреждение("Ошибка при открытии файла загрузки!",15);
   Сообщить(ОписаниеОшибки());
   Возврат;
 КонецПопытки;              
Лист = Книга.WorkSheets(1);
//Получааем количество строк

Строк = XL.Cells.CurrentRegion.Rows.Count;      
Для НомерСтроки = 1 По Строк Цикл      
    XLS.НоваяСтрока();        
    XLS.ШифрПоОКОФ                 = Строка(Лист.Cells(НомерСтроки,1).Value);        
    XLS.Наименование_ШифрПоОКОФ = СокрЛП(Лист.Cells(НомерСтроки,2).Value);
    XLS.КодПоОКОФ                 = СокрЛП(Лист.Cells(НомерСтроки,3).Value);              
    XLS.Наименование_КодПоОКОФ     = СокрЛП(Лист.Cells(НомерСтроки,4).Value);    
КонецЦикла;
XL.Workbooks.Close(); 
XLS.Выгрузить(ТЗ_Экр);//Выгружаем XLS в ТЗ_Экр на экранной форме 


ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код","Число",15,0); 
ТЗ.НоваяКолонка("Наименование","Строка",100);   
ТЗ.НоваяКолонка("ШифрПоОКОФ","Справочник.КлассификаторОКОФ"); 
ТЗ.НоваяКолонка("КодПоОКОФ","Справочник.ОбщероссийскийКлассификаторОсновныхФондов"); 

ОС = СоздатьОбъект("Справочник.ОсновныеСредства");     
ОС.ИспользоватьДату(ВыбКонПериода);
ОС.ВыбратьЭлементы();              


СпрОКОФ = СоздатьОбъект("Справочник.ОбщероссийскийКлассификаторОсновныхФондов"); 

Пока ОС.ПолучитьЭлемент()=1 Цикл
    //Сообщить("Код: "+ОС.Код+"  Наименование: "+ОС.Наименование+" КодПоОКОФ="+ОС.КодПоОКОФ+" ШифрПоОКОФ="+ОС.ШифрПоОКОФ);

    ТЗ.НоваяСтрока();
    ТЗ.Код = ОС.Код; 
    ТЗ.Наименование = ОС.Наименование;
    ТЗ.ШифрПоОКОФ = ОС.ШифрПоОКОФ;
    ТЗ.КодПоОКОФ = ОС.КодПоОКОФ;
    
    Код = ТЗ.Код;     
    Наименование = ТЗ.Наименование;
    ШифрПоОКОФ = Строка(ТЗ.ШифрПоОКОФ);
    КодПоОКОФ = ТЗ.КодПоОКОФ;      
    
    Номер = 0;                          
                          
    Если ПустаяСтрока(ШифрПоОКОФ)<>1 Тогда//Только заполненные

        
        Если XLS.НайтиЗначение(ШифрПоОКОФ, Номер, "ШифрПоОКОФ")<>0 Тогда
            XLS.ПолучитьСтрокуПоНомеру(Номер);  
            КодПоОКОФ = Строка(XLS.КодПоОКОФ);
            
            Если СпрОКОФ.НайтиПоКоду(XLS.КодПоОКОФ,0)<>0 Тогда                                
                ОС.КодПоОКОФ = СпрОКОФ.ТекущийЭлемент();   
                
                Сообщить(СпрОКОФ.ТекущийЭлемент());
                
                ОС.Записать();                
            КонецЕсли;
        КонецЕсли;    
                
    КонецЕсли;    

КонецЦикла;

        
КонецПроцедуры
   Масянька
 
43 - 22.12.17 - 13:33
(42) Это всё, чтобы поменять код ОКОФ?
   Косяк
 
44 - 22.12.17 - 13:34
все
   Sasha_H
 
45 - 22.12.17 - 13:36
Юзал еще с 7.7, сейчас уже более лучше функция для 8.х.

//Обработка импорта файла Ексель

// СтруктураКолонок, должен содержать
//      Представление: "Наименование колонки";

//      Значение: "Номер колонки"
//          если номер колонки не указан или передан служебный символ "#", будет создана просто пустая колонка

//
Функция ОбработкаИмпортаФайлаЕксель(ИмяФайла, НачСтрока=1, КонСтрока=0, НомерЛиста=0, СтруктураКолонок) Экспорт

    Если НЕ ЗначениеЗаполнено(ИмяФайла) Тогда
        #Если Клиент Тогда

            Предупреждение("Необходимо указать путь к файлу",3);
        #КонецЕсли

        Возврат Неопределено;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(СтруктураКолонок) Тогда
        #Если Клиент Тогда

            Предупреждение("Необходимо указать структуру колонок",3);
        #КонецЕсли

        Возврат Неопределено;
    КонецЕсли;

    //Разбор листов

    СписокИспользуемыхЛистов = Новый СписокЗначений;
    КнигаExcel = ПолучитьCOMОбъект(ИмяФайла);
    //есть несколько вариантов исчисления:

    //1.Номер последней загружаемой строки. Если не указан, то ищется как последнее

    //  не пустой код производителя, тоесть не пустое последнее значение. А номер Листа определен

    Если (ЗначениеЗаполнено(НомерЛиста))
    И    (НЕ ЗначениеЗаполнено(КонСтрока))  Тогда
        //пользователь указал лист но неуказал КонСтрока

        Лист = КнигаExcel.Worksheets(НомерЛиста);
        ИспользуемыйДиапазон = Лист.UsedRange;
        ПоследняяЯчейка      = ИспользуемыйДиапазон.SpecialCells(11);//последня правая нижняя ячейка

        Если ((ИспользуемыйДиапазон.Address<>ПоследняяЯчейка.Address) ИЛИ  (ПоследняяЯчейка.Text<>"")) Тогда
            СписокИспользуемыхЛистов.Добавить(ИспользуемыйДиапазон.Rows.Count(),Лист.Name);
        Иначе
            #Если Клиент Тогда

            Предупреждение("Не могу опредилить конечную строку");
            #КонецЕсли

            Возврат Неопределено;
        КонецЕсли;
    ИначеЕсли (НЕ ЗначениеЗаполнено(НомерЛиста))
    И         (ЗначениеЗаполнено(КонСтрока))   Тогда
        //по всех листах но с определенными КонСтрока

        Для  ИндексЛиста = 1 По КнигаExcel.Worksheets.Count Цикл
            Лист=КнигаExcel.Worksheets(ИндексЛиста);
            СписокИспользуемыхЛистов.Добавить(КонСтрока,Лист.Name);
        КонецЦикла;
    ИначеЕсли (НЕ ЗначениеЗаполнено(НомерЛиста))
    И         (НЕ ЗначениеЗаполнено(КонСтрока))   Тогда
        //по всех листах и нужно в каждом из них найти КонСТрока

        Для  ИндексЛиста = 1 По КнигаExcel.Worksheets.Count Цикл
            Лист = КнигаExcel.Worksheets(ИндексЛиста);
            ИспользуемыйДиапазон = Лист.UsedRange;
            ПоследняяЯчейка      = ИспользуемыйДиапазон.SpecialCells(11);
            Если ((ИспользуемыйДиапазон.Address<>ПоследняяЯчейка.Address) ИЛИ  (ПоследняяЯчейка.Text<>"")) Тогда
                СписокИспользуемыхЛистов.Добавить(ИспользуемыйДиапазон.Rows.Count(),Лист.Name);
            КонецЕсли;
        КонецЦикла;
    ИначеЕсли (ЗначениеЗаполнено(НомерЛиста))
    И         (ЗначениеЗаполнено(КонСтрока))   Тогда
        //пользователь указал и Лист и КонСтрочку

        Лист = КнигаExcel.Worksheets(НомерЛиста);
        СписокИспользуемыхЛистов.Добавить(КонСтрока,Лист.Name);
    КонецЕсли;

    // по п. 1) КвоЛистов=СписокИспользуемыхЛистов.РазмерСписка();

    // по п. 2) КвоСтрок=СписокИспользуемыхЛистов.Получить(ИмяЛиста);

    КонСтрокаДляПрогреса = 0;
    Для Каждого НомераКонСтроки Из СписокИспользуемыхЛистов Цикл
        КонСтрокаДляПрогреса = КонСтрокаДляПрогреса + НомераКонСтроки.Значение;
    КонецЦикла;


    ТаблицаРезультатов = Новый ТаблицаЗначений;
    ТаблицаРезультатов.Колонки.Добавить("Лист");

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


    Для Каждого НомераКонСтроки Из СписокИспользуемыхЛистов Цикл
        НомерЛиста = НомераКонСтроки.Представление;
        КонСтрока  = НомераКонСтроки.Значение;

        СостояниеПрогреса = 0;

        Для НомерОбработанойСтроки = НачСтрока По КонСтрока Цикл

            СостояниеПрогреса = СостояниеПрогреса + 1;

            НоваяСтрока = ТаблицаРезультатов.Добавить();
            НоваяСтрока.Лист = НомерЛиста;

            Для Каждого ИндетификатораКолонки Из СтруктураКолонок Цикл
                iCount         = ИндетификатораКолонки.Значение;

                Если (НЕ ЗначениеЗаполнено(iCount))
                    ИЛИ (iCount = "#") Тогда

                    //это структура пустой колонки

                    Продолжить;
                КонецЕсли;

                ЗначениеЗаписи = СтрЗаменить(СокрЛП(КнигаExcel.Sheets(НомерЛиста).Cells(НомерОбработанойСтроки,iCount).Value),Символ(160),"");
                НоваяСтрока[ИндетификатораКолонки.Представление] = ЗначениеЗаписи;
            КонецЦикла;

        КонецЦикла;
    КонецЦикла;

    Возврат ТаблицаРезультатов;
КонецФункции
   Darych
 
46 - 22.12.17 - 13:37
(45) угу... сейчас вообще с 8-го кода зависнет
   Масянька
 
47 - 22.12.17 - 13:37
(44) А не проще откорректировать справ. ОКОФ?
   Ёпрст
 
48 - 22.12.17 - 13:38
Пиши, че возвращает ЭТО:

Процедура Сформировать()
    
    XLS = СоздатьОбъект("ТаблицаЗначений");
    XLS.НоваяКолонка("ШифрПоОКОФ"); 
    XLS.НоваяКолонка("Наименование_ШифрПоОКОФ");   
    XLS.НоваяКолонка("КодПоОКОФ"); 
    XLS.НоваяКолонка("Наименование_КодПоОКОФ");   
    
    XL = СоздатьОбъект("Excel.Application");
    РабочиеКниги = XL.Workbooks;   
    Попытка
        Книга = РабочиеКниги.Open("C:\1.xlsx");   
    Исключение
        Предупреждение("Ошибка при открытии файла загрузки!",15);
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;              
    Лист = Книга.WorkSheets(1);
    //Получааем количество строк

    
    Строк = XL.Cells.CurrentRegion.Rows.Count;      
    Для НомерСтроки = 1 По Строк Цикл      
        XLS.НоваяСтрока();        
        XLS.ШифрПоОКОФ                 = СокрЛП(Лист.Cells(НомерСтроки,1).Value);        
        XLS.Наименование_ШифрПоОКОФ = СокрЛП(Лист.Cells(НомерСтроки,2).Value);
        XLS.КодПоОКОФ                 = СокрЛП(Лист.Cells(НомерСтроки,3).Value);              
        XLS.Наименование_КодПоОКОФ     = СокрЛП(Лист.Cells(НомерСтроки,4).Value);    
    КонецЦикла;
    XL.Workbooks.Close(); 
    XLS.Выгрузить(ТЗ_Экр)//Выгружаем XLS в ТЗ_Экр на экранной форме 

    
    СпрОКОФ = СоздатьОбъект("Справочник.ОбщероссийскийКлассификаторОсновныхФондов"); 
    ОС = СоздатьОбъект("Справочник.ОсновныеСредства");     
    ОС.ИспользоватьДату(ВыбКонПериода);
    ОС.ВыбратьЭлементы();              
    Пока ОС.ПолучитьЭлемент()=1 Цикл
        Если ОС.ЭтоГруппа()=1  Тогда
            Продолжить;
        КонецЕсли;
        Если ПустоеЗначение(ОС.ШифрПоОКОФ)=1 Тогда
            Продолжить;
        КонецЕсли;
        Номер = "";                          
        Если XLS.НайтиЗначение(СокрЛП(ОС.ШифрПоОКОФ), Номер, "ШифрПоОКОФ")<>0 Тогда
            XLS.ПолучитьСтрокуПоНомеру(Номер);  
            Если СпрОКОФ.НайтиПоКоду(XLS.КодПоОКОФ,0)=1 Тогда                                
                ОС.КодПоОКОФ = СпрОКОФ.ТекущийЭлемент();   
                Сообщить(СпрОКОФ.ТекущийЭлемент());
                ОС.Записать(); 
                Сообщить(""+ОС.ТекущийЭлемент()+" КодПоОКОФ = "+ОС.КодПоОКОФ,"i");
            КонецЕсли;
        КонецЕсли;    
    КонецЦикла;
КонецПроцедуры
   Ёпрст
 
49 - 22.12.17 - 13:39
проверку бы надо еще, что найденный СпрОКОФ - не группа, ну да ладно, и так сойдёт
 
 
   Косяк
 
50 - 22.12.17 - 13:42
(48) Справочник не меняется. КодПоОКОФ - остается пустым
   Ёпрст
 
51 - 22.12.17 - 13:43
(50) Пиши, че пишет на экране
   Darych
 
52 - 22.12.17 - 13:43
Напиши, что в табло сообщений выводит, млин
   Косяк
 
53 - 22.12.17 - 13:44
Значения должны быть такими:  210.00.11.10.450 

Можете попробовать проставить всем одно это значение..
   Ёпрст
 
54 - 22.12.17 - 13:44
или кинь скриншот
   Darych
 
55 - 22.12.17 - 13:45
он издевается
   Косяк
 
56 - 22.12.17 - 13:45
Печатает вот такое:

Эстакада при складе штучных матер. отд.№39 (сооруж.№104) КодПоОКОФ = 220.25.11.23.131
220.25.11.23.131
Эстакада с козловым краном (сооруж.№38) КодПоОКОФ = 220.25.11.23.131
220.25.11.23.131
Эстакада с навесом (сооруж. №369) КодПоОКОФ = 220.25.11.23.131
220.25.11.23.131
Галлерея КодПоОКОФ = 220.25.11.23.131
220.25.11.23.139
Силос цементный КодПоОКОФ = 220.25.11.23.139
220.25.11.23.139
Силос цементный КодПоОКОФ = 220.25.11.23.139
220.25.11.23.139
Силос цементный КодПоОКОФ = 220.25.11.23.139
220.41.20.20.700
Шлагбаум КодПоОКОФ = 220.41.20.20.700
220.25.11.23.140
Градирня "Росинка - 80/100" КодПоОКОФ = 220.25.11.23.140
   Ёпрст
 
57 - 22.12.17 - 13:46
(56) И ? У тебя всё записалось, че тебя не устраивает ?!
   Косяк
 
58 - 22.12.17 - 13:48
(57)Да, сейчас записалось. Только я пока еще не понял, в чем была причина
   Масянька
 
59 - 22.12.17 - 13:49
(58) Смотри, не спугни :))))
   Косяк
 
60 - 22.12.17 - 13:51
Ёпрст - спасибо!



Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует