Имя: Пароль:
1C
1C 7.7
v7: Не получается записать значение столбца БазоваяЕдиница в excel
0 maxxxl-ms
 
26.07.12
11:07
Всем Доброго утра! Такая проблема: есть обработка Выгрузка загрузка спр.ert (выложил сюда http://upwap.ru/2661699), с помощью которой я выгружаю номенклатуру в документ excel, всё то хорошо выгружается, но не прописывает в столбце БазоваяЕдиница тип базовой единицы, например "шт". В чём может быть проблема?
1 maxxxl-ms
 
26.07.12
11:08
http://upwap.ru/2661703 перезагрузил обработку
2 1Сергей
 
26.07.12
11:08
код показывай. нет никакого желания качать всякую х-ню
3 Rie
 
26.07.12
11:09
(0) А что в обработке-то? Как прописана выгрузка базовой единицы? А то качать/читать всё подряд - как-то в лом...
4 Fish
 
26.07.12
11:09
(0) Отладчиком посмотри. Это имхо проще, чем искать здесь телепатов.
5 maxxxl-ms
 
26.07.12
11:11
Ну может кто сталкивался. Просто тут действительно телепатией надо заняться, в самой номенклатуре базовая единица есть, но в excel она не прописываеться... в обработке:
// Импорт-экспорт данных справочников 04.08.03
//*******************************************

Перем Excel,Версия,спр,ТекстЛог, Индикатор, СимволЗамены;
Перем Строк,Столбцов,тзРекв,спрНаименование;
Перем СтрокаШапки, СлужКолонок;

// ===============================
// НАЗНАЧЕНИЕ: отображает индикатор выполнения какой-либо задачи в форме контекста
// ПАРАМЕТРЫ:
//        Конт - контекст, в котором выводим индикатор (переменная индикатор должна быть на форме, и объявлена в переменных)
//               Перем индикатор;
//        Процент - текущий процент выполнения задачи
//        Описание - строка перед процентом (например: "обновление данных...10%");
Процедура глПоказатьИндикатор(Конт,Процент,Описание)
   стрИндикатор = "";
   КвоДелений = Цел(Число(Процент)*10/100);
   Если КвоДелений > 0 Тогда
       Для Поз = 1 По КвоДелений Цикл
           стрИндикатор = стрИндикатор + Симв(3);
       КонецЦикла;    
   КонецЕсли;                                
   Индикатор = Описание+" "+стрИндикатор+СокрЛП(Процент)+"%";    
   Конт.Форма.Обновить();
КонецПроцедуры                      

// ===============================
Процедура ВывестиЛог(Текст,Тип,Стр=0)
   Если Тип = 3 Тогда        
       // вывод на экран
       Если ПустоеЗначение (ТекстЛог) = 1 Тогда
           Возврат;
       КонецЕсли;  
       ОчиститьОкноСообщений();
       Сообщить(ТекстЛог,"i");
       Возврат;
   КонецЕсли;          
   
   Если Тип = 1 Тогда
       // предупреждение
       ТекстЛог = ТекстЛог +"========= ПРЕДУПРЕЖДЕНИЕ ["+СокрЛП(Стр)+"] ========"+РазделительСтрок;
       ТекстЛог = ТекстЛог + Текст+РазделительСтрок;
   ИначеЕсли Тип = 2 Тогда
       ТекстЛог = ТекстЛог + "=!=!=!=!=     ОШИБКА ["+СокрЛП(Стр)+"] =!=!=!=!="+РазделительСтрок;
       ТекстЛог = ТекстЛог + Текст+РазделительСтрок;
   Иначе
       ТекстЛог = "";
   КонецЕсли;    
КонецПроцедуры

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

// ===============================
Функция ПолучитьЗначение(Стр,Стл)
   Значение = Excel.Cells(Стр, Стл).Value;
   Возврат Значение;
КонецФункции

// ===============================
Процедура ПоместитьЗначение(Стр,Стл,Значение)
   Ячейка = Excel.Cells (Стр,Стл);
   Ячейка.Value = Значение;        
КонецПроцедуры

// ===============================
Процедура Пометить(сп,зн,пер=0)          
   пер = пер * ПериодВел;                                                              
   
   Если Пер = 1 Тогда
       Пометить(сп,0);
   КонецЕсли;
   
   МД = Метаданные.Справочник(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));            
   Для Инд = 1 По сп.РазмерСписка() Цикл    
       Реквизит = СокрЛП(спРекв.ПолучитьЗначение(Инд));
       Если (пер = 1) и (МД.Реквизит(Реквизит).Периодический = 0) Тогда
           Продолжить;
       КонецЕсли;
       сп.Пометка(инд,зн);
   КонецЦикла;    
КонецПроцедуры

// ===============================
Процедура ИзмВид()
   Вид = спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока());
   ВидВлад = Метаданные.Справочник(Вид).Владелец;
   НазначитьВид(Родитель,Вид);
   НазначитьВид(Владелец,ВидВлад);
   Форма.Родитель.НеизменятьВид(1);
   Форма.Владелец.НеизменятьВид(1);
КонецПроцедуры

// ===============================
Процедура ИзмСпр()
   спРекв.УдалитьВсе();
   МД = Метаданные.Справочник(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));
   Для Инд = 1 По МД.Реквизит() Цикл
       спРекв.ДобавитьЗначение(МД.Реквизит(Инд).Идентификатор,МД.Реквизит(Инд).Представление());
   КонецЦикла;                                                                                    
   спРекв.Сортировать();
   Пометить(спРекв,1);
   ИзмВид();
КонецПроцедуры

// ===============================
Функция НайтиДокумент(Значение,Вид)    
   Рез =  Найти(Значение,СимволЗамены);
   Если Рез = 0 Тогда
       Возврат 0;
   КонецЕсли;                
   ДатаДок = Дата(Лев(Значение,Рез-1));
   НомерДок = Сред(Значение,Рез+1);
   Попытка
       Док = СоздатьОбъект("Документ."+СокрЛП(Вид));
   Исключение  
       ВывестиЛог("Ошибка создания Документа: "+Вид,2,);
       Возврат 0;
   КонецПопытки;
   
   Если Док.НайтиПоНомеру(НомерДок,ДатаДок) = 1 Тогда
       Значение = Док.ТекущийДокумент();
   Иначе        
       Значение = 0;                    
       ВывестиЛог("Ошибка нахождения документа: "+Вид+" от "+СокрЛП(ДатаДок)+" № "+СокрЛП(НомерДок),2,);        
   КонецЕсли;
   Возврат Значение;
КонецФункции

// ===============================
Функция НайтиСпр(Значение,Вид)    
   ПолныйКод = СтрЗаменить(Значение,СимволЗамены,"/");
   Попытка
       справочник = СоздатьОбъект("Справочник."+СокрЛП(Вид));
   Исключение  
       ВывестиЛог("Ошибка создания справочника: "+Вид,2,);
       Возврат 0;
   КонецПопытки;    
   
   Если справочник.НайтиПоКоду(ПолныйКод,2) = 0 Тогда
       Значение = 0
   Иначе
       Значение = справочник.ТекущийЭлемент();
   КонецЕсли;                          
   Возврат Значение;    
КонецФункции  

// ===============================
Функция НайтиПер(Значение,Вид)                
   Попытка
       Пер = Метаданные.Перечисление(Вид).Идентификатор;    
   Исключение  
       ВывестиЛог("Ошибка создания перечисления: "+Вид,2,);
       Возврат 0;
   КонецПопытки;    
   Значение = Перечисление.ПолучитьАтрибут(Пер).ЗначениеПоИдентификатору(Значение);
   Возврат Значение;
КонецФункции

// ===============================
Процедура УстановитьЗначение(спр, Реквизит, Значение,поз)
   тзРекв.ПолучитьСтрокуПоНомеру(поз);                    
   ГрЭл = тзРекв.ГрЭл;                                
   Если ГрЭл = "ДляЭлемента" Тогда
       ГрЭл = 0;
   ИначеЕсли ГрЭл = "ДляГруппы" Тогда
       ГрЭл = 1;
   Иначе
       ГрЭл = 3;    
   КонецЕсли;
   Если (ГрЭл <> спр.ЭтоГруппа()) и (ГрЭл <> 3) Тогда
       Возврат;
   КонецЕсли;
   Значение = СокрЛП(Значение);
   Вид = тзРекв.Вид;
   Тип = тзРекв.Тип;
   Если Тип = "Число" Тогда
       Значение = Число(Значение);
   ИначеЕсли Тип = "Дата" Тогда
       Значение = Дата(Значение);
   ИначеЕсли Тип = "Строка" Тогда
       Значение = СокрЛП(Значение);
   ИначеЕсли Тип = "Документ" Тогда
       Значение = НайтиДокумент(Значение,Вид);
   ИначеЕсли Тип = "Справочник" Тогда
       Значение = НайтиСпр(Значение,Вид);
   ИначеЕсли Тип = "Перечисление" Тогда
       Значение = НайтиПер(Значение,Вид);
   ИначеЕсли Тип = "Счет" Тогда
       Значение = СчетПоКоду(Значение);        
   КонецЕсли;
   спр.УстановитьАтрибут(Реквизит,Значение);
КонецПроцедуры

// ===============================
Процедура ЗаполнитьРеквизиты(Спр,Стр)    
   Если Столбцов < СлужКолонок+1 Тогда
       Возврат;
   КонецЕсли;    
   
   Для Инд = СлужКолонок+1 По Столбцов Цикл
       Реквизит = Нрег(СокрЛП(ПолучитьЗначение(СтрокаШапки,Инд)));    
       поз = 0;
       Если тзРекв.НайтиЗначение(Реквизит,поз,"Реквизит") = 0 Тогда
           Продолжить;
       КонецЕсли;                  
       Значение = СокрЛП(ПолучитьЗначение(Стр,Инд));
       Если ПустоеЗначение(Значение) = 1 Тогда
           Продолжить;
       КонецЕсли;
       УстановитьЗначение(спр,Реквизит,Значение,поз);
   КонецЦикла;    
КонецПроцедуры

// ===============================
Функция НайтиПоКоду(Код,Тип=0,Владелец=0,ВидСпр=0)  
   Перем спр;
   // обратное преобразование
   Код = СтрЗаменить(Код,СимволЗамены,"/");
   
   Если Найти(Код,"/") = 0 Тогда
       // корень
       Возврат 1;
   КонецЕсли;
   
   ПолРод = 0;
   Если ВидСпр = 0 Тогда
       ВидСпр = СокрЛП(спрНаименование);
   КонецЕсли;    
   спр = СоздатьОбъект("Справочник."+ВидСпр);
   Если Владелец <> 0 Тогда
       спр.ИспользоватьВладельца(Владелец);
   КонецЕсли;                                        
   Если Тип = 0 Тогда
       // элемент
       Если спр.НайтиПоКоду(Код,2) = 1 Тогда
           Возврат спр.ТекущийЭлемент();
       Иначе
           Возврат 0;
       КонецЕсли;                              
   КонецЕсли;    
   
   // родитель
   Поз = СтрДлина(Код);
   
   Пока Поз > 1 Цикл
       Если Сред(Код, Поз, 1) = "/" Тогда
           КодРод = Лев(Код, Поз-1);              
           Если спр.НайтиПоКоду(КодРод, 2) = 1 Тогда
               Если спр.ЭтоГруппа() = Тип Тогда                                  
                   Возврат спр.ТекущийЭлемент();                    
               КонецЕсли;
           КонецЕсли;            
       КонецЕсли;
       Поз = Поз -1;  
   КонецЦикла;
   
   Возврат 0;
КонецФункции

// ===============================
Функция ПроверитьДанные(Строк,Столбцов)    
   Если (Строк < СтрокаШапки+1) или (Столбцов = 0) Тогда
       Предупреждение("Файл: "+СокрЛП(ИмяФайла)+" - не содержит данных для импорта!");
       Возврат 0;
   КонецЕсли;
   Фл = 1;                                          
   ДанныеВерсия = НРЕГ(СокрЛП(ПолучитьЗначение(1,1)));
   Если ДанныеВерсия <> НРЕГ(СокрЛП(Версия)) Тогда
       Если Вопрос("Версия данных не совпадает с тек. версией отчета:
       |версия данных: "+ДанныеВерсия+"
       |версия обраб.: "+Нрег(Версия)+"
       |ПРЕРВАТЬ ВЫПОЛНЕНИЕ?" ,"Да+Нет") = "Да" Тогда
           Возврат 0;
       КонецЕсли;
   КонецЕсли;      
   
   Если ПустоеЗначение(НРЕГ(СокрЛП(ПолучитьЗначение(2,1)))) = 1 Тогда
       Фл = 0;
       Предупреждение ("В исходном файле не обнаружно поле СПРАВОЧНИК: (2,1)");
   КонецЕсли;
   Если ПериодВел = 0 Тогда
       Если НРЕГ(СокрЛП(ПолучитьЗначение(СтрокаШапки,2))) <> "код" Тогда
           Фл = 0;
           Предупреждение ("В исходном файле не обнаружно поле КОД ("+СокрЛП(СтрокаШапки)+",2)");
       КонецЕсли;
       Если НРЕГ(СокрЛП(ПолучитьЗначение(СтрокаШапки,3))) <> "наименование" Тогда
           Фл = 0;
           Предупреждение ("В исходном файле не обнаружно поле НАИМЕНОВАНИЕ ("+СокрЛП(СтрокаШапки)+",3)");
       КонецЕсли;
       Если НРЕГ(СокрЛП(ПолучитьЗначение(СтрокаШапки,4))) <> "тип" Тогда
           Фл = 0;
           Предупреждение ("В исходном файле не обнаружно поле ТИП ("+СокрЛП(СтрокаШапки)+",4)");
       КонецЕсли;
       Если НРЕГ(СокрЛП(ПолучитьЗначение(СтрокаШапки,5))) <> "владелец" Тогда
           Фл = 0;
           Предупреждение ("В исходном файле не обнаружно поле ВЛАДЕЛЕЦ ("+СокрЛП(СтрокаШапки)+",5)");
       КонецЕсли;
   Иначе
       Если НРЕГ(СокрЛП(ПолучитьЗначение(СтрокаШапки,1))) <> "элемент" Тогда
           Фл = 0;
           Предупреждение ("В исходном файле не обнаружно поле Элемент ("+СокрЛП(СтрокаШапки)+",1)");
       КонецЕсли;
   КонецЕсли;
   
   спрНаименование = СокрЛП(ПолучитьЗначение(2,1));
   Попытка
       спр = СоздатьОбъект("Справочник."+спрНаименование);  
       спр.ИспользоватьДату(ДатаРекв,1);
   Исключение                                                            
       Предупреждение ("Справочник не существует: "+СокрЛП(спрНаименование)+" (2,1)");
       ВывестиЛог("Справочник не существует: "+СокрЛП(спрНаименование),2,1);        
       Фл = 0;
   КонецПопытки;        
   
   // проверим на дубли строк!
   Если (Фл = 1) и (ПериодВел = 0) Тогда
       тзДубль = СоздатьОбъект("ТаблицаЗначений");
       тзДубль.Очистить();
       тзДубль.НоваяКолонка("Имя");
       тзДубль.НоваяКолонка("Код");
       тзДубль.НоваяКолонка("Тип");
       тзДубль.НоваяКолонка("Владелец");
       Для Инд = СтрокаШапки+1 По Строк Цикл
           Код = СокрЛП(ПолучитьЗначение(Инд,2));
           Имя = ПолучитьЗначение(Инд,3);
           Тип = ПолучитьЗначение(Инд,4);
           ТекВладелец = ПолучитьЗначение(Инд,5);
           поз = 0;
           Если тзДубль.НайтиЗначение(Код,поз,"Код") <> 0 Тогда
               Если тзДубль.ПолучитьЗначение(поз,"Тип") = Тип Тогда
                   Если тзДубль.ПолучитьЗначение(поз,"Владелец") = ТекВладелец Тогда                    
                       Предупреждение("строка ["+сокрлп(инд)+"] дублирует строку ["+сокрлп(поз+2)+"]
                       |Код = "+СокрЛП(код)+"; Имя = "+СокрЛП(Имя)+"; Тип = "+СокрЛП(Тип));
                       Если Вопрос("Продолжить выполнение?","Да+Нет") = "Нет" Тогда
                           Фл = 0;
                           Прервать;
                       КонецЕсли;                    
                   КонецЕсли;
               КонецЕсли;    
           Иначе
               тзДубль.НоваяСтрока();
               тзДубль.Код = Код;
               тзДубль.Имя = Имя;
               тзДубль.Тип = Тип;
               тзДубль.Владелец = ТекВладелец;
           КонецЕсли;
       КонецЦикла;    
   КонецЕсли;    
   
   Возврат Фл;
КонецФункции

// ===============================
Функция ОпределитьКод(Код)    
   НовКод = СтрЗаменить(Код,СимволЗамены,"/");
   Поз = Найти(НовКод,"/");    
   Если Поз  = 0 Тогда
       Возврат СокрЛП(НовКод);
   КонецЕсли;
   
   Пока Поз <> 0 Цикл
       НовКод = Сред(НовКод,Поз+1);
       Поз = Найти(НовКод,"/");
   КонецЦикла;    
   Возврат НовКод;
КонецФункции

// ===============================
Функция ОбработатьПер(Стр)
   Если Лев(ПолучитьЗначение(Стр,1),2) = "//" Тогда
       //Комментарий или пустая строка !!!
       Возврат 0;
   КонецЕсли;                
   
   Код = ПолучитьЗначение(Стр,1);
   Если ПустоеЗначение(Код) = 0 Тогда
       ПолныйКод = СокрЛП(СтрЗаменить(Код,СимволЗамены,"/"));
       Если спр.НайтиПоКоду(ПолныйКод,2) = 0 Тогда
           ВывестиЛог("Не найден элемент: "+СокрЛП(Код),2,Стр);
           Возврат 0;
       КонецЕсли;    
   КонецЕсли;    
   // обновим историю        
   Пер = СоздатьОбъект("Периодический");
   Для Инд = 2 По Столбцов Цикл
       Реквизит = СокрЛП(ПолучитьЗначение(СтрокаШапки,Инд));
       Значение = ПолучитьЗначение(Стр,Инд);
       Если ПустоеЗначение(Значение) = 1 Тогда
           Продолжить;
       КонецЕсли;    
       Поз = Найти(Значение,СимволЗамены);
       Если Поз = 0 Тогда
           ВывестиЛог("Неверный формат значения: "+Значение,1,Стр);
       КонецЕсли;
       ДатаЗнач = Дата(Лев(Значение,Поз-1));
       Значение = Число(Сред(Значение,Поз+1));              
       
       Пер.ИспользоватьОбъект(Реквизит,спр.ТекущийЭлемент());        
       Пер.Значение = Значение;
       Пер.ДатаЗнач = ДатаЗнач;        
       Пер.Записать();        
   КонецЦикла;          
   Возврат 2;
КонецФункции

// ===============================
Функция Обработать(Стр)
   Если (Лев(ПолучитьЗначение(Стр,1),2) = "//") или (ПустоеЗначение(ПолучитьЗначение(Стр,2)) = 1) Тогда
       //Комментарий или пустая строка !!!
       Возврат 0;
   КонецЕсли;  
   
   Тип = Число(ПолучитьЗначение(Стр,4));
   Код = СокрЛП(ПолучитьЗначение(Стр,2));
   Наименование = СокрЛП(ПолучитьЗначение(Стр,3));
   Влад = СокрЛП(ПолучитьЗначение(Стр,5));
   
   ЭлВладелец = 0;
   Если (СокрЛП(Влад) <> "-") и (ПустоеЗначение(Влад) <> 1) Тогда
       поз = Найти(Влад,СимволЗамены);
       Если поз <> 0 Тогда
           // до поз, это видспр
           ВидСпрВлад = Лев(Влад,поз-1);
           КодВлад    = Сред(Влад,поз+1);
       Иначе
           ВывестиЛог("Не верный формат владельца: "+СокрЛП(Влад)+", ["+Код+"] пропущен",1,Стр);            
           Возврат 0;
       КонецЕсли;
       ЭлВладелец = НайтиПоКоду(КодВлад,0,0,ВидСпрВлад);
       Если ЭлВладелец = 0 Тогда
           ВывестиЛог("Не найден элемент владелец: "+ВидСпрВлад+": "+СокрЛП(КодВлад)+", ["+Код+"] пропущен",1,Стр);            
           Возврат 0;        
       КонецЕсли;
   КонецЕсли;
   
   Вид = ?(Тип=1,"Группа","Элемент");
   
   // ТИП = 1 - группа, ТИП = 0 - элемент;
   ВидОбработки = спВид.ПолучитьЗначение(спВид.ТекущаяСтрока());
   Если (Тип <> ВидОбработки) и (ВидОбработки <> 3) Тогда                                                                      
       // предупреждение
       ВывестиЛог("Содержит ТИП="+СокрЛП(Тип)+" ("+Вид+"), пропускается...",1,Стр);        
       Возврат 0;
   КонецЕсли;    
   
   Если ТипЗначенияСтр(ЭлВладелец) = "Справочник" Тогда
       спр.ИспользоватьВладельца(ЭлВладелец.ТекущийЭлемент());
   КонецЕсли;
   
   // поиск на вхождение
   Обновить = 0;            
   Код = СтрЗаменить(Код,СимволЗамены,"/");
   Если спр.НайтиПоКоду(Код,2) = 1 Тогда
       Если спр.ЭтоГруппа() = Тип Тогда
           Если рОбновлять = 0 Тогда
               ВывестиЛог(Вид+" с кодом: ["+СокрЛП(Код)+"] уже существует -  ["+СокрЛП(спр.ПолныйКод())+"] пропущен",1,Стр);        
               Если НРЕГ(СОКРЛП(спр.Наименование)) <> СОКРЛП(НРЕГ(Наименование)) Тогда
                   ВывестиЛог(" - 'существ. "+Вид+" имеет другое наименование: "+СокрЛП(спр.Наименование)+"; Наименование-импорт: "+СокрЛП(Наименование)+"'",2,Стр);
               КонецЕсли;
               Возврат 0;
           Иначе
               Обновить = 1;
           КонецЕсли;
       КонецЕсли;    
   КонецЕсли;  
   Если Обновить = 0 Тогда
       Если спр.НайтиПоНаименованию(Наименование,0,1) <> 0 Тогда
           // нашли такой же элемент по наименованию
           Если спр.ЭтоГруппа() = (1-Тип) Тогда            
               ВывестиЛог (Вид+" с наименованием: "+Наименование+" уже cуществ.: КОД = "+СокрЛП(спр.ПолныйКод()),1,Стр);
               Если рОбновлять = 0 Тогда            
                   ВывестиЛог(" - "+Вид+" будет создан с другим кодом ["+СокрЛП(Код)+"]",1,Стр);
               Иначе                
                   ВывестиЛог(" - "+Вид+" "+СокрЛП(спр.ТекущийЭлемент())+" будет обновлен.",1,Стр);
                   Обновить = 1;
               КонецЕсли;
           КонецЕсли;        
       КонецЕсли;                      
   КонецЕсли;                
   
   Если Обновить = 0 Тогда                
       // новый                
       // определение родителя
       Род = НайтиПоКоду(Код,1);                
       Если Род  = 0 Тогда
           ВывестиЛог("Ошибка определения РОДИТЕЛЯ у кода: "+СокрЛП(Код)+" в строке: ["+СокрЛП(стр)+"]",2,Стр);
           Возврат 0;          
       ИначеЕсли Род <> 1 Тогда
           спр.ИспользоватьРодителя(Род.ТекущийЭлемент());
       КонецЕсли;                
       
       Если Тип = 1 Тогда
           спр.НоваяГруппа();
       Иначе
           спр.Новый();
       КонецЕсли;      
       НовыйКод = ОпределитьКод(Код);
       спр.Код = НовыйКод;
   КонецЕсли;    
   
   спр.Наименование = Наименование;
   ЗаполнитьРеквизиты(спр,стр);
   
   Попытка
       спр.Записать();
   Исключение  
       ВывестиЛог("Произошла ошибка при записи: "+СокрЛП(спр.Код)+" "+СокрЛП(спр.Наименование)+" "+СокрЛП(спр.ПолныйКод())+" "+СокрЛП(спр)+": "+ОписаниеОшибки(),2,Стр);
       Сообщить("Произошла ошибка записи: "+СокрЛП(спр.Код)+" "+СокрЛП(спр.Наименование)+" "+ОписаниеОшибки(),"!");
       Возврат 0;
   КонецПопытки;
   
   Возврат 1+Обновить;
КонецФункции

// ===============================
Процедура ИмпортСпр()    
   Индикатор = "импорт...";
   
   Если ФС.СуществуетФайл(ИмяФайла) = 0 Тогда
       Предупреждение ("Файл импорта: "+СокрЛП(ИмяФайла)+" - не обнаружен!");
       Возврат;
   КонецЕсли;  
   
   Excel.Workbooks.Open(Сокрлп(ИмяФайла));
   Книга = Excel.ActiveWorkbook;
   
   Строк     = Excel.Cells.CurrentRegion.Rows.Count;
   Столбцов = Excel.Cells.CurrentRegion.Columns.Count;
   
   Если ПроверитьДанные(Строк,Столбцов) = 0 Тогда
       Сообщить("Обнаружены критические ошибки. Продолжение не возможно.","!");
       Возврат;
   КонецЕсли;    
   
   ИмяСпр = СокрЛП(ПолучитьЗначение(2,1));
   МД = Метаданные.Справочник(ИмяСпр);
   тзРекв = СоздатьОбъект("ТаблицаЗначений");
   тзРекв.Очистить();
   тзРекв.НоваяКолонка("Реквизит","Строка");
   тзРекв.НоваяКолонка("Тип","Строка");  
   тзРекв.НоваяКолонка("Вид","Строка");  
   тзРекв.НоваяКолонка("Периодический","Строка");  
   тзРекв.НоваяКолонка("ГрЭл","Строка");
   Для Инд = 1 По МД.Реквизит() Цикл                        
       тзРекв.НоваяСтрока();
       тзРекв.Реквизит = Нрег(СокрЛП(МД.Реквизит(Инд).Идентификатор));
       тзРекв.Тип = МД.Реквизит(Инд).Тип;
       тзРекв.Вид = МД.Реквизит(Инд).Вид;
       тзРекв.Периодический = МД.Реквизит(Инд).Периодический;        
       тзРекв.ГрЭл = МД.Реквизит(Инд).Использование;
   КонецЦикла;    
   
   ВывестиЛог("",0);
   Если Столбцов > 5 Тогда
       Для Инд = СлужКолонок+1 По Столбцов Цикл
           Реквизит = НРЕГ(СокрЛП(ПолучитьЗначение(СтрокаШапки,Инд)));
           Если тзРекв.НайтиЗначение(Реквизит,0,"Реквизит") = 0 Тогда
               ВывестиЛог("В справочнике отсутствует реквизит: "+Реквизит+" - колонка не будет обработана!",2,0);                
           КонецЕсли;
       КонецЦикла;    
   КонецЕсли;    
   
   // обработка файла
   КвоСтрок = 0;                
   КвоОбн   = 0;    
   Пропущено = 0;
   НачатьТранзакцию();
   Для Инд = СтрокаШапки+1 По Строк Цикл                                    
       Процент = Цел(Инд/Строк*100);
       глПоказатьИндикатор(Контекст,Процент,"импорт: ");
       
       Если ПериодВел = 0 Тогда
           ФлагВозврата = Обработать(Инд);
       Иначе
           ФлагВозврата = ОбработатьПер(Инд);
       КонецЕсли;                          
       
       Если ФлагВозврата = 1 Тогда
           КвоСтрок = КвоСтрок + 1;
       ИначеЕсли ФлагВозврата = 2 Тогда
           КвоОбн = КвоОбн + 1;
       Иначе
           Пропущено = Пропущено + 1;
       КонецЕсли;        
       Состояние("Обработка строки: ["+СокрЛП(Инд-2)+" из "+СокрЛП(Строк-2)+"]");
   КонецЦикла;          
   ВывестиЛог("",3);
   Excel.Workbooks.Close();
   Текст = СоздатьОбъект("Текст");
   Текст.ДобавитьСтроку(ТекстЛог);
   Текст.Записать(КаталогИБ()+"_import.log");
   ЗафиксироватьТранзакцию();                              
   
   Индикатор = "выполнено.";
   Форма.Обновить();
   
   Сообщить ("Импорт данных в "+ИмяСпр,"i");
   Сообщить ("_______________________________________________");
   Сообщить ("Всего:      ["+СокрЛП(Строк-3)+"] строк","i");
   Сообщить ("Обработано: ["+СокрЛП(КвоСтрок)+"] элементов и групп","i");
   Сообщить ("Обновлено:  ["+СокрЛП(КвоОбн)+"] элементов и групп.","i");    
   Сообщить ("Пропущено:  ["+СокрЛП(Пропущено)+"] элементов или групп пропущено.","i");    
КонецПроцедуры

// ===============================
Процедура ПриВыбореЗакладки(Номер,Значение)
   Форма.ИспользоватьСлой("Общий,"+Значение,2);
   Форма.кИмпорт.Заголовок(Значение);
КонецПроцедуры

// ===============================
Процедура ПриОткрытии()        
   Индикатор = "ожидание...";
   ОчиститьОкноСообщений();    
   
   // инициализация внутренних настроек
   Версия = "вер: 2.222";
   СимволЗамены = "\";
   СтрокаШапки = 3;            
   СлужКолонок = 5;
   
   Форма.Заголовок("Импорт/Экспорт справочников "+Версия);
   Форма.ИспользоватьЗакладки(1);  
   Форма.Закладки.ДобавитьЗначение("Импорт");
   Форма.Закладки.ДобавитьЗначение("Экспорт");    
   ПриВыбореЗакладки(1,"Импорт");
   
   Поз = Макс(спВид.ТекущаяСтрока(),1);
   
   спВид.УдалитьВсе();
   спВид.ДобавитьЗначение(0,"Только элементы");
   спВид.ДобавитьЗначение(1,"Только группы");
   спВид.ДобавитьЗначение(3,"Группы и элементы");
   
   спВид.ТекущаяСтрока(Поз);
   
   Поз = Макс(спСправ.ТекущаяСтрока(),1);
   
   спСправ.УдалитьВсе();
   Для Инд = 1 По Метаданные.Справочник() Цикл
       спСправ.ДобавитьЗначение(Метаданные.Справочник(Инд).Идентификатор,Метаданные.Справочник(Инд).Представление());
   КонецЦикла;    
   спСправ.Сортировать();
   спСправ.ТекущаяСтрока(Поз);
   ИзмСпр();
   
   Попытка
       Excel = СоздатьОбъект("Excel.Application");
   Исключение
       Сообщить("Похоже, MS-Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.","!");
       Форма.кИмпорт.Доступность(0);
       Возврат;                  
   КонецПопытки;            
   Если ПустоеЗначение(ДатаРекв) = 1 Тогда
       ДатаРекв = РабочаяДата();
   КонецЕсли;
КонецПроцедуры

// ===============================
Процедура ЗаполнитьШапку()
   ВидСпр = СокрЛП(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));
   МД = Метаданные.Справочник(ВидСпр);
   // впишем в эксель заголовки реквизитов                
   ПоместитьЗначение(1,1,Версия);
   ПоместитьЗначение(1,2," "+СокрЛП(РабочаяДата())+" --- "+СокрЛП(ТекущееВремя())+" --- "+СокрЛП(ИмяПользователя()));
   ПоместитьЗначение(2,1,ВидСпр);    
   
   Если ПериодВел = 0 Тогда
       ПоместитьЗначение(СтрокаШапки,1,"Глубина");
       ПоместитьЗначение(СтрокаШапки,2,"Код");
       ПоместитьЗначение(СтрокаШапки,3,"Наименование");
       ПоместитьЗначение(СтрокаШапки,4,"Тип");
       ПоместитьЗначение(СтрокаШапки,5,"Владелец");
       
       Для Инд = 2 По 5 Цикл        
           ПоместитьЗначение(2,Инд,Инд);
       КонецЦикла;    
       Столбец = СлужКолонок+1;
   Иначе                                              
       ПоместитьЗначение(3,1,"Элемент");        
       Столбец = 2;
   КонецЕсли;    
   
   Для Инд = 1 По спРекв.РазмерСписка() Цикл
       Если спРекв.Пометка(инд) = 0 Тогда
           Продолжить;
       КонецЕсли;                  
       Если ПериодВел = 1 Тогда                          
           Представление = "";
           Реквизит = СокрЛП(спРекв.ПолучитьЗначение(Инд,Представление));
           Если МД.Реквизит(Реквизит).Периодический = 0 Тогда
               Предупреждение("Реквизит: "+Представление+" не является периодическим!",20);
               спРекв.Пометка(Инд,0);
               Продолжить;
           КонецЕсли;
       КонецЕсли;
       ПоместитьЗначение(2,Столбец,Столбец);
       Ячейка = Excel.Cells (СтрокаШапки,Столбец);
       Ячейка.Value = СокрЛП(спРекв.ПолучитьЗначение(Инд));
       Столбец = Столбец + 1;
   КонецЦикла;    
КонецПроцедуры

// ===============================
Процедура ЗаполнитьИсторию(Стр,Элемент,МД);    
   Столбец = 1;    
   
   ПоместитьЗначение(Стр,Столбец,СокрЛП(СтрЗаменить(Элемент.ПолныйКод(),"/",СимволЗамены)));
   // Если у помещаемого кода не будет не одного реквизита, то он будет заменен следующим кодом, т.к. номер строки не изменится
               
   Пер = СоздатьОбъект("Периодический");    
   Для Инд = 1 По спРекв.РазмерСписка() Цикл
       Если спРекв.Пометка(Инд) = 0 Тогда
           Продолжить;
       КонецЕсли;            
       Реквизит = спРекв.ПолучитьЗначение(Инд);
       Если МД.Реквизит(Реквизит).Использование = "ДляЭлемента" Тогда
           ТипОбъекта = 0;
       ИначеЕсли МД.Реквизит(Реквизит).Использование = "ДляГруппы" Тогда
           ТипОбъекта = 1;
       Иначе
           ТипОбъекта = 3;
       КонецЕсли;        
       
       Если (ТипОбъекта <> 3) и (Элемент.ЭтоГруппа() <> ТипОбъекта) Тогда
           // реквизит не принадлежит группе или элементу
           Продолжить;
       КонецЕсли;    
       
       Столбец = Столбец + 1;                
       
       Если Пер.ИспользоватьОбъект(СокрЛП(Реквизит),Элемент.ТекущийЭлемент()) = 0 Тогда
           ВывестиЛог("Ошибка сопоставления: "+Реквизит+" для элемента: "+СокрЛП(Элемент.ПолныйКод())+" "+СокрЛП(Элемент)+" при выгрузке пер. величин!",2,0);
       КонецЕсли;  
       
       Пер.ВыбратьЗначения();  
       Пока Пер.ПолучитьЗначение() = 1 Цикл
           ДатаЗнач = Пер.ДатаЗнач;
           Значение = Пер.Значение;
           
           ПоместитьЗначение(Стр,Столбец,СокрЛП(ДатаЗнач)+СимволЗамены+СокрЛП(Значение));
           Стр = Стр + 1;
       КонецЦикла;                                      
   КонецЦикла;            
КонецПроцедуры

// ===============================
Процедура ЗаполнитьТаблицуВыгрузки(Табл,ТекВладелец=0)        
   Всего = 0;
   // ТИП(видобработки) = 1 - группа, ТИП = 0 - ТМЦ;        
   ВидОбработки = спВид.ПолучитьЗначение(спВид.ТекущаяСтрока());
   
   Влад = "-";
   Если ТекВладелец <> 0 Тогда
       ВлКод = СокрЛП(ТекВладелец.ПолныйКод());
       Влад = СокрЛП(ТекВладелец.Вид())+СимволЗамены+СтрЗаменить(ВлКод,"/",СимволЗамены);
   КонецЕсли;    
   
   ВидСпр = СокрЛП(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));
   спр = СоздатьОбъект("Справочник."+ВидСпр);        
   Если (Родитель.Выбран() = 1) и (Родитель.ЭтоГруппа() = 1) Тогда
       // обработка группы
       спр.ИспользоватьРодителя(Родитель);
   ИначеЕсли Родитель.Выбран() = 1 Тогда
       // обработка единичного элемента
       Табл.НоваяСтрока();        
       Табл.Тип        = Родитель.ЭтоГруппа();
       Табл.Элемент    = Родитель.ТекущийЭлемент();
       Табл.ПолныйКод    = Родитель.ПолныйКод();                            
       Табл.Владелец    = Влад;
       Возврат;
   КонецЕсли;
   
   // обработка группы    
   Если Вл
6 viktor_vv
 
26.07.12
11:15
Ты думаешь в этой простыне кто-то будет разбираться :)).
7 1Сергей
 
26.07.12
11:16
мде...
8 aleks-id
 
26.07.12
11:17
базовая единица периодический реквизит?
9 maxxxl-ms
 
26.07.12
11:20
базовая единица периодический реквизит?
нет
10 maxxxl-ms
 
26.07.12
11:22
Ты думаешь в этой простыне кто-то будет разбираться :)).
я не рассчитываю на это. просто на форумах обычно пишут для того чтобы если у кого то была подобная проблема, просто подсказали, как я подсказываю ПРОСТО на других форумах... А пустые слова кидать это легко конечно.
11 viktor_vv
 
26.07.12
11:22
По процедуре Выгрузить() пройдись отладчиком, вот здесь поставь точку останова, можешь по условию и смотри

Реквизит = спРекв.ПолучитьЗначение(Инд);            
// Точку останов по условию Реквизит = "БазоваяЕдиница"
               Если МД.Реквизит(Реквизит).Использование = "ДляЭлемента" Тогда
                   ТипОбъекта = 0;
               ИначеЕсли МД.Реквизит(Реквизит).Использование = "ДляГруппы" Тогда
                   ТипОбъекта = 1;
               Иначе
                   ТипОбъекта = 3;
               КонецЕсли;
12 viktor_vv
 
26.07.12
11:24
(10) Тебе уже подсказали про Отладчик, по другому ты вряд ли найдешь косяк.
Хотя бы локализовать проблему.
13 viktor_vv
 
26.07.12
11:27
Можешь вставиь еще сообщить вот здесь в процедуре Выгрузить().

// обычный режим

               Пер = МД.Реквизит(Реквизит).Периодический;
               Если Пер = 0 Тогда
                   Значение = Элемент.ПолучитьАтрибут(Реквизит);
               Иначе
                   Значение = Элемент.ПолучитьАтрибут(Реквизит).Получить(ДатаРекв);
               КонецЕсли;            
               
               ТипЗн = ТипЗначенияСтр(Значение);
Если Реквизит = "БазоваяЕдиница" Тогда
Сообщить("Значение единицы "+Значение);
КонецЕсли ;
КонецЕсли ;
14 maxxxl-ms
 
26.07.12
11:45
viktor_vv, сделал как ты сказал. В 1С показывает действительно значения базовой единицы, но в excel их не пишет снова почему то.
15 viktor_vv
 
26.07.12
11:47
Добавь еще

Если Реквизит = "БазоваяЕдиница" Тогда
Сообщить("Значение единицы "+Значение + "  Полный Код " + Значение.ПолныйКод());
КонецЕсли ;

У тебя случайно на этом справочнике не стоит длина кода 0 ?
16 viktor_vv
 
26.07.12
11:49
И таки поставь внутри условия точку останова в отладчике и пройдись дальше, смотри значения.
17 maxxxl-ms
 
26.07.12
11:51
Ок. Пишет так, вернее после Полный Код не пишет ничего: Значение единицы ШТ.  Полный Код
18 1Сергей
 
26.07.12
11:54
ТипЗн = ?
19 viktor_vv
 
26.07.12
11:59
(17) Что и требовалось доказать. Длина кода равна 0. Теперь еще скажи тип значение реквизита БазоваяЕдиница ?

И тогда вот так переделай

 ИначеЕсли ТипЗн = "Справочник" Тогда
   Если ТипЗначенияСтр(Значение) = "Справочник.ВидСправочникаДляРеквизитаБазоваяЕдиница" Тогда

  лсДляЗаписи = Значение.Наименование ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
                   ПоместитьЗначение(Стр,ТекСтолбец,СтрЗаменить(лсДляЗаписи,"/",СимволЗамены));
               ИначеЕсли ТипЗн = "Перечисление" Тогда
20 viktor_vv
 
26.07.12
12:00
(19)+ А прогнал.

 ИначеЕсли ТипЗн = "Справочник" Тогда
   Если Значение.Вид() = "ВидСправочникаДляРеквизитаБазоваяЕдиница" Тогда

  лсДляЗаписи = Значение.Наименование ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
                   ПоместитьЗначение(Стр,ТекСтолбец,СтрЗаменить(лсДляЗаписи,"/",СимволЗамены));
               ИначеЕсли ТипЗн = "Перечисление" Тогда
21 viktor_vv
 
26.07.12
12:02
Ну или если представление надо, то тогда наверное так лучше

   Если Значение.Вид() = "ВидСправочникаДляРеквизитаБазоваяЕдиница" Тогда

  лсДляЗаписи = СокрЛП(Значение) ;
22 maxxxl-ms
 
26.07.12
12:14
(19)+ А прогнал.

 ИначеЕсли ТипЗн = "Справочник" Тогда
   Если Значение.Вид() = "ВидСправочникаДляРеквизитаБазоваяЕдиница" Тогда

  лсДляЗаписи = Значение.Наименование ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
                   ПоместитьЗначение(Стр,ТекСтолбец,СтрЗаменить(лсДляЗаписи,"/",СимволЗамены));
               ИначеЕсли ТипЗн = "Перечисление" Тогда

Сделал так, но значений нет.
23 1Сергей
 
26.07.12
12:19
(22) у тебя там перечисление или справочник. ТипЗн =?
24 viktor_vv
 
26.07.12
12:25
(22) Вместо этого "ВидСправочникаДляРеквизитаБазоваяЕдиница" что написал у себя ?
25 viktor_vv
 
26.07.12
12:27
(23) Справочник там походу. Во сюда заходит и на метод Значение.ПолныйКод() не ругается.

Если Реквизит = "БазоваяЕдиница" Тогда
Сообщить("Значение единицы "+Значение + "  Полный Код " + Значение.ПолныйКод());
КонецЕсли ;
26 maxxxl-ms
 
26.07.12
12:46
Справочник писал да. Но не добавило ничего в excel.
27 viktor_vv
 
