|
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; КонецЦикла; Иначе // выгрузка истории пер. величин ЗаполнитьИсторию(Стр,Элемент,МД); КонецЕсли; КонецЦикла; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |