Выгрузка в Excel Плохой тип переменной

Новая тема
Показывать по 10 20 40 сообщений
"У меня шапка формируется, и номенклатура выгружается с кодами и с артикулами, только вот с ценами немогу разобраться
Вот процедура выгрузки, тут правда много лишнего, потомучто лепил сам из обычной процедуры вгрузки в таблицу

Процедура Выгрузить()
Перем СписокПозиций, СписокТоваров, ТекСтрока;

ТекСтрока = 2;

СписокТоваров = СоздатьОбъект("СписокЗначений");
СписокПозиций = СоздатьОбъект("СписокЗначений");
   
НаложенФильтрПоТоварам=0;

// накладываем множественный фильтр по товарам
Если МФНоменклатура.РазмерСписка()<>0 Тогда
   
Для Индекс=1 По МФНоменклатура.РазмерСписка() Цикл
Позиция = МФНоменклатура.ПолучитьЗначение(Индекс);

НоменкВложенаВДругую=0;
Для Индекс2=1 По МФНоменклатура.РазмерСписка() Цикл
   Если Индекс2<>Индекс Тогда      
Позиция2 = МФНоменклатура.ПолучитьЗначение(Индекс2);
Если Позиция2.ЭтоГруппа()>0 Тогда
Если Позиция.ПринадлежитГруппе(Позиция2)>0 Тогда
НоменкВложенаВДругую=1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Если НоменкВложенаВДругую=1 Тогда
Продолжить;
КонецЕсли;    

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

КонецЦикла;

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

Если НаложенФильтрПоТоварам=1 Тогда

ЧислоТов = СписокПозиций.РазмерСписка();
Для Индекс = 1 По ЧислоТов Цикл

НеУдовлетвФильтру=0;
Номенк = СписокТоваров.ПолучитьЗначение(ЧислоТов+1-Индекс);

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

Иначе  

СпрПозиций = СоздатьОбъект("Справочник."+ВидСправочника);
СпрПозиций.ВыбратьЭлементы();
Пока СпрПозиций.ПолучитьЭлемент()>0 Цикл
Если СпрПозиций.ЭтоГруппа()=0 Тогда    
Если Нрег(ВидСправочника) = "прайс_лист" Тогда
Номенк = СпрПозиций.Товар.ТекущийЭлемент();
Иначе
Номенк = СпрПозиций.ТекущийЭлемент();
КонецЕсли;

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

КонецЕсли;

Если СписокПозиций.РазмерСписка()=0 Тогда
Предупреждение("Список позиций пуст");
Возврат;
КонецЕсли;
   
НаложенФильтрПоТоварам=1;

КонецЕсли;

Если МФКатНоменклатуры.РазмерСписка() > 0 Тогда
   
ТекстЗапроса = "                    
   |Обрабатывать НеПомеченныеНаУдаление;
|КатегорияПозиции = Справочник.КатегорииТоваров.ТекущийЭлемент;
|Товар = Справочник.КатегорииТоваров.Владелец;
|КатегорияТов = Справочник.КатегорииТоваров.Категория;                
|Группировка Товар Без Групп;
|Группировка КатегорияТов Без Групп;
|Условие (КатегорияТов В МФКатНоменклатуры);
|Условие (Товар В СписокТоваров);";

// выполняем запрос
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;
                 
СписокТоваров.УдалитьВсе();
ЧислоКатегорийВСписке = МФКатНоменклатуры.РазмерСписка();

// выгружаем все отобранные товары в список
Запрос.ВНачалоВыборки();
Пока Запрос.Группировка("Товар") = 1 Цикл
Если Запрос.Товар.Выбран() = 1 Тогда                                  
Если ТипМФКатНоменклатуры.ТекущаяСтрока() = 2 Тогда
// одновременно все категории должны быть в списке МФКатегории

ПозицияСправочника = Запрос.Товар.ТекущийЭлемент();

// ячитаем число категорий
ЧислоКатегорий = 0;
Пока Запрос.Группировка("КатегорияТов") = 1 Цикл
Если Запрос.КатегорияТов.Выбран() = 1 Тогда                                  
ЧислоКатегорий = ЧислоКатегорий + 1;
КонецЕсли;
КонецЦикла;

// все категории будут тогда и только тогда, когда число отобранных
// категорий будет не меньше размера списка МФКатегории
Если ЧислоКатегорий >= ЧислоКатегорийВСписке Тогда
СписокТоваров.ДобавитьЗначение(ПозицияСправочника.ТекущийЭлемент());
КонецЕсли;
Иначе
СписокТоваров.ДобавитьЗначение(Запрос.Товар.ТекущийЭлемент());
КонецЕсли;
КонецЕсли;
КонецЦикла;

Если НаложенФильтрПоТоварам = 1 Тогда

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

Иначе

СпрПозиций = СоздатьОбъект("Справочник." + ВидСправочника);
СпрПозиций.ВыбратьЭлементы();
Пока СпрПозиций.ПолучитьЭлемент() = 1 Цикл
Если СпрПозиций.ЭтоГруппа() = 0 Тогда    
Если СписокТоваров.Принадлежит(?(НРег(ВидСправочника) = "прайс_лист",
СпрПозиций.ТекущийЭлемент().Товар,
СпрПозиций.ТекущийЭлемент())) = 1 Тогда
СписокПозиций.ДобавитьЗначение(?(НРег(ВидСправочника) = "прайс_лист", СпрПозиций.ТекущийЭлемент(), СпрПозиций.Товар.ТекущийЭлемент()));
КонецЕсли;
КонецЕсли;
КонецЦикла;

КонецЕсли;

Если СписокПозиций.РазмерСписка() = 0 Тогда
Предупреждение("Список позиций пуст");
Возврат;
КонецЕсли;

КонецЕсли;

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

// выполняем запрос
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;
             
//  Создание Таблицы для выходного отчета
//Таб=СоздатьОбъект("Таблица");

Ном=0;

Если (ЕдиницаПечати.ТекущаяСтрока()<>1)И(ЕдиницаПечати.ТекущаяСтрока()<>2) Тогда
ПечатьВФиксЕдиницах = 0;
Иначе
ПечатьВФиксЕдиницах = 1;
КонецЕсли;          

Если ВалютаПечати.Выбран()=0 Тогда
ПечатьВФиксВалюте = 0;
Заг="""";
Иначе                  
ПечатьВФиксВалюте = 1;
Валюта = ВалютаПечати;
Заг="Цены указаны в "+СокрЛП(Валюта.Кратко);
КонецЕсли;

//Таб.ВывестиСекцию("Отчет");
//Таб.ВывестиСекцию("Шапка|НазваниеПозиции");
Для Индекс = 1 По МФКатЦены.РазмерСписка() Цикл
ТипЦены = МФКатЦены.ПолучитьЗначение(Индекс);
//Таб.ПрисоединитьСекцию("Шапка|Цена");
КонецЦикла;
       
СписокГрупп = СоздатьОбъект("СписокЗначений");

Цена = СоздатьОбъект("Справочник.Цены");
Цена.ИспользоватьДату(РабочаяДата());

Пока Запрос.Группировка("Позиция")>0 Цикл
Если Запрос.Позиция.Выбран()=0 Тогда
Продолжить;
КонецЕсли;  
   
глОживить(1);

Если Запрос.Позиция.ЭтоГруппа()=1 тогда
СписокГрупп.ДобавитьЗначение(Запрос.Позиция.ТекущийЭлемент());
Продолжить;
КонецЕсли;
   
Цена.ИспользоватьВладельца(Запрос.Товар.ТекущийЭлемент());

Если Нрег(ВидСправочника) = "прайс_лист" Тогда
НашлиНенулевуюЦену=0;

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

Если НашлиНенулевуюЦену=0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

Пока СписокГрупп.РазмерСписка()>0 Цикл
Гр = СписокГрупп.ПолучитьЗначение(1);
Если Запрос.Позиция.ПринадлежитГруппе(Гр)>0 Тогда

Страница.Cells(ТекСтрока, 1).Value = "Г";
Страница.Cells(ТекСтрока, 2).Value = Гр.Наименование;
ТекСтрока = ТекСтрока + 1;

КонецЕсли;
СписокГрупп.УдалитьЗначение(1);
КонецЦикла;
                 
Если ПечатьВФиксЕдиницах=1 Тогда
Если ЕдиницаПечати.ТекущаяСтрока()=1 Тогда
Единица = Запрос.Товар.ЕдиницаПоУмолчанию;
ИначеЕсли ЕдиницаПечати.ТекущаяСтрока()=2 Тогда
Единица = глВернутьБазовуюЕдиницуТовара(Запрос.Товар.ТекущийЭлемент());
КонецЕсли;
КонецЕсли;

Ном=Ном+1;
КолРек=МФКатЦены.РазмерСписка();
Для Номм=1 По КолРек Цикл
Страница.Cells(1,Номм+4).Value=МФКатЦены.ПолучитьЗначение(Номм).Наименование;
КонецЦикла;





Страница.Cells(ТекСтрока, 1).Value = "Э";                          
Страница.Cells(ТекСтрока, 2).Value = СокрЛП(Запрос.Товар.Код);
   Страница.Cells(ТекСтрока, 4).Value = СокрЛП(Запрос.Товар.ПолнНаименование);
Страница.Cells(ТекСтрока, 3).Value = СокрЛП(Запрос.Товар.Артикул);

ТекСтрока = ТекСтрока + 1;


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

Иначе

Если ПечатьВФиксВалюте=0 Тогда
Валюта = Цена.Валюта;
КонецЕсли;

Если ПечатьВФиксЕдиницах=0 Тогда
Единица = Цена.Единица;
КонецЕсли;

ЧЦена = Цена.Цена;
Если Единица<>Цена.Единица Тогда
ЧЦена = ?(Цена.Единица.Коэффициент = 0,ЧЦена * Единица.Коэффициент / 1,ЧЦена * Единица.Коэффициент / Цена.Единица.Коэффициент);
КонецЕсли;
ЧЦена = глПересчет(ЧЦена,Цена.Валюта,РабочаяДата(),Валюта,РабочаяДата());



     
Для Инд = 1 По МФКатЦены.РазмерСписка() Цикл                  
ТипЦены = МФКатЦены.ПолучитьЗначение(Инд).ТекущийЭлемент();
Страница.Cells(ТекСтрока-1, Инд+4).Value =?????????????????;
КонецЦикла;
КонецЕсли;
   
     

// Для Номмер=1 По МФКатЦены.РазмерСписка() Цикл

// Таб.ПрисоединитьСекцию("Товар|Цена");

КонецЦикла;

КонецЦикла;


// Excel.Workbooks.Close();
Excel = 0;

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

Процедура ПриОткрытии()

ExcelApp = СоздатьОбъект("Excel.Application");  
НовыеРабочиеКниги=ExcelApp.WorkBooks;    
РабочаяКнига    =НовыеРабочиеКниги.Add();
Страница=РабочаяКнига.Worksheets(1);  
Страница.Name = "Прайс";      
ExcelApp.Visible=1;    

   Страница.Range("A1").Value="№";

Страница.Range("B1").Value="Карточка";

   Страница.Range("C1").Value="Артикул";

Страница.Range("D1").Value="Наименование Товара";
КонецПроцедуры
    "
" Для Инд = 1 По МФКатЦены.РазмерСписка() Цикл                  
ТипЦены = МФКатЦены.ПолучитьЗначение(Инд).ТекущийЭлемент();
Страница.Cells(ТекСтрока-1, Инд+4).Value =?????????????????;
КонецЦикла;

Заменить на
Страница.Cells(ТекСтрока-1, Индекс + 4).Value = ЧЦена;

Вы и так уже находитесь в цикле по МФКатЦены, зачем еще раз в цикле обращаться к типам цен?????
"
Спасибо все работает))))
Осталось только подточить немножко
Еще вопрос по ходу
как мне объеденить диапазон ячеек при выгрузке в ексель?
Можно воспользоваться справкой в Excel по Visual Basic for Application
Или  проще
В Excele есть возможность "записать макрос", нажимаете начать запись, делаете все что хотите. Останавливаете запись. Заходите в получившийся макрос и смотрите все необходимые вам команды
когда в ексель выгружается артикул например 14.1701240 , то получается 14,1701240, т.е точка заменяется запятой
как исправить?
Использовать Формат.
интересно какой
Например 1С-ный (все-равно строку загоняете в Excel):
Формат(<Значение>, <Форматная строка>)

В обысном случае если число конвертится в строку, то ставиться запятая (может берется из настроек системы, а может еще где прописано)
"Exc.Cells(1, Ном).Value=Число(МФКатЦены.ПолучитьЗначение(Ном)); - Для чисел
Exc.Cells(1, Ном).Value=СокрЛП(МФКатЦены.ПолучитьЗначение(Ном)); - Для строк

Просто ЭКСЕЛЮ нужно явное преобразование типов."
Читают тему
(гостей: 1)

Быстрый переход