26.07.12
13:08
Ну дай свой кусок кода, который отрабатывает. Или напиши конкретно какой справочник, че шифроваться-то.
28 viktor_vv
 
26.07.12
13:09
(27)+ Кусок кода с изменениями. Тебя таки не отпускает мысль о наличии телепатов на этом форуме.
29 maxxxl-ms
 
26.07.12
13:11
Процедура Выгрузить(Табл)
   ВидСпр = СокрЛП(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));
   МД = Метаданные.Справочник(ВидСпр);                                
   
   ТекСтрока = СтрокаШапки;        
   Стр = 0;
   
   Всего = Табл.КоличествоСтрок();
   Табл.ВыбратьСтроки();          
   Пока Табл.ПолучитьСтроку() = 1 Цикл
       Если (ПериодВел = 0) или (Стр = 0) Тогда
           Стр = Табл.НомерСтроки+ТекСтрока;
       КонецЕсли;    
       
       Процент = Цел(Табл.НомерСтроки/Всего*100);
       глПоказатьИндикатор(Контекст,Процент,"экспорт: ");
       Состояние("Выгрузка: ["+СокрЛП(Табл.НомерСтроки)+" из "+СокрЛП(Всего)+"]");
       
       Элемент = Табл.Элемент.ТекущийЭлемент();
       Код = СтрЗаменить(СокрЛП(Элемент.ПолныйКод()),"/",СимволЗамены);
       
       Если ПериодВел = 0 Тогда
           Глубина = СтрЧислоВхождений(СокрЛП(Элемент.ПолныйКод()),"/")+1;
           
           Наименование = СокрЛП(Элемент.Наименование);
           Тип = Элемент.ЭтоГруппа();
           Влад = Табл.Владелец;
           
           ПоместитьЗначение(Стр,1,Глубина);        
           ПоместитьЗначение(Стр,2,Код);        
           ПоместитьЗначение(Стр,3,Наименование);        
           ПоместитьЗначение(Стр,4,Тип);        
           ПоместитьЗначение(Стр,5,Влад);                    
           
           ТекСтолбец = СлужКолонок+1;    
       
           // заполнить реквизиты
           Для Инд = 1 По спРекв.РазмерСписка() Цикл
               Если спРекв.Пометка(Инд) = 0 Тогда
                   Продолжить;                    
               КонецЕсли;
               Реквизит = спРекв.ПолучитьЗначение(Инд);            
               Если МД.Реквизит(Реквизит).Использование = "ДляЭлемента" Тогда
                   ТипОбъекта = 0;
               ИначеЕсли МД.Реквизит(Реквизит).Использование = "ДляГруппы" Тогда
                   ТипОбъекта = 1;
               Иначе
                   ТипОбъекта = 3;
               КонецЕсли;        
               
               Если (ТипОбъекта <> 3) и (Элемент.ЭтоГруппа() <> ТипОбъекта) Тогда
                   // реквизит не принадлежит группе или элементу
                   Продолжить;
               КонецЕсли;    
               
               // обычный режим
               Пер = МД.Реквизит(Реквизит).Периодический;
               Если Пер = 0 Тогда
                   Значение = Элемент.ПолучитьАтрибут(Реквизит);
               Иначе
                   Значение = Элемент.ПолучитьАтрибут(Реквизит).Получить(ДатаРекв);
               КонецЕсли;            
               
               ТипЗн = ТипЗначенияСтр(Значение);
               
                               ТипЗн = ТипЗначенияСтр(Значение);
//Если Реквизит = "БазоваяЕдиница" Тогда
//Сообщить("Значение единицы "+Значение);
//КонецЕсли ;
         
              Если Реквизит = "БазоваяЕдиница" Тогда
Сообщить("Значение единицы "+Значение + "  Полный Код " + Значение.ПолныйКод());
КонецЕсли ;
       
               
               Если ТипЗн = "Строка" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));        
               ИначеЕсли ТипЗн = "Число" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,Число(Значение));        
               ИначеЕсли ТипЗн = "Дата" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Счет" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Документ" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение.ДатаДок)+СимволЗамены+СокрЛП(Значение.НомерДок));
ИначеЕсли ТипЗн = "Справочник" Тогда
   Если Значение.Вид() = "Строка" Тогда

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

Вот тут писал уже тип строка и всё равно.
30 maxxxl-ms
 
26.07.12
13:15
Оригинальный код:

Процедура Выгрузить(Табл)
   ВидСпр = СокрЛП(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));
   МД = Метаданные.Справочник(ВидСпр);                                
   
   ТекСтрока = СтрокаШапки;        
   Стр = 0;
   
   Всего = Табл.КоличествоСтрок();
   Табл.ВыбратьСтроки();          
   Пока Табл.ПолучитьСтроку() = 1 Цикл
       Если (ПериодВел = 0) или (Стр = 0) Тогда
           Стр = Табл.НомерСтроки+ТекСтрока;
       КонецЕсли;    
       
       Процент = Цел(Табл.НомерСтроки/Всего*100);
       глПоказатьИндикатор(Контекст,Процент,"экспорт: ");
       Состояние("Выгрузка: ["+СокрЛП(Табл.НомерСтроки)+" из "+СокрЛП(Всего)+"]");
       
       Элемент = Табл.Элемент.ТекущийЭлемент();
       Код = СтрЗаменить(СокрЛП(Элемент.ПолныйКод()),"/",СимволЗамены);
       
       Если ПериодВел = 0 Тогда
           Глубина = СтрЧислоВхождений(СокрЛП(Элемент.ПолныйКод()),"/")+1;
           
           Наименование = СокрЛП(Элемент.Наименование);
           Тип = Элемент.ЭтоГруппа();
           Влад = Табл.Владелец;
           
           ПоместитьЗначение(Стр,1,Глубина);        
           ПоместитьЗначение(Стр,2,Код);        
           ПоместитьЗначение(Стр,3,Наименование);        
           ПоместитьЗначение(Стр,4,Тип);        
           ПоместитьЗначение(Стр,5,Влад);                    
           
           ТекСтолбец = СлужКолонок+1;    
       
           // заполнить реквизиты
           Для Инд = 1 По спРекв.РазмерСписка() Цикл
               Если спРекв.Пометка(Инд) = 0 Тогда
                   Продолжить;                    
               КонецЕсли;
               Реквизит = спРекв.ПолучитьЗначение(Инд);            
               Если МД.Реквизит(Реквизит).Использование = "ДляЭлемента" Тогда
                   ТипОбъекта = 0;
               ИначеЕсли МД.Реквизит(Реквизит).Использование = "ДляГруппы" Тогда
                   ТипОбъекта = 1;
               Иначе
                   ТипОбъекта = 3;
               КонецЕсли;        
               
               Если (ТипОбъекта <> 3) и (Элемент.ЭтоГруппа() <> ТипОбъекта) Тогда
                   // реквизит не принадлежит группе или элементу
                   Продолжить;
               КонецЕсли;    
               
               // обычный режим
               Пер = МД.Реквизит(Реквизит).Периодический;
               Если Пер = 0 Тогда
                   Значение = Элемент.ПолучитьАтрибут(Реквизит);
               Иначе
                   Значение = Элемент.ПолучитьАтрибут(Реквизит).Получить(ДатаРекв);
               КонецЕсли;            
               
               ТипЗн = ТипЗначенияСтр(Значение);
               
               Если ТипЗн = "Строка" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));        
               ИначеЕсли ТипЗн = "Число" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,Число(Значение));        
               ИначеЕсли ТипЗн = "Дата" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Счет" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Документ" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение.ДатаДок)+СимволЗамены+СокрЛП(Значение.НомерДок));
               ИначеЕсли ТипЗн = "Справочник" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СтрЗаменить(Значение.ПолныйКод(),"/",СимволЗамены));
               ИначеЕсли ТипЗн = "Перечисление" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение.Идентификатор()));
               Иначе
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               КонецЕсли;  
               
               ТекСтолбец = ТекСтолбец + 1;
           КонецЦикла;                
       Иначе  
           // выгрузка истории пер. величин
           ЗаполнитьИсторию(Стр,Элемент,МД);
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры
31 viktor_vv
 
