// Обработка формирование прайс лист в excel
// Данная обработка формирует прайс и группирует данные в книге Excel, так как в 1С работают группировки в 1С
Перем Ексель,Лист,НомерСтроки;
Перем НомерКолонкиНаименования, НомерКолонкиКода, НомерКолонкиЦены, НомерКолонкиГарантия, НомерКолонкиЗаказ;
Перем МаксУровней,ДатаФормированияПрайса;
Функция rgb(r,g,b)
Возврат r+g*256+b*65536;
КонецФункции
Процедура ВыгрузитьСтроки(Корень,Уровень)
НачСтрока=НомерСтроки;
Строки=Корень.Строки.НайтиСтроки(Новый Структура("ЭтоГруппа",Истина),Ложь);
Для каждого Стр из Строки Цикл
Range = Лист.Range(Лист.Cells(НомерСтроки, НомерКолонкиКода), Лист.Cells(НомерСтроки, 6));
Range.Merge();
Range.Value = Стр.Наименование;
Range.Font.Name = "Baskerville Old Face";
Range.Font.Size = 16-Стр.Уровень();
Range.IndentLevel = Стр.Уровень();
Range.Font.Bold = 1;
НомерСтроки=НомерСтроки+1;
ВыгрузитьСтроки(Стр,Стр.Уровень());
КонецЦикла;
Строки=Корень.Строки.НайтиСтроки(Новый Структура("ЭтоГруппа",Ложь),Ложь);
Для каждого Стр из Строки Цикл
//Лист.Cells(НомерСтроки,1).Value=Стр.Наименование;
//Лист.Cells(НомерСтроки,2).Value=Стр.Цена;
Лист.Cells(НомерСтроки, НомерКолонкиКода).Value = Стр.Код;
Лист.Cells(НомерСтроки, НомерКолонкиНаименования).Value = Стр.НаименованиеПолное;
Лист.Cells(НомерСтроки, НомерКолонкиНаименования).IndentLevel = Стр.Уровень();
Если стрДлина(Стр.СсылкаUrl)>0 тогда
Лист.Hyperlinks.Add(Лист.Cells(НомерСтроки, НомерКолонкиНаименования),Стр.СсылкаUrl,Стр.НаименованиеПолное);
КонецЕсли;
Лист.Cells(НомерСтроки, НомерКолонкиЦены).NumberFormat ="# ##0,00";
Лист.Cells(НомерСтроки, НомерКолонкиЦены).Value = Стр.Цена;
Лист.Cells(НомерСтроки, НомерКолонкиГарантия).NumberFormat = "0";
Лист.Cells(НомерСтроки, НомерКолонкиГарантия).Value = Стр.Гарантия;
Range = Лист.Range(Лист.Cells(НомерСтроки, 2), Лист.Cells(НомерСтроки, 6));
Range.Font.Name = "Arial";
Range.Font.Size = 8;
Если Стр.Изменение тогда
Range.Font.Bold = 1;
КонецЕсли;
Если НомерСтроки%2 тогда
Range. Interior.Color = rgb(227,237,249);
КонецЕсли;
Лист.Cells(НомерСтроки, НомерКолонкиЗаказ).NumberFormat = "0";
Лист.Cells(НомерСтроки, НомерКолонкиЗаказ).Interior.Color = rgb(218,238,243);
НомерСтроки=НомерСтроки+1;
КонецЦикла;
Если (Уровень>=0) и (НомерСтроки>НачСтрока) Тогда
Лист.Range(Лист.Cells(НачСтрока,1),Лист.Cells(НомерСтроки-1,2)).Rows.Group();
КонецЕсли;
МаксУровней = Макс(Уровень,МаксУровней);
КонецПроцедуры
Функция ОграничениеЗапросаПоНоменклатуре(ВнЗапрос)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДляПрайсаСрезПоследних.Номенклатура КАК Номенклатура,
| НоменклатураДляПрайсаСрезПоследних.Отбор КАК Отбор
|ИЗ
| РегистрСведений.НоменклатураДляПрайса.СрезПоследних(&ДатаФормированияПрайса, Активен) КАК НоменклатураДляПрайсаСрезПоследних";
Запрос.УстановитьПараметр("ДатаФормированияПрайса", ДатаФормированияПрайса);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
СтрокаОтбора = "И ( ";
Первый = Истина;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
//ПредопределенноеЗначение(Перечисления.ОтборВЗапросах.Равно)
Ун = СтрЗаменить(ВыборкаДетальныеЗаписи.Номенклатура.УникальныйИдентификатор(),"-","");
СтрокаПараметра = "Отбор"+Ун;//.Наименование;// + ВыборкаДетальныеЗаписи.Отбор; // Пока не важно так как 1 значение в регистре
ВнЗапрос.УстановитьПараметр(СтрокаПараметра,ВыборкаДетальныеЗаписи.Номенклатура);
Если Первый тогда
БулеваяОперация = "";
Первый = Ложь;
Иначе
БулеваяОперация = " ИЛИ ";
КонецЕсли;
СтрокаОтбора = СтрокаОтбора +БулеваяОперация+ " (Номенклатура.Ссылка " + ВыборкаДетальныеЗаписи.Отбор + " (&" + СтрокаПараметра + "))";
КонецЦикла;
СтрокаОтбора = СтрокаОтбора + ")";
ВнЗапрос.Текст = СтрЗАменить(ВнЗапрос.Текст,"//Добавление отбора",СтрокаОтбора);
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
Попытка
Ексель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
конецПопытки;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ПОМЕСТИТЬ СправочникНоменклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| (НЕ Номенклатура.ЭтоГруппа)
| И ИСТИНА //Добавление отбора
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
|ПОМЕСТИТЬ Начало
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &ТекДата,
| Склад В (&Склад)
| И Номенклатура В
| (ВЫБРАТЬ
| СправочникНоменклатура.Ссылка
| ИЗ
| СправочникНоменклатура КАК СправочникНоменклатура)) КАК ТоварыНаСкладахОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &ТекДата,
| ТипЦен = &ТипЦен
| И Валюта = &Валюта) КАК ЦеныНоменклатурыСрезПоследних
| ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Начало.Номенклатура,
| Начало.КоличествоОстаток,
| Начало.Цена,
| Начало.ХарактеристикаНоменклатуры,
| ВЫБОР
| КОГДА ЦеныНоменклатурыСрезПоследних.Цена = Начало.Цена
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК Изменение
|ПОМЕСТИТЬ ТблИзмЦен
|ИЗ
| Начало КАК Начало
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ДОБАВИТЬКДАТЕ(&ТекДата, ДЕНЬ, -1),
| ТипЦен = &ТипЦен
| И Валюта = &Валюта) КАК ЦеныНоменклатурыСрезПоследних
| ПО Начало.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| И Начало.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка
|ПОМЕСТИТЬ ТблПриходов
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ТекДата, ДЕНЬ, -1) И &ТекДата
| И ПоступлениеТоваровУслуг.Проведен
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТблИзмЦен.Номенклатура,
| ТблИзмЦен.КоличествоОстаток,
| ТблИзмЦен.Цена,
| ТблИзмЦен.ХарактеристикаНоменклатуры,
| ВЫБОР
| КОГДА СУММА(ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Количество, 0)) > 0
| ТОГДА ИСТИНА
| ИНАЧЕ ТблИзмЦен.Изменение
| КОНЕЦ КАК Изменение
|ПОМЕСТИТЬ ИтоговаяТбл
|ИЗ
| ТблИзмЦен КАК ТблИзмЦен
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
| ПО ТблИзмЦен.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура
| И ТблИзмЦен.ХарактеристикаНоменклатуры = ПоступлениеТоваровУслугТовары.ХарактеристикаНоменклатуры
| И (ПоступлениеТоваровУслугТовары.Ссылка В
| (ВЫБРАТЬ
| ТблПриходов.Ссылка
| ИЗ
| ТблПриходов КАК ТблПриходов))
| И (ПоступлениеТоваровУслугТовары.Склад В (&Склад))
|
|СГРУППИРОВАТЬ ПО
| ТблИзмЦен.Номенклатура,
| ТблИзмЦен.КоличествоОстаток,
| ТблИзмЦен.Цена,
| ТблИзмЦен.ХарактеристикаНоменклатуры,
| ТблИзмЦен.Изменение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ИтоговаяТбл.Номенклатура КАК Номенклатура,
| ИтоговаяТбл.КоличествоОстаток,
| ИтоговаяТбл.Цена,
| ИтоговаяТбл.ХарактеристикаНоменклатуры,
| ИтоговаяТбл.Изменение,
| ИтоговаяТбл.Номенклатура.СсылкаUrl КАК СсылкаUrl,
| ЗначенияСвойствОбъектов.Значение КАК Гарантия,
| ИтоговаяТбл.Номенклатура.Код КАК Код,
| ИтоговаяТбл.Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
| ИтоговаяТбл.Номенклатура.Наименование КАК Наименование,
| ИтоговаяТбл.Номенклатура.ЭтоГруппа КАК ЭтоГруппа
|ИЗ
| ИтоговаяТбл КАК ИтоговаяТбл
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО ИтоговаяТбл.Номенклатура = ЗначенияСвойствОбъектов.Объект
| И (ЗначенияСвойствОбъектов.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.Гарантия))
|ГДЕ
| ИСТИНА
|ИТОГИ ПО
| Номенклатура ТОЛЬКО ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ";
ОграничениеЗапросаПоНоменклатуре(Запрос);
Запрос.УстановитьПараметр("ТекДата",ДатаФормированияПрайса);
Запрос.УстановитьПараметр("ТипЦен",Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000020"));
Запрос.УстановитьПараметр("Валюта",Константы.ВалютаУправленческогоУчета.Получить());
СписокСкладов = Новый СписокЗначений;
СписокСкладов.Добавить(Справочники.Склады.НайтиПоКоду("002200001")); //Центральный склад
СписокСкладов.Добавить(Справочники.Склады.НайтиПоКоду("002500019")); //Футляры Центральный склад
Запрос.УстановитьПараметр("Склад",СписокСкладов);
Результат = Запрос.Выполнить();
Ексель.DisplayAlerts=Ложь;
Ексель.Visible = ложь;
Книга = Ексель.Workbooks.Add();
Лист = Книга.WorkSheets(1);
Лист.Select();
Ексель.Application.ActiveWindow.SplitRow = 4;
Ексель.Application.ActiveWindow.FreezePanes = 1;
Коеф = 27;
кнопка1 = Книга.WorkSheets(1).Shapes.AddOLEObject("Forms.CommandButton.1", , , , , , , 3, 3, 80, 20);
кнопка1.Name = "Свернуть";
кнопка1.TextFrame.Characters().Text = "Свернуть";
кнопка2 = Книга.WorkSheets(1).Shapes.AddOLEObject("Forms.CommandButton.1", , , , , , , 100, 3, 80, 20);
кнопка1.Name = "ПоказатьВсе";
кнопка1.Name = "КнопкаСвернуть";
кнопка1.Caption = "Свернуть";
кнопка1 = Книга.WorkSheets(1).Buttons.Add(100, 3, 80, 20);
кнопка1.Name = "КнопкаСвернуть";
кнопка1.Caption = "Свернуть";
кнопка1 = Книга.WorkSheets(1).Shapes.AddOLEObject("Forms.CommandButton.1",,,,,,,3, 3, 80, 25);
кнопка1.Name = "КнопкаПоказатьВсе";
Книга.WorkSheets(1).oleobjects(1).Object.Caption = "Показать все";
ст = "Sub Main()
|MsgBox(""Hello, World!"") ' Display message on computer screen.
|End Sub";
Ексель.VBE.ActiveVBProject.VBComponents.Add (1);
Ексель.VBE.ActiveVBProject.VBComponents.Item(1).CodeModule.InsertLines (1, ст);
Ексель.Application.Save();
кнопка2 = Книга.WorkSheets(1).Shapes.AddOLEObject("Forms.CommandButton.1",,,,,,,100, 3, 80, 25);
кнопка2.Name = "КнопкаСвернуть";
Книга.WorkSheets(1).oleobjects(2).Object.Caption = "Свернуть все" ;
кнопка2 = Книга.WorkSheets(1).Buttons.Add(3, 3, 80, 20);
кнопка2.Name = "КнопкаПоказатьВсе";
кнопка2.Caption = "Показать все";
Лист.Outline.SummaryRow = 0;
// { Master 25.11.2011 17:52:33 Прайс-лист
Range = Лист.Range(Лист.Cells(1, 2), Лист.Cells(1, 6));
Range.Merge();
Range.Value = "Прайс-лист";
Range.Font.Name = "Courier New";
Range.Font.Size = 22;
Range.HorizontalAlignment =3;
Range.VerticalAlignment =2;
// }
Лист.Cells(2, 2).Value = "Цены указаны на "+ Формат(ДатаФормированияПрайса,"ДФ=dd.MM.yyyy");
Лист.Cells(2, 2).Name = "Arial";
Лист.Cells(2, 2).Font.Size = 8;
НомерСтроки = 5;
НомерКолонкиНаименования = 3;
НомерКолонкиКода = 2;
НомерКолонкиЦены = 4;
НомерКолонкиГарантия = 5;
НомерКолонкиЗаказ = 6;
// { Master 25.11.2011 17:52:33 Название номенклатура
Range = Лист.Range(Лист.Cells(3, НомерКолонкиКода), Лист.Cells(4, НомерКолонкиКода));
Range.Merge();
Range.Value = "Код";
// }
// { Master 25.11.2011 17:52:33 Название номенклатура
Range = Лист.Range(Лист.Cells(3, НомерКолонкиНаименования), Лист.Cells(4, НомерКолонкиНаименования));
Range.Merge();
Range.Value = "Номенклатура";
// }
// { Master 25.11.2011 17:52:56
Range = Лист.Range(Лист.Cells(3, НомерКолонкиЦены), Лист.Cells(4, НомерКолонкиЦены));
Range.Merge();
Range.Value = "Цена";
// }
// { Master 25.11.2011 17:52:56
Range = Лист.Range(Лист.Cells(3, НомерКолонкиГарантия), Лист.Cells(4, НомерКолонкиГарантия));
Range.Merge();
Range.Value = "Гарантия (мес.)";
Range.WrapText = Истина;
// }
// { Master 25.11.2011 17:52:56
Range = Лист.Range(Лист.Cells(3, НомерКолонкиЗаказ), Лист.Cells(4, НомерКолонкиЗаказ));
Range.Merge();
Range.Value = "Заказ";
// }
Range = Лист.Range(Лист.Cells(3, 2), Лист.Cells(4, 6));
Range.Font.Name = "Arial Narrow";
Range.Font.Size = 12;
Range.HorizontalAlignment =3;
Range.VerticalAlignment =2;
Range.Borders(1).Weight = 2;
Range.Borders(2).Weight = 2;
Range.Borders(3).Weight = 2;
Range.Interior.Color = rgb(54,96,146);
Range.Font.Color = rgb(255,255,255);
Лист.Columns(1).ColumnWidth = 3;
Лист.Columns(НомерКолонкиКода).ColumnWidth = 11;
Лист.Columns(НомерКолонкиНаименования).ColumnWidth = 80;
Лист.Columns(НомерКолонкиЦены).ColumnWidth = 15;
Лист.Columns(НомерКолонкиГарантия).ColumnWidth = 7.86;
Лист.Columns(НомерКолонкиЗаказ).ColumnWidth = 12;
Дерево=Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ВыгрузитьСтроки(Дерево,-1);
Range = Лист.Range(Лист.Cells(5, 2), Лист.Cells(НомерСтроки-1, 6));
Range.Borders(1).Weight = 2;
Range.Borders(2).Weight = 2;
Range.Borders(3).Weight = 2;
Range.Borders(4).Weight = 2;
//область = Лист.Range(Формат(5,"ЧГ=0")+":"+Формат(НомерСтроки,"ЧГ=0"));
//область.Rows.Group();
//Лист.Outline.ShowLevels(2);
//Лист.Outline.ShowLevels(1);
Книга.SaveAs("c:\work\Price_"+Формат(ДатаФормированияПрайса,"ДФ=yyyy-MM-dd")+".xls",56);
Книга.Close();
Ексель.Quit();
КонецПроцедуры
МаксУровней = -1;
//ДатаФормированияПрайса = Дата(2011,11,1);
ДатаФормированияПрайса = ТекущаяДата();
No comments:
Post a Comment