Monday, November 28, 2011

Выгрузка прайс-лист из 1с8 в excel

// Обработка формирование прайс лист в 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);
ДатаФормированияПрайса = ТекущаяДата();

Добавление кнопок в Excel средствами 1с8

Exported from Notepad++
Попытка Ексель = Новый COMОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); Возврат; конецПопытки; Ексель.DisplayAlerts=Ложь; Ексель.Visible = ложь; Книга = Ексель.Workbooks.Add(); Лист = Книга.WorkSheets(1); Лист.Select(); Ексель.Application.ActiveWindow.SplitRow = 4; Ексель.Application.ActiveWindow.FreezePanes = 1; кнопка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 = "Показать все";