26.07.12
13:33
(29) Капец. Ну ты блин читать умеешь ?

Если Значение.Вид() = "ВотЗдесьНадоВидСправочникаДляРеквизитаБазоваяЕдиница" Тогда

  лсДляЗаписи = Значение.Наименование ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
                   ПоместитьЗначение(Стр,ТекСтолбец,СтрЗаменить(лсДляЗаписи,"/",СимволЗамены));
32 viktor_vv
 
26.07.12
13:35
Ладно, давай так.

ИначеЕсли ТипЗн = "Справочник" Тогда
Если Реквизит = "БазоваяЕдиница" Тогда
 Сообщить(Значение.Вид()); // Вот то что выдаст, то и пиши вмсето "ВотЗдесьНадоВидСправочникаДляРеквизитаБазоваяЕдиница"
КонецЕсли ;
   Если Значение.Вид() = "Строка" Тогда

  лсДляЗаписи = Значение.Наименование ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
33 viktor_vv
 
26.07.12
13:37
А так еще универсальнее будет. А то у тебя еще вдруг и длина наименования будет 0.

ИначеЕсли ТипЗн = "Справочник" Тогда
   Если Метаданные.Справочник(Значение.ДлинаКода) = 0 Тогда

  лсДляЗаписи = СокрЛП(Значение) ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
34 viktor_vv
 
26.07.12
13:38
(33) +
Если Метаданные.Справочник(Значение.ДлинаКода) = 0 Тогда

Заменить на

Если Метаданные.Справочник(Значение.Вид()).ДлинаКода = 0 Тогда
35 maxxxl-ms
 
26.07.12
14:44
Тип показывает Единицы. Это возможно?
36 maxxxl-ms
 
26.07.12
15:07
Всё сделал, пашет спасибо всем.
Вот итог:
Процедура Выгрузить(Табл)
   ВидСпр = СокрЛП(спСправ.ПолучитьЗначение(спСправ.ТекущаяСтрока()));
   МД = Метаданные.Справочник(ВидСпр);                                
   
   ТекСтрока = СтрокаШапки;        
   Стр = 0;
   
   Всего = Табл.КоличествоСтрок();
   Табл.ВыбратьСтроки();          
   Пока Табл.ПолучитьСтроку() = 1 Цикл
       Если (ПериодВел = 0) или (Стр = 0) Тогда
           Стр = Табл.НомерСтроки+ТекСтрока;
       КонецЕсли;    
       
       Процент = Цел(Табл.НомерСтроки/Всего*100);
       глПоказатьИндикатор(Контекст,Процент,"экспорт: ");
       Состояние("Выгрузка: ["+СокрЛП(Табл.НомерСтроки)+" из "+СокрЛП(Всего)+"]");
       
       Элемент = Табл.Элемент.ТекущийЭлемент();
       Код = СтрЗаменить(СокрЛП(Элемент.ПолныйКод()),"/",СимволЗамены);
       
       Если ПериодВел = 0 Тогда
           Глубина = СтрЧислоВхождений(СокрЛП(Элемент.ПолныйКод()),"/")+1;
           
           Наименование = СокрЛП(Элемент.Наименование);
           Тип = Элемент.ЭтоГруппа();
           Влад = Табл.Владелец;
           
           ПоместитьЗначение(Стр,1,Глубина);        
           ПоместитьЗначение(Стр,2,Код);        
           ПоместитьЗначение(Стр,3,Наименование);        
           ПоместитьЗначение(Стр,4,Тип);        
           ПоместитьЗначение(Стр,5,Влад);                    
           
           ТекСтолбец = СлужКолонок+1;    
       
           // заполнить реквизиты
           Для Инд = 1 По спРекв.РазмерСписка() Цикл
               Если спРекв.Пометка(Инд) = 0 Тогда
                   Продолжить;                    
               КонецЕсли;
               Реквизит = спРекв.ПолучитьЗначение(Инд);            
               Если МД.Реквизит(Реквизит).Использование = "ДляЭлемента" Тогда
                   ТипОбъекта = 0;
               ИначеЕсли МД.Реквизит(Реквизит).Использование = "ДляГруппы" Тогда
                   ТипОбъекта = 1;
               Иначе
                   ТипОбъекта = 3;
               КонецЕсли;        
               
               Если (ТипОбъекта <> 3) и (Элемент.ЭтоГруппа() <> ТипОбъекта) Тогда
                   // реквизит не принадлежит группе или элементу
                   Продолжить;
               КонецЕсли;    
                   
                         

 
               // обычный режим
               Пер = МД.Реквизит(Реквизит).Периодический;
               Если Пер = 0 Тогда
                   Значение = Элемент.ПолучитьАтрибут(Реквизит);
               Иначе
                   Значение = Элемент.ПолучитьАтрибут(Реквизит).Получить(ДатаРекв);
               КонецЕсли;            
               
               ТипЗн = ТипЗначенияСтр(Значение);
               
               Если Реквизит = "БазоваяЕдиница" Тогда
 Сообщить(Значение.Вид());
КонецЕсли ;
           
               Если ТипЗн = "Строка" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));        
               ИначеЕсли ТипЗн = "Число" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,Число(Значение));
               ИначеЕсли ТипЗн = "Единицы" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Дата" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Счет" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               ИначеЕсли ТипЗн = "Документ" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение.ДатаДок)+СимволЗамены+СокрЛП(Значение.НомерДок));
               ИначеЕсли ТипЗн = "Справочник" Тогда
                   Если Значение.Вид() = "Единицы" Тогда

  лсДляЗаписи = Значение.Наименование ;
Иначе
лсДляЗаписи = Значение.ПолныйКод() ;
КонецЕсли ;
                   ПоместитьЗначение(Стр,ТекСтолбец,СтрЗаменить(лсДляЗаписи,"/",СимволЗамены));
               ИначеЕсли ТипЗн = "Перечисление" Тогда
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение.Идентификатор()));
               Иначе
                   ПоместитьЗначение(Стр,ТекСтолбец,СокрЛП(Значение));
               КонецЕсли;  
               
               ТекСтолбец = ТекСтолбец + 1;
           КонецЦикла;                
       Иначе  
           // выгрузка истории пер. величин
           ЗаполнитьИсторию(Стр,Элемент,МД);
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры
Программист всегда исправляет последнюю ошибку.