Имя: Пароль:
1C
1C 7.7
v7: Помогите найти ошибку
, ,
0 Косяк
 
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.НайтиЗначение
2 GreyMen
 
22.12.17
09:42
Вставь НомерСтроки = 0; перед
Если XLS.НайтиЗначение(ШифрПоОКОФ, НомерСтроки, "ШифрПоОКОФ")<>0 Тогда
3 Darych
 
22.12.17
09:42
XLS.НайтиЗначение(ШифрПоОКОФ, Номер, "ШифрПоОКОФ")
4 АЛьФ
 
22.12.17
09:43
НомерСтроки = "";
Если XLS.НайтиЗначение(ШифрПоОКОФ, НомерСтроки, "ШифрПоОКОФ")<>0 Тогда
XLS.ПолучитьСтрокуПоНомеру(НомерСтроки);
5 VladZ
 
22.12.17
09:44
(0) Жуть.
6 Darych
 
22.12.17
09:44
(3)+ либо новая переменная либо (2)
7 igorPetrov
 
22.12.17
09:52
И чего ты ждешь в этом НомереСтроки?
8 igorPetrov
 
22.12.17
09:59
(0) Если ты не поленишься и протестируешь отдельно код с циклом, то увидишь, что после завершения цикла в "НомереСтроки" действительно хранится невалидный номер. Который реально за пределами значения )
9 igorPetrov
 
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
+ зачем то из ссылки на справочник строку делать
15 Darych
 
22.12.17
12:51
ОС.КодПоОКОФ = XLS.КодПоОКОФ -в ссылку строку пихаешь
16 Darych
 
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 Тогда                                
                ОС.КодПоОКОФ = СпрОКОФ.Код;
                ОС.Записать();
            КонецЕсли;

где тут ошибка
21 Darych
 
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.

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

почему не срабатывает эта комбинация? Никакой ошибки не выдается!
30 catena
 
22.12.17
13:10
(20)Отладчиком он вообще туда заходит?
31 catena
 
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)Нет, не периодический
35 Darych
 
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
все
45 Sasha_H
 
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),"");
                НоваяСтрока[ИндетификатораКолонки.Представление] = ЗначениеЗаписи;
            КонецЦикла;

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

    Возврат ТаблицаРезультатов;
КонецФункции
46 Darych
 
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) Пиши, че пишет на экране
52 Darych
 
22.12.17
13:43
Напиши, что в табло сообщений выводит, млин
53 Косяк
 
22.12.17
13:44
Значения должны быть такими:  210.00.11.10.450

Можете попробовать проставить всем одно это значение..
54 Ёпрст
 
22.12.17
13:44
или кинь скриншот
55 Darych
 
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
Ёпрст - спасибо!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн