8.х Загрузка документа из Excel

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Cooper-Mixal, 28 июл 2008.

  1. TopicStarter Overlay
    Cooper-Mixal
    Offline

    Cooper-Mixal Опытный в 1С

    Регистрация:
    29 июн 2008
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Разбираю внешний отчет и столкнулся с такой проблеммой, не могу найти В котором месте происходит передача значения в 1С???

    Подскажите пожалуйста.

    Код:
     
    Процедура Загрузить()
    Перем НомСтр, Предст, Конт, НазваниеОПоля;
    
    Список = СоздатьОбъект("СписокЗначений");
    СпрРодителей = СоздатьОбъект("СписокЗначений");
    
    ТекВид = "Документ."+СписокДок.ПолучитьЗначение(СписокДок.ТекущаяСтрока());
    Док = СоздатьОбъект(ТекВид);
    
    Для А = 1 По ТЗ.КоличествоСтрок() Цикл         
    Идент2 = ТЗ.ПолучитьЗначение(А,2); 
    НомСтр = "";
    ТЗРекв.НайтиЗначение(Идент2,НомСтр,1);
    Тип = ТЗРекв.ПолучитьЗначение(НомСтр,2);
    Вид = ТЗРекв.ПолучитьЗначение(НомСтр,3);
    
    Если Тип = "Неопределенный" Тогда 
    НомСтр = "";
    ТЗСинхр2.НайтиЗначение(Идент2,НомСтр,1);
    Тип = ТЗСинхр2.ПолучитьЗначение(НомСтр,2);
    Вид = ТЗСинхр2.ПолучитьЗначение(НомСтр,3);  
    КонецЕсли;	
    
    Если Тип = "Справочник" Тогда   
    Спр = СоздатьОбъект("Справочник."+Вид);
    Владелец = "" + Метаданные.Справочник(Вид).Владелец;
    Если Владелец="Метаданные" Тогда
    Список.ДобавитьЗначение(Спр,"Справочник");
    Иначе
    Список.ДобавитьЗначение(Спр,"ПодчСправочник");
    КонецЕсли;  
    ИначеЕсли Тип = "Перечисление" Тогда   
    Спр = Перечисление.ПолучитьАтрибут(Вид);
    Список.ДобавитьЗначение(Спр,"Перечисление");
    ИначеЕсли Тип = "Число" Тогда
    Список.ДобавитьЗначение(А,"Число");  
    ИначеЕсли Тип = "Строка" Тогда
    Список.ДобавитьЗначение(А,"Строка");
    ИначеЕсли Тип = "Дата" Тогда
    Список.ДобавитьЗначение(А,"Дата"); 
    Иначе
    Список.ДобавитьЗначение(А,"Неизвестно"); 
    КонецЕсли;
    КонецЦикла;
    
    НачатьТранзакцию();
    ТекВид = "Документ."+СписокДок.ПолучитьЗначение(СписокДок.ТекущаяСтрока());
    ОткрытьФорму(ТекВид,Конт);
    Для А=1 По СписокРеквШапки.РазмерСписка() Цикл
    СписокРеквШапки.ПолучитьЗначение(А,Предст);
    Значение = Конт.ПолучитьАтрибут(Предст);  
    СписокРеквШапки.УстановитьЗначение(А,Значение,Предст);
    КонецЦикла;
    Конт.Форма.Закрыть(0); 
    Конт = "";
    ОтменитьТранзакцию();  
    
    фДействия = СписокДействий.ТекущаяСтрока();
    КолвоСтрок = КонСтр - НачСтр + 1;
    ПрогрессБар = "";
    счетчик = 0;
    Если Есть=1 Тогда
    Для А = НачСтр По КонСтр Цикл
    Док.Новый();
    Для С = 1 По ТЗСинхр2.КоличествоСтрок() Цикл
    ТЗСинхр2.ПолучитьСтрокуПоНомеру(С);
    ИмяТипа = "";
    Если ПустоеЗначение(ТЗСинхр2.Тип)=0 Тогда ИмяТипа = "" + ТЗСинхр2.Тип КонецЕсли;
    Если ПустоеЗначение(ТЗСинхр2.Вид)=0 Тогда ИмяТипа = ИмяТипа + "." + ТЗСинхр2.Вид КонецЕсли;
    Если ПустоеЗначение(ИмяТипа)=0 Тогда Док.НазначитьТип(ТЗСинхр2.Рекв,ИмяТипа) КонецЕсли;
    КонецЦикла;          
    
    Для С=1 По СписокРеквШапки.РазмерСписка() Цикл
    Значение = СписокРеквШапки.ПолучитьЗначение(С,Предст);
    Док.УстановитьАтрибут(Предст,Значение);
    КонецЦикла;
    
    СпрРодителей.УдалитьВсе();
    Для В = 1 По Список.РазмерСписка() Цикл
    НомКол = ТЗ.ПолучитьЗначение(В,3);
    Атрибут = ТЗ.ПолучитьЗначение(В,2);
    Значен = ВходExcel.ActiveSheet.Cells(А,НомКол).Value; 
    
    Рекв = Список.ПолучитьЗначение(В,Предст);  
    Если (Предст="Справочник") ИЛИ (Предст="ПодчСправочник") Тогда 
    ТекСпр = Рекв;
    фПодчинения = 0;
    Если СокрЛП(Предст) = "ПодчСправочник" Тогда
    фПодчинения = 1;
    Владелец = "" + Метаданные.Справочник(ТекСпр.Вид()).Владелец.Идентификатор;
    ТекВладелец = СпрРодителей.Получить(Владелец);
    Если ПустоеЗначение(ТекВладелец)=0 Тогда
    ТекСпр.ИспользоватьВладельца(ТекВладелец);
    Иначе
    Сообщить("XLS-Документооборот: У справочника "+ТекСпр.Вид()+" не найден владелец "+Владелец);
    КонецЕсли;
    КонецЕсли;
    Если ПоискЭлемента(ТекСпр, Значен, фПодчинения, фДействия)=1 Тогда
    Док.УстановитьАтрибут(Атрибут,ТекСпр.ТекущийЭлемент());
    СпрРодителей.ДобавитьЗначение(ТекСпр.ТекущийЭлемент(),ТекСпр.Вид()); 
    КонецЕсли;
    ИначеЕсли Предст="Перечисление" Тогда 
    ЗначенПеречисл = Рекв.ЗначениеПоИдентификатору(СокрЛП(Значен));
    Если ЗначенПеречисл=0 Тогда
    Сообщить("XLS-Документооборот: Перечисление "+Значен+" не найдено");
    Иначе
    Док.УстановитьАтрибут(Атрибут,ЗначенПеречисл);
    КонецЕсли;
    ИначеЕсли Предст="Число" Тогда
    Док.УстановитьАтрибут(Атрибут,Число(Значен));
    ИначеЕсли Предст="Строка" Тогда
    Док.УстановитьАтрибут(Атрибут,Строка(Значен));
    ИначеЕсли Предст="Дата" Тогда
    Док.УстановитьАтрибут(Атрибут,Дата(Значен));
    Иначе   
    Сообщить("XLS-Документооборот: Найден необрабатываемый тип у реквизита "+Атрибут);
    КонецЕсли;	
    КонецЦикла;
    Док.Записать();
    ОткрытьФорму(Док.ТекущийДокумент());  
    счетчик = счетчик + 1;
    Процент = Окр(100*счетчик/КолвоСтрок);
    ПрогрессБар = ПрогрессБар + "|";
    Состояние(""+Процент+"%  "+ПрогрессБар);
    КонецЦикла;
    Иначе   
    Док.Новый();
    
    Для С=1 По СписокРеквШапки.РазмерСписка() Цикл
    Значение = СписокРеквШапки.ПолучитьЗначение(С,Предст);
    Док.УстановитьАтрибут(Предст,Значение);
    КонецЦикла;
    
    Для А = НачСтр По КонСтр Цикл 
    
    Значен = ВходExcel.ActiveSheet.Cells(А,НачКол).Value;
    Сообщить(Значение);
    Если СокрЛП(Значен)="#НовыйДокумент#" Тогда 
    Док.Записать(); 
    ОткрытьФорму(Док.ТекущийДокумент());
    
    Док.Новый();
    Для С=1 По СписокРеквШапки.РазмерСписка() Цикл    
    
    Значение = СписокРеквШапки.ПолучитьЗначение(С,Предст);  
    
    Док.УстановитьАтрибут(Предст,Значение);
    КонецЦикла;
    Продолжить;
    КонецЕсли;
    
    Док.НоваяСтрока();     
    Для С = 1 По ТЗСинхр2.КоличествоСтрок() Цикл
    ТЗСинхр2.ПолучитьСтрокуПоНомеру(С);
    ИмяТипа = "";
    Если ПустоеЗначение(ТЗСинхр2.Тип)=0 Тогда ИмяТипа = "" + ТЗСинхр2.Тип КонецЕсли;
    Если ПустоеЗначение(ТЗСинхр2.Вид)=0 Тогда ИмяТипа = ИмяТипа + "." + ТЗСинхр2.Вид КонецЕсли;
    Если ПустоеЗначение(ИмяТипа)=0 Тогда Док.НазначитьТип(ТЗСинхр2.Рекв,ИмяТипа) КонецЕсли;
    КонецЦикла;          
    
    СпрРодителей.УдалитьВсе();
    Для В = 1 По Список.РазмерСписка() Цикл
    НомКол = ТЗ.ПолучитьЗначение(В,3);
    Атрибут = ТЗ.ПолучитьЗначение(В,2);
    Значен = ВходExcel.ActiveSheet.Cells(А,НомКол).Value;
    Рекв = Список.ПолучитьЗначение(В,Предст);
    Если (Предст="Справочник") ИЛИ (Предст="ПодчСправочник") Тогда
    ТекСпр = Рекв;  
    фПодчинения = 0;
    Если СокрЛП(Предст) = "ПодчСправочник" Тогда 
    фПодчинения = 1;
    Владелец = "" + Метаданные.Справочник(ТекСпр.Вид()).Владелец.Идентификатор;
    ТекВладелец = СпрРодителей.Получить(Владелец);
    Если ПустоеЗначение(ТекВладелец)=0 Тогда
    ТекСпр.ИспользоватьВладельца(ТекВладелец);
    Иначе
    Сообщить("XLS-Документооборот: У справочника "+ТекСпр.Вид()+" не найден владелец "+Владелец);
    КонецЕсли;
    КонецЕсли;
    Если ПоискЭлемента(ТекСпр, Значен, фПодчинения, фДействия)=1 Тогда
    Док.УстановитьАтрибут(Атрибут,ТекСпр.ТекущийЭлемент());
    СпрРодителей.ДобавитьЗначение(ТекСпр.ТекущийЭлемент(),ТекСпр.Вид()); 
    КонецЕсли;
    ИначеЕсли Предст="Перечисление" Тогда 
    ЗначенПеречисл = Рекв.ЗначениеПоИдентификатору(СокрЛП(Значен));
    Если ЗначенПеречисл=0 Тогда
    Сообщить("XLS-Документооборот: Перечисление "+Значен+" не найдено");
    Иначе
    Док.УстановитьАтрибут(Атрибут,ЗначенПеречисл);
    КонецЕсли;
    ИначеЕсли Предст="Число" Тогда
    Док.УстановитьАтрибут(Атрибут,Число(Значен));
    ИначеЕсли Предст="Строка" Тогда
    Док.УстановитьАтрибут(Атрибут,Строка(Значен));
    ИначеЕсли Предст="Дата" Тогда
    Док.УстановитьАтрибут(Атрибут,Дата(Значен));
    Иначе   
    Сообщить("XLS-Документооборот: Найден необрабатываемый тип у реквизита "+Атрибут);
    КонецЕсли;	
    КонецЦикла;
    счетчик = счетчик + 1;
    Процент = Окр(100*счетчик/КолвоСтрок);
    ПрогрессБар = ПрогрессБар + "|";
    Состояние(""+Процент+"%  "+ПрогрессБар);
    КонецЦикла;
    Док.Записать(); 
    ОткрытьФорму(Док.ТекущийДокумент());
    КонецЕсли; 
    
    Док = "";
    Спр = "";
    Список = "";
    СпрРодителей = "";
    
    КонецПроцедуры  
    
    
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Значение чего?
  3. Kaboom
    Offline

    Kaboom Опытный в 1С

    Регистрация:
    2 июл 2007
    Сообщения:
    158
    Симпатии:
    0
    Баллы:
    26
    Вообще то это код семерки
    Код:
    Список = СоздатьОбъект("СписокЗначений");
    
    Такого в восьмерке уже нету.
    А передача значений происходит при выполнении отмеченных строк.
    Код:
    	Если Есть=1 Тогда
    ...
    Иначе   
    Док.Новый();
    
    Для С=1 По СписокРеквШапки.РазмерСписка() Цикл
    Значение = СписокРеквШапки.ПолучитьЗначение(С,Предст);
    Док.УстановитьАтрибут(Предст,Значение);
    КонецЦикла;
    
    Для А = НачСтр По КонСтр Цикл 
    
    Значен = ВходExcel.ActiveSheet.Cells(А,НачКол).Value; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Сообщить(Значение);
    Если СокрЛП(Значен)="#НовыйДокумент#" Тогда 
    Док.Записать(); 
    ОткрытьФорму(Док.ТекущийДокумент());
    
    Док.Новый();
    Для С=1 По СписокРеквШапки.РазмерСписка() Цикл    
    
    Значение = СписокРеквШапки.ПолучитьЗначение(С,Предст);  
    
    Док.УстановитьАтрибут(Предст,Значение);
    КонецЦикла;
    Продолжить;
    КонецЕсли;
    
    Док.НоваяСтрока();     
    Для С = 1 По ТЗСинхр2.КоличествоСтрок() Цикл
    ТЗСинхр2.ПолучитьСтрокуПоНомеру(С);
    ИмяТипа = "";
    Если ПустоеЗначение(ТЗСинхр2.Тип)=0 Тогда ИмяТипа = "" + ТЗСинхр2.Тип КонецЕсли;
    Если ПустоеЗначение(ТЗСинхр2.Вид)=0 Тогда ИмяТипа = ИмяТипа + "." + ТЗСинхр2.Вид КонецЕсли;
    Если ПустоеЗначение(ИмяТипа)=0 Тогда Док.НазначитьТип(ТЗСинхр2.Рекв,ИмяТипа) КонецЕсли;
    КонецЦикла;          
    
    СпрРодителей.УдалитьВсе();
    Для В = 1 По Список.РазмерСписка() Цикл
    НомКол = ТЗ.ПолучитьЗначение(В,3);
    Атрибут = ТЗ.ПолучитьЗначение(В,2);
    Значен = ВходExcel.ActiveSheet.Cells(А,НомКол).Value;  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Рекв = Список.ПолучитьЗначение(В,Предст);
    Если (Предст="Справочник") ИЛИ (Предст="ПодчСправочник") Тогда
    ТекСпр = Рекв;  
    фПодчинения = 0;
    Если СокрЛП(Предст) = "ПодчСправочник" Тогда 
    фПодчинения = 1;
    Владелец = "" + Метаданные.Справочник(ТекСпр.Вид()).Владелец.Идентификатор;
    ТекВладелец = СпрРодителей.Получить(Владелец);
    Если ПустоеЗначение(ТекВладелец)=0 Тогда
    ТекСпр.ИспользоватьВладельца(ТекВладелец);
    Иначе
    Сообщить("XLS-Документооборот: У справочника "+ТекСпр.Вид()+" не найден владелец "+Владелец);
    КонецЕсли;
    КонецЕсли;
    Если ПоискЭлемента(ТекСпр, Значен, фПодчинения, фДействия)=1 Тогда
    Док.УстановитьАтрибут(Атрибут,ТекСпр.ТекущийЭлемент());
    СпрРодителей.ДобавитьЗначение(ТекСпр.ТекущийЭлемент(),ТекСпр.Вид()); 
    КонецЕсли;
    ИначеЕсли Предст="Перечисление" Тогда 
    ЗначенПеречисл = Рекв.ЗначениеПоИдентификатору(СокрЛП(Значен));
    Если ЗначенПеречисл=0 Тогда
    Сообщить("XLS-Документооборот: Перечисление "+Значен+" не найдено");
    Иначе
    Док.УстановитьАтрибут(Атрибут,ЗначенПеречисл);
    КонецЕсли;
    ИначеЕсли Предст="Число" Тогда
    Док.УстановитьАтрибут(Атрибут,Число(Значен));
    ИначеЕсли Предст="Строка" Тогда
    Док.УстановитьАтрибут(Атрибут,Строка(Значен));
    ИначеЕсли Предст="Дата" Тогда
    Док.УстановитьАтрибут(Атрибут,Дата(Значен));
    Иначе   
    Сообщить("XLS-Документооборот: Найден необрабатываемый тип у реквизита "+Атрибут);
    КонецЕсли;	
    КонецЦикла;
    счетчик = счетчик + 1;
    Процент = Окр(100*счетчик/КолвоСтрок);
    ПрогрессБар = ПрогрессБар + "|";
    Состояние(""+Процент+"%  "+ПрогрессБар);
    КонецЦикла;
    Док.Записать(); 
    ОткрытьФорму(Док.ТекущийДокумент());
    КонецЕсли; 
    

Поделиться этой страницей