Выгрузка в Excel Плохой тип переменной
13.03.2009
09:36
#21
"У меня шапка формируется, и номенклатура выгружается с кодами и с артикулами, только вот с ценами немогу разобраться
Вот процедура выгрузки, тут правда много лишнего, потомучто лепил сам из обычной процедуры вгрузки в таблицу
Процедура Выгрузить()
Перем СписокПозиций, СписокТоваров, ТекСтрока;
ТекСтрока = 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="Наименование Товара";
КонецПроцедуры
"
Вот процедура выгрузки, тут правда много лишнего, потомучто лепил сам из обычной процедуры вгрузки в таблицу
Процедура Выгрузить()
Перем СписокПозиций, СписокТоваров, ТекСтрока;
ТекСтрока = 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="Наименование Товара";
КонецПроцедуры
"
13.03.2009
10:13
#22
" Для Инд = 1 По МФКатЦены.РазмерСписка() Цикл
ТипЦены = МФКатЦены.ПолучитьЗначение(Инд).ТекущийЭлемент();
Страница.Cells(ТекСтрока-1, Инд+4).Value =?????????????????;
КонецЦикла;
Заменить на
Страница.Cells(ТекСтрока-1, Индекс + 4).Value = ЧЦена;
Вы и так уже находитесь в цикле по МФКатЦены, зачем еще раз в цикле обращаться к типам цен?????
"
ТипЦены = МФКатЦены.ПолучитьЗначение(Инд).ТекущийЭлемент();
Страница.Cells(ТекСтрока-1, Инд+4).Value =?????????????????;
КонецЦикла;
Заменить на
Страница.Cells(ТекСтрока-1, Индекс + 4).Value = ЧЦена;
Вы и так уже находитесь в цикле по МФКатЦены, зачем еще раз в цикле обращаться к типам цен?????
"
17.03.2009
06:48
#25
Можно воспользоваться справкой в Excel по Visual Basic for Application
Или проще
В Excele есть возможность "записать макрос", нажимаете начать запись, делаете все что хотите. Останавливаете запись. Заходите в получившийся макрос и смотрите все необходимые вам команды
Или проще
В Excele есть возможность "записать макрос", нажимаете начать запись, делаете все что хотите. Останавливаете запись. Заходите в получившийся макрос и смотрите все необходимые вам команды
19.03.2009
17:03
#26
когда в ексель выгружается артикул например 14.1701240 , то получается 14,1701240, т.е точка заменяется запятой
как исправить?
как исправить?
Читают тему
(гостей: 